Check if process is running on XP or Windows 7 (single API)

Hi Experts,

I'm looking for a win32 call (for C++ apps) that can check if certain processes are running by name.  I don't want to have to do conditional compilation if possible, based on library that needs to be present for the operating system.  Is there a single API that will work for both XP and Windows 7 to do this?

Thanks!
Mike
LVL 1
threadyAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

sarabandeCommented:
the api to get the names of running processes is

- EnumProcesses
- OpenProcess
- EnumProcessModules
- GetModulBaseName

the EnumProcesses would call a callback function you provided for each process running.
you would get an ID that could be used by OpenProcess with mode PROCESS_QUERY_INFORMATION. then call EnumProcessModules to get a handle to the  module of the process and GetModulBaseName to get the process name.

see http://msdn.microsoft.com/en-us/library/windows/desktop/ms682623(v=vs.85).aspx for a sample program.

Sara
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
threadyAuthor Commented:
Yep, looks good.  Although I haven't check this much, this looks pretty good to load the correct library depending on the operating system:

//   0   = Process was not found
//   1   = Process was found
//   605 = Unable to search for process
//   606 = Unable to identify system type
//   607 = Unsupported OS
//   632 = Process name is invalid
int CProcessLauncher::FindProcByName(string sProcessName)
{
      BOOL bResult,bResultm;
      DWORD aiPID[1000],iCb=1000,iNumProc,iV2000=0;
      DWORD iCbneeded,i;
      char szName[MAX_PATH],szToFindUpper[MAX_PATH];
      HANDLE hProc,hSnapShot,hSnapShotm;
      OSVERSIONINFO osvi;
      HINSTANCE hInstLib;
      int iLen,iLenP,indx;
      HMODULE hMod;
      PROCESSENTRY32 procentry;      
      MODULEENTRY32 modentry;

      // PSAPI Function Pointers.
      BOOL (WINAPI *lpfEnumProcesses)( DWORD *, DWORD cb, DWORD * );
      BOOL (WINAPI *lpfEnumProcessModules)( HANDLE, HMODULE *, DWORD, LPDWORD );
      DWORD (WINAPI *lpfGetModuleBaseName)( HANDLE, HMODULE, LPTSTR, DWORD );

      // ToolHelp Function Pointers.
      HANDLE (WINAPI *lpfCreateToolhelp32Snapshot)(DWORD,DWORD) ;
      BOOL (WINAPI *lpfProcess32First)(HANDLE,LPPROCESSENTRY32) ;
      BOOL (WINAPI *lpfProcess32Next)(HANDLE,LPPROCESSENTRY32) ;
      BOOL (WINAPI *lpfModule32First)(HANDLE,LPMODULEENTRY32) ;
      BOOL (WINAPI *lpfModule32Next)(HANDLE,LPMODULEENTRY32) ;

      // Transfer Process name into "szToFindUpper" and
      // convert it to upper case
      iLenP=strlen(sProcessName.c_str());
      if(iLenP<1 || iLenP>MAX_PATH) return 632;
      for(indx=0;indx<iLenP;indx++)
            szToFindUpper[indx]=toupper(sProcessName[indx]);
      szToFindUpper[iLenP]=0;

      // First check what version of Windows we're in
      osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
      bResult=GetVersionEx(&osvi);
      if(!bResult)     // Unable to identify system version
            return 606;

      // At Present we only support Win/NT/2000 or Win/9x/ME
      if((osvi.dwPlatformId != VER_PLATFORM_WIN32_NT) &&
            (osvi.dwPlatformId != VER_PLATFORM_WIN32_WINDOWS))
            return 607;

      if(osvi.dwPlatformId==VER_PLATFORM_WIN32_NT)
      {
            // Win/NT or 2000 or XP

            // Load library and get the procedures explicitly. We do
            // this so that we don't have to worry about modules using
            // this code failing to load under Windows 95, because
            // it can't resolve references to the PSAPI.DLL.
            hInstLib = LoadLibraryA("PSAPI.DLL");
            if(hInstLib == NULL)
                  return 605;

            // Get procedure addresses.
            lpfEnumProcesses = (BOOL(WINAPI *)(DWORD *,DWORD,DWORD*))
                  GetProcAddress( hInstLib, "EnumProcesses" ) ;
            lpfEnumProcessModules = (BOOL(WINAPI *)(HANDLE, HMODULE *,
                  DWORD, LPDWORD)) GetProcAddress( hInstLib,
                  "EnumProcessModules" ) ;
            lpfGetModuleBaseName =(DWORD (WINAPI *)(HANDLE, HMODULE,
                  LPTSTR, DWORD )) GetProcAddress( hInstLib,
                  "GetModuleBaseNameA" ) ;

            if( lpfEnumProcesses == NULL ||
                  lpfEnumProcessModules == NULL ||
                  lpfGetModuleBaseName == NULL)
            {
                  FreeLibrary(hInstLib);
                  return 605;
            }

            bResult=lpfEnumProcesses(aiPID,iCb,&iCbneeded);
            if(!bResult)
            {
                  // Unable to get process list, EnumProcesses failed
                  FreeLibrary(hInstLib);
                  return 605;
            }

            // How many processes are there?
            iNumProc=iCbneeded/sizeof(DWORD);

            // Get and match the name of each process
            for(i=0;i<iNumProc;i++)
            {
                  // Get the (module) name for this process

                  strcpy(szName,"Unknown");
                  // First, get a handle to the process
                  hProc=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,
                        aiPID[i]);
                  // Now, get the process name
                  if(hProc)
                  {
                        if(lpfEnumProcessModules(hProc,&hMod,sizeof(hMod),&iCbneeded) )
                        {
                              iLen=lpfGetModuleBaseName(hProc,hMod,szName,MAX_PATH);
                        }
                  }
                  CloseHandle(hProc);
                  // Match regardless of lower or upper case
                  if(strcmp(_strupr(szName),szToFindUpper)==0)
                  {
                        // Process found
                        FreeLibrary(hInstLib);
                        return 1;
                  }
            }
      }

      if(osvi.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS)
      {
            // Win/95 or 98 or ME

            hInstLib = LoadLibraryA("Kernel32.DLL");
            if( hInstLib == NULL )
                  return FALSE ;

            // Get procedure addresses.
            // We are linking to these functions of Kernel32
            // explicitly, because otherwise a module using
            // this code would fail to load under Windows NT,
            // which does not have the Toolhelp32
            // functions in the Kernel 32.
            lpfCreateToolhelp32Snapshot=
                  (HANDLE(WINAPI *)(DWORD,DWORD))
                  GetProcAddress( hInstLib,
                  "CreateToolhelp32Snapshot" ) ;
            lpfProcess32First=
                  (BOOL(WINAPI *)(HANDLE,LPPROCESSENTRY32))
                  GetProcAddress( hInstLib, "Process32First" ) ;
            lpfProcess32Next=
                  (BOOL(WINAPI *)(HANDLE,LPPROCESSENTRY32))
                  GetProcAddress( hInstLib, "Process32Next" ) ;
            lpfModule32First=
                  (BOOL(WINAPI *)(HANDLE,LPMODULEENTRY32))
                  GetProcAddress( hInstLib, "Module32First" ) ;
            lpfModule32Next=
                  (BOOL(WINAPI *)(HANDLE,LPMODULEENTRY32))
                  GetProcAddress( hInstLib, "Module32Next" ) ;
            if( lpfProcess32Next == NULL ||
                  lpfProcess32First == NULL ||
                  lpfModule32Next == NULL ||
                  lpfModule32First == NULL ||
                  lpfCreateToolhelp32Snapshot == NULL )
            {
                  FreeLibrary(hInstLib);
                  return 605;
            }

            // The Process32.. and Module32.. routines return names in all uppercase

            // Get a handle to a Toolhelp snapshot of all the systems processes.

            hSnapShot = lpfCreateToolhelp32Snapshot(
                  TH32CS_SNAPPROCESS, 0 ) ;
            if( hSnapShot == INVALID_HANDLE_VALUE )
            {
                  FreeLibrary(hInstLib);
                  return 605;
            }

            // Get the first process' information.
            procentry.dwSize = sizeof(PROCESSENTRY32);
            bResult=lpfProcess32First(hSnapShot,&procentry);

            // While there are processes, keep looping and checking.
            while(bResult)
            {
                  // Get a handle to a Toolhelp snapshot of this process.
                  hSnapShotm = lpfCreateToolhelp32Snapshot(
                        TH32CS_SNAPMODULE, procentry.th32ProcessID) ;
                  if( hSnapShotm == INVALID_HANDLE_VALUE )
                  {
                        CloseHandle(hSnapShot);
                        FreeLibrary(hInstLib);
                        return 605;
                  }
                  // Get the module list for this process
                  modentry.dwSize=sizeof(MODULEENTRY32);
                  bResultm=lpfModule32First(hSnapShotm,&modentry);

                  // While there are modules, keep looping and checking
                  while(bResultm)
                  {
                        if(strcmp(modentry.szModule,szToFindUpper)==0)
                        {
                              // Process found
                              CloseHandle(hSnapShotm);
                              CloseHandle(hSnapShot);
                              FreeLibrary(hInstLib);
                              return 1;
                        }
                        else
                        {  // Look for next modules for this process
                              modentry.dwSize=sizeof(MODULEENTRY32);
                              bResultm=lpfModule32Next(hSnapShotm,&modentry);
                        }
                  }

                  //Keep looking
                  CloseHandle(hSnapShotm);
                  procentry.dwSize = sizeof(PROCESSENTRY32);
                  bResult = lpfProcess32Next(hSnapShot,&procentry);
            }
            CloseHandle(hSnapShot);
      }
      FreeLibrary(hInstLib);
      return 0;

}
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
C++

From novice to tech pro — start learning today.