在线急等:知道了程序的可执行文件名?如何获得这个程序的进程句柄?

解决方案 »

  1.   

    HMODULE GetModuleHandle(
      LPCTSTR lpModuleName   // module name
    );
      

  2.   

    ToolHelp API enum processes to get the process's ID
    OpenProcess to get the process's handle.
      

  3.   

    难道HMODULE和handle to process一样
      

  4.   

    DWORD GetProcessIDByName(LPCTSTR lpName)
    {
    DWORD dwRet = 0;
    HANDLE hProcessSnap = NULL;
    PROCESSENTRY32 pe32 = {0};
    TCHAR szImagePath[MAX_PATH] = {0};
    hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
    if ( hProcessSnap == INVALID_HANDLE_VALUE )
    {
    return dwRet;
    }
    pe32.dwSize = sizeof( PROCESSENTRY32 );
    if( !Process32First( hProcessSnap, &pe32 ) )
    {
    CloseHandle( hProcessSnap );     // Must clean up the snapshot object!
    return dwRet;
    }
    do
    {
    //If Is System ProcessID Skip It.
    if ( pe32.th32ProcessID==0 || pe32.th32ProcessID==4 )
    {
    continue;
    }
    if (!lstrcmpi(lpName, pe32.szExeFile))
    {
    dwRet = pe32.th32ProcessID;
    break;
    }
    ZeroMemory(&szImagePath,sizeof(szImagePath));
    if ( GetProcessPathByID(pe32.th32ProcessID,szImagePath) )
    {
    if (!lstrcmpi(lpName, szImagePath))
    {
    dwRet = pe32.th32ProcessID;
    break;
    }
    }
    } while( Process32Next( hProcessSnap, &pe32 ) );

    // Don't forget to clean up the snapshot object!
    CloseHandle( hProcessSnap );

    return dwRet;
    }BOOL GetProcessPathByID(DWORD dwPID, LPTSTR lpOut)
    {
    BOOL bRet = FALSE;
    HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
    MODULEENTRY32 me32;

    // Take a snapshot of all modules in the specified process.
    hModuleSnap = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwPID );
    if( hModuleSnap == INVALID_HANDLE_VALUE )
    {
    return bRet;
    }

    // Set the size of the structure before using it.
    me32.dwSize = sizeof( MODULEENTRY32 );

    if( !Module32First( hModuleSnap, &me32 ) )
    {
    CloseHandle( hModuleSnap );     // Must clean up the snapshot object!
    return bRet;
    }
    lstrcpyn(lpOut, me32.szExePath ,MAX_PATH); // Don't forget to clean up the snapshot object.
    CloseHandle( hModuleSnap );
    return( TRUE );

    return bRet;
    }
      

  5.   

    HMODULE 可以强制转换成HINSTANCE,但是和process handle不一样
      

  6.   

    process handle只是一个HANDLE,在不知道这个程序是否已经运行的情况下枚举所有的进程是最简单的方法
      

  7.   

    /**可用MSDN中(我用的是2003版)介绍的性能监视中的一些函数,
    *这可以像任务管理器一样直接列出现在执行的进程,主要函数用到
    *   HANDLE WINAPI CreateToolhelp32Snapshot(
    *     DWORD dwFlags,
    *     DWORD th32ProcessID
    *    );
    *  用到的主要结构是: PROCESSENTRY32
    *  定义如下:
    *  typedef struct tagPROCESSENTRY32 { 
    *    DWORD dwSize; 
    *    DWORD cntUsage;
    *    DWORD th32ProcessID;
    *    ULONG_PTR th32DefaultHeapID;
    *    DWORD th32ModuleID;
    *    DWORD cntThreads;
    *    DWORD th32ParentProcessID;
    *    LONG pcPriClassBase;
    *    DWORD dwFlags;
    *    TCHAR szExeFile[MAX_PATH];
    *    } PROCESSENTRY32, *PPROCESSENTRY32;
    *  这个结构描述了当“快照”生成时,系统内进程的列表。
    */char TargetName[]="GameLogin.exe";   //要寻找进程的文件名
    HANDLE   Snapshot;            //内存进程的“快照”句柄//返回内存所有进程的快照。参数为TH32CS_SNAPPROCESS取有的进程,此时忽略参数2;
    Snapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);PROCESSENTRY32 processListStr;
    processListStr.dwSize=sizeof(PROCESSENTRY32);
    BOOL return_value;//下面的函数取快照中的第一个进程条目,成功返回一个TRUE,反之FALSE
    return_value=Process32First(Snapshot,&processListStr);//下面的部分把快照中所有找到的进程的ID保存在向量ProcessID中
    //这个ID就是我们在程序管理器的进程中看到的PID一列的数值
    std::vector<DWORD>  ProcessID;  
    while(return_value)
    {
    if( 0==(strcmp(TargetName,processListStr.szExeFile)) )
    {
    ProcessID.push_back(processListStr.th32ProcessID);
    }
    return_value=Process32Next(Snapshot,&processListStr);
    }/**下面可用函数HANDLE OpenProcess(
    *  DWORD dwDesiredAccess,
    *  BOOL bInheritHandle,
    *  DWORD dwProcessId
    *  );  用这个函数由PID得到进程句柄
    */
      for(std::vector<DWORD>::iterator it=ProcessID.begin();
    it!=ProcessID.end();++it)
    {
    if(*it)
    {
    HANDLE FindProcess;
    FindProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,*it);
    if(FindProcess)
                                         {
                                         //找到了进程句柄,这里加你的代码如下面的关掉进程
    //TerminateProcess(FindProcess,0);
                                         }
    }
    }//用以上的方法可以得到系统内的所有进程的句柄,可用来查看或进一步编程以达到其它目的。