Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Kill Running Project Process Add-In

0.00/5 (No votes)
24 Jun 2004 1  
Killing a running project process within Visual Studio

Introduction

How many times have you been in the situation, during development, you had to kill the current project process for any reason (infinite loops, crazy threads, a wrong return value and so on) ? It happens continuously, I guess.

What to do then? I always have the Task Manager minimized to the System Tray and when I need to kill the project process I click it up, scrolling the tasks list, found mine end kill it. Too much time wasted! ... :)

So it came to my mind to simplify the killing procedure, making it as fastest as possible: Why not having a button in the IDE to do the job for us? An Add-In would help. So here it is.

Background

To understand the source code, it is just needed to read any other Add-in article in this CodeProject section.

The code

The DevStudio Add-Ins Wizard does the main job for us to crate an Add-In, in fact the code you have to implement is simply the one relative to what the Add-In you're creating stands for: in this case killing the active project running process.

The method to implement is ICommand::KillProcessCommandMethod()

STDMETHODIMP CCommands::KillProcessCommandMethod() 
{
  
  AFX_MANAGE_STATE(AfxGetStaticModuleState());

  // Let's simplify the conversion work between OLE 

  // strings and C strings ...

  USES_CONVERSION;
  
  CComPtr<IDispatch> iDisp=NULL;
  
  // Obtain the IDispatch pointer

  m_pApplication->get_ActiveProject(&iDisp);
  
  // Obtain the IGenericProject interface through the IDispatch interface

  CComQIPtr<IGenericProject, &__uuidof(IGenericProject)> pProject(iDisp);
  
  // Is there any active project? If there's none, get out gracefully

  if(pProject == NULL)
    return S_OK;
  
  // Prepare the project name string

  CComBSTR bstrName=NULL;
  
  // Obtain the name of the project

  pProject->get_Name(&bstrName);
  
  // We suppose that the name of the executable is the same 

  // as the project one, with an appended '.exe' extension.

  bstrName+=".exe";
  
  
  // We need to make some logic on the executable name now...

  
  // Convert an OLE string to a C constant string pointer 

  LPCTSTR stringa = OLE2T(bstrName);
  
  // Let's make our string editable

  LPSTR str = (LPSTR)stringa;
  
  // We need to know how long is the name of the 

  // executable because in the running process list

  // only 15 characters are reported, every character 

  // over the 15th is truncated:

  // i.e. 'MyApplication.exe'  is reported as 'MyApplication.e' and so on.

  
  int len = strlen(str);
  
  // Let's make some logic and if the length of the name is over 15, 

  // let's put NULLs on the extra characters.

  // This is needed because once we obtain the running process list, 

  // we will iterate on it and find the process to kill on a 

  // strcmp name basis.

  
  if(len > 15)
  {
    for(int i = 15; i < len; i++)
      if(*(str + i)!=NULL)
        *(str + i) = NULL;
  }
  
  
  // Let's take a snapshot of the running process list

  
  HANDLE hSnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
  
  // Prepare the struct to contains every process information

  
  PROCESSENTRY32* processInfo=new PROCESSENTRY32;
  processInfo->dwSize=sizeof(PROCESSENTRY32);

  DWORD processID = 0;
  BOOL bFound = FALSE;
  
  // Iterate through processes to find ours...

  
  while(Process32Next(hSnapShot,processInfo)!=FALSE)
  {
    // store the Process ID

    processID = processInfo->th32ProcessID;
    
    // Is this our running process to kill?

    if(strcmp(processInfo->szExeFile,str) == 0)
    {
      bFound = TRUE;
      break;
    }
  }

  CloseHandle(hSnapShot);
  
  if(bFound)
  {
    // Obtain the Process handle....

    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,TRUE,processID);
    
    // and Kill it

    if(hProcess != NULL)
      TerminateProcess(hProcess,0);

  }

  return S_OK;
}

Hints

Remember to include in StdAfx.h the following header files:

#include <comdef.h>

#include <winbase.h>

#include <tlhelp32.h>

Copy the KillProcess.dll in the <Visual Studio Install Dir>\Common\MSDev98\Addins folder

Limitations

As stated in the code comments, we forced the name of the executable to be the same as the project one, plus an '.exe' extension.
this is not very portable. I tried to find through the IConfiguration interface or IBuildProject interface to obtain the name of the executable to be produced but maybe I followed the wrong way. If you have any hint or comment are always welcome. Thanks. Fabio

History

  • 24 June 2004 v1.0

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here