gpt4 book ai didi

C++ 无法获取进程 ID (windows)

转载 作者:可可西里 更新时间:2023-11-01 14:42:39 25 4
gpt4 key购买 nike

我有一个这样的函数来通过它的名称获取进程的 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++ 无法获取进程 ID (windows),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31147690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com