我有一个像这样的函数来获取一个进程的id是它的名字,然而它总是返回0,我试着每一个进程:
DWORD GetProcessId(std::string ProcessName) { HANDLE hsnap; PROCESSENTRY32 pt; DWORD PiD; hsnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); pt.dwSize = sizeof(PROCESSENTRY32); do { if (!strcmp(pt.szExeFile, ProcessName.c_str())) { CloseHandle(hsnap); PiD = pt.th32ProcessID; return PiD; if (PiD != NULL) { return 0; } } } while (Process32Next(hsnap, &pt)); return 1; }
主要function:
int main() { DWORD pid = GetProcessId("calc.exe"); std::cout << pid; if (pid == 0) { printf("error 1"); getchar(); }//error return 0; }
这里有几个问题。
首先, GetProcessId
是一个Windows API函数的名称,它将一个HANDLE
作为参数。 HANDLE
通常被定义为void*
,所以这意味着任何指针都将满足函数签名。
你自己的GetProcessId
需要一个std::string
但是通过传递一个指向字符串常量的指针来调用它。 通常情况下,这样做可以, std::string
可以由此构造,但是因为GetProcessId
的Windows API版本已经匹配了编译器优先调用的函数签名。 所以基本上你自己的功能从来没有被实际调用过。
你自己的功能也有一些问题。 首先,通过循环的第一次迭代是与垃圾内存进行比较 – 您忘记调用Process32First
,所以pt
在第一次通过时是未初始化的。 其次,如果这个过程没有找到,你正在泄漏hsnap
句柄。
尝试以下操作:
DWORD MyGetProcessId(LPCTSTR ProcessName) // non-conflicting function name { PROCESSENTRY32 pt; HANDLE hsnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); pt.dwSize = sizeof(PROCESSENTRY32); if (Process32First(hsnap, &pt)) { // must call this first do { if (!lstrcmpi(pt.szExeFile, ProcessName)) { CloseHandle(hsnap); return pt.th32ProcessID; } } while (Process32Next(hsnap, &pt)); } CloseHandle(hsnap); // close handle on failure return 0; } int main() { DWORD pid = MyGetProcessId(TEXT("calc.exe")); std::cout << pid; if (pid == 0) { printf("error 1"); getchar(); }//error return 0; }
编辑:我已经改变了函数不再使用一个std::string
,并使用lstrcmpi
意味着它将作为一个Ansi或Unicode版本。 正如下面的评论员所建议的那样,现在你真的应该使用Unicode。
这里是C代码,在Windows上工作正常。 用进程名调用PID_GetProcessId,返回进程名的进程号
int PID_GetProcessId(char * name, PDWORD pid) { DWORD aProcesses[1024], cbNeeded, cProcesses; UINT32 i; if (!EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ) { //Error } /* Calculate how many process identifiers were returned. */ cProcesses = cbNeeded / sizeof(DWORD); /* Print the name and process identifier for each process. */ for ( i = 0; i < cProcesses; i++ ) { if( aProcesses[i] != 0 ) { if(PID_PrintProcessNameAndID( aProcesses[i], name ) == 1) { *pid = aProcesses[i]; break; } } } return 0; } int PID_PrintProcessNameAndID(DWORD processID,char * name) { char szProcessName[MAX_PATH]; HANDLE hProcess=NULL; char buff[200]=""; hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |PROCESS_VM_READ,FALSE, processID ); /* Get the process name. */ if (NULL != hProcess ) { HMODULE hMod; DWORD cbNeeded; if ( EnumProcessmodulees( hProcess, &hMod, sizeof(hMod), &cbNeeded) ) { GetmoduleeBaseNameA( hProcess, hMod, (LPSTR)szProcessName, sizeof(szProcessName)/sizeof(TCHAR) ); } } if(lstrcmpiA(szProcessName, name) == 0) { CloseHandle(hProcess); return 1; } return 0; CloseHandle( hProcess ); }