#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;
}
工作,但当进程&#34; s.exe&#34;没有打开它抓住自己的进程ID,我真的不太确定如何解决这个问题。 非常感谢帮助,谢谢!
答案 0 :(得分:0)
这段代码:
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;
}
Zero selected because you can't get a pid of zero in Windows.
用法:
int main()
{
cout << GetProcId();
return 0;
}