#include <windows.h>
#include <tlhelp32.h>
#include <iostream>
using namespace std;
void GetProcId();
DWORD ProcId = 0;
int main()
{
GetProcId();
printf("%d", ProcId);
cin.get();
return 0;
}
void GetProcId()
{
PROCESSENTRY32 pe32;
HANDLE hSnapshot = NULL;
pe32.dwSize = sizeof( PROCESSENTRY32 );
hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
if( Process32First( hSnapshot, &pe32 ) )
{
do{
if( strcmp( pe32.szExeFile, "s.exe" ) == 0 )
break;
}while( Process32Next( hSnapshot, &pe32 ) );
}
if( hSnapshot != INVALID_HANDLE_VALUE )
CloseHandle( hSnapshot );
ProcId = pe32.th32ProcessID;
}
有效,但是当进程"s.exe"未打开时,它会获取自己的进程ID,我真的不太确定如何解决此问题。帮助将不胜感激,谢谢!
这段代码:
do{
if( strcmp( pe32.szExeFile, "s.exe" ) == 0 )
break;
}while( Process32Next( hSnapshot, &pe32 ) );
将循环访问所有进程,直到找到 s.exe 或 Process32Next
返回 false。在后一种情况下,似乎没有定义pe32
的状态。它可能会保持不变,并参考列表中的最后一个过程,但我不愿意为此投入资金。
然后后来
ProcId = pe32.th32ProcessID;
将使用pe32
的进程 ID,无论它是否有效。
我建议进行以下修改:
DWORD GetProcId() // now returns the process ID. Why mess around with globals?
{
PROCESSENTRY32 pe32;
HANDLE hSnapshot = NULL;
DWORD pid = 0; // initialize to impossible pid
pe32.dwSize = sizeof( PROCESSENTRY32 );
hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
// should probably check for hSnapshot != INVALID_HANDLE_VALUE right about here
if( Process32First( hSnapshot, &pe32 ) )
{
do{
if( strcmp( pe32.szExeFile, "s.exe" ) == 0 )
{
pid = pe32.th32ProcessID;
break;
}
}while( Process32Next( hSnapshot, &pe32 ) );
}
if( hSnapshot != INVALID_HANDLE_VALUE )
CloseHandle( hSnapshot );
return pid;
}
选择零是因为您无法在 Windows 中获得零 pid。
用法:
int main()
{
cout << GetProcId();
return 0;
}