[英]C++ Can't get process id (windows)
我有一個像這樣的函數來獲取進程'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;
}
主要功能:
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,返回進程名稱的進程ID
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 ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) )
{
GetModuleBaseNameA( hProcess, hMod, (LPSTR)szProcessName, sizeof(szProcessName)/sizeof(TCHAR) );
}
}
if(lstrcmpiA(szProcessName, name) == 0)
{
CloseHandle(hProcess);
return 1;
}
return 0;
CloseHandle( hProcess );
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.