GetProcessId 没有找到任何进程

GetProcessId doesn't find any process

我正在使用以下代码尝试获取 notepad.exe 的 PID,但找不到进程。

我目前 运行 在 Windows 10 上使用 VS Studio 19 作为版本 x64 进行编译。

也试图找到其他进程,如 chrome.execalculator.exe 等,但找不到任何东西。

DWORD GetProcessId(LPCTSTR ProcessName)
{
    PROCESSENTRY32 pt;
    HANDLE hsnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    std::wcout << "Error: " << GetLastError() << std::endl; // Error: 0
    pt.dwSize = sizeof(PROCESSENTRY32);

    std::wcout << "Error: " << GetLastError() << std::endl; // Error: 0

    if (Process32First(hsnap, &pt)) { // must call this first
        do {
            if (!lstrcmpi(pt.szExeFile, ProcessName)) {
                CloseHandle(hsnap);
                return pt.th32ProcessID;
            }
        } while (Process32Next(hsnap, &pt));
    }

    std::wcout << "Error: " << GetLastError() << std::endl; // Error: 24
    CloseHandle(hsnap); // close handle on failure
    return 0;
}



int _tmain(int argc, _TCHAR* argv[])
{

    DWORD processId;

    processId = GetProcessId(TEXT("notepad.exe"));
    std::wcout << "processId: " << processId << std::endl;
    return 0;

}

调试时,我看到代码跳过 do while 直接跳到 CloseHandle(hsnap)

GetLastError() returns 24 在这一行。

您发布的调试输出图像 window 显示 pt.dwSize 设置为 2168。这看起来不对。 pt.dwSize 很重要,它被 Windows 用于版本控制。

在我的电脑上sizeof(PROCESSENTRY32)556(这取决于Windows版本,我使用的是Windows 10)。如果项目不是 Unicode,大小应该大约是它的一半。在 VS 中,您可以右键单击 PROCESSENTRY32,它会将您带到这个定义:

typedef struct tagPROCESSENTRY32W
{
    DWORD   dwSize;
    DWORD   cntUsage;
    DWORD   th32ProcessID;          // this process
    ULONG_PTR th32DefaultHeapID;
    DWORD   th32ModuleID;           // associated exe
    DWORD   cntThreads;
    DWORD   th32ParentProcessID;    // this process's parent process
    LONG    pcPriClassBase;         // Base priority of process's threads
    DWORD   dwFlags;
    WCHAR   szExeFile[MAX_PATH];    // Path
} PROCESSENTRY32W;

MAX_PATH 应该是 260。我的猜测是您重新定义了 MAX_PATH 或者您在某处放置了错误的 #pragma 语句。或者有什么奇怪的事情发生了。尝试重新启动 Windows(使用重新启动而不是 shutdown/start)

此外,使用 PROCESSENTRY32 pt = {0}

将内存归零
PROCESSENTRY32 pt = { 0 };
pt.dwSize = sizeof(PROCESSENTRY32);
if (!Process32First(hsnap, &pt))
{
    DWORD err = GetLastError();
    std::cout << "Process32First failed\n";
    std::cout << pt.dwSize << " GetLastError : " << err << "\n";
    CloseHandle(hsnap);
    return DWORD(-1);
}

唯一预期的 GetLastErrorERROR_NO_MORE_FILES,如 Windows 文档中所示。如果错误是其他原因,则表示该功能已完全失败。

如果您的项目是 Unicode,考虑避免那些 T 宏。只需使用 GetProcessId(L"notepad.exe");LPCWSTR

Ps,我 运行 你的代码在我的电脑上没问题。唯一的区别是 sizeof(PROCESSENTRY32)