C++无法获取进程ID(窗口)

Nul*_*ptr 3 c++ windows winapi process

我有一个像这样的函数来获取进程'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;
}
Run Code Online (Sandbox Code Playgroud)

主要功能:

int main()
{
DWORD pid = GetProcessId("calc.exe");
std::cout << pid;
if (pid == 0) { printf("error 1"); getchar(); }//error
return 0;
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*ter 8

这里有几个问题.

首先,GetProcessId是Windows API函数的名称,它将单个HANDLE作为参数.HANDLE通常被定义为void*,所以这意味着任何指针都将满足函数签名.

你自己GetProcessId需要一个,std::string但你通过传递一个指向字符串常量的指针来调用它.通常情况下这是可以的,std::string可以从中构建,但是因为Windows API版本GetProcessId已经匹配了编译器优先调用的函数签名.所以基本上你自己的函数实际上从未被调用.

你自己的功能也存在一些问题.首先,你通过循环的第一次迭代是与垃圾记忆进行比较 - 你忘了打电话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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:我已经将函数更改为不再使用std::string,并且使用lstrcmpi它意味着它将用作Ansi或Unicode构建.正如下面的评论员所建议的,这些天你真的应该使用Unicode.