您可以使用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