您可以使用Toolhelp API枚舉進程,獲取其完整路徑並將其與所需的進程名稱進行比較。您需要遍歷每個進程的模塊列表。列表中的第一個模塊是進程可執行文件本身。下面是一個示例代碼:
int main(int argc, char* argv[])
{
if(argc > 1)
{
printf("\nGetting PID of: %s\n", argv[1]);
HANDLE hProcSnapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(INVALID_HANDLE_VALUE != hProcSnapshot)
{
PROCESSENTRY32 procEntry = {0};
procEntry.dwSize = sizeof(PROCESSENTRY32);
if(::Process32First(hProcSnapshot, &procEntry))
{
do
{
HANDLE hModSnapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, procEntry.th32ProcessID);
if(INVALID_HANDLE_VALUE != hModSnapshot)
{
MODULEENTRY32 modEntry = {0};
modEntry.dwSize = sizeof(MODULEENTRY32);
if(Module32First(hModSnapshot, &modEntry))
{
if(0 == stricmp(argv[1], modEntry.szExePath))
{
printf("\nPID: %ld\n", procEntry.th32ProcessID);
::CloseHandle(hModSnapshot);
break;
}
}
::CloseHandle(hModSnapshot);
}
}
while(::Process32Next(hProcSnapshot, &procEntry));
}
::CloseHandle(hProcSnapshot);
}
}
return 0;
}
謝謝,這正是我需要的。我已經看過'::'更多次了,是C++的東西嗎?現在我將嘗試使用Unicode名稱,例如中文。 – Lekensteyn 2010-11-14 11:03:27
稍作修改,適用於[所有進程](http://forum.sysinternals.com/listing-processes-and-finding-executable_topic6595_post26001.html#26001)。它現在也適用於特殊字符,如中文。爲了達到這個目的,系統必須是中文的,否則會顯示「?」。 – Lekensteyn 2010-11-14 14:24:07