PROCESSENTERY32 结构中的 szExeFile 给出了一个奇怪的值

Aϟϟ*_*RIX 0 c++ winapi process visual-studio visual-c++

我尝试列出当前正在运行的进程的所有名称和 ID 当我尝试计算进程的 szExeFile 时,我得到了一些奇怪的结果。这是我得到的:

Process name: 005BF3EC and id: 0
Process name: 005BF3EC and id: 4
Process name: 005BF3EC and id: 392
Process name: 005BF3EC and id: 508
Process name: 005BF3EC and id: 588
Process name: 005BF3EC and id: 596
Process name: 005BF3EC and id: 648
Process name: 005BF3EC and id: 684
Run Code Online (Sandbox Code Playgroud)

这是代码:

HANDLE ProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);  
        PROCESSENTRY32 pe = {0};
        pe.dwSize = sizeof(PROCESSENTRY32);



        if (ProcSnap == INVALID_HANDLE_VALUE) {
            cout << "Can't make a snapshot" << endl;
        }


        Process32First(ProcSnap, &pe);
        do {

            cout << "Process name: " <<pe.szExeFile<< " and id: " << pe.th32ProcessID << endl;


        } while (Process32Next(ProcSnap, &pe));
Run Code Online (Sandbox Code Playgroud)

IIn*_*ble 5

您已在项目设置中定义了UNICODE/ _UNICODE。的TCHAR在阵列PROCESSENTRY32因此结构膨胀到wchar_t阵列。没有重载couta const wchar_t*,因此它使用通用指针实现,并显示指针值。

你应该std::wcout改用。

注意:虽然可以调用 API 的 ANSI 版本,但保留这些只是为了与 Win9x 兼容。它们执行有损转换,从 ANSI 到 Unicode(反之亦然),并且浪费资源。除非有真正的理由调用 ANSI 版本,否则不要调用。

固定代码:

HANDLE ProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);  
if (ProcSnap == INVALID_HANDLE_VALUE) {
    wcout << L"Can't make a snapshot" << endl;
}

PROCESSENTRY32W pe = {0};
pe.dwSize = sizeof(pe);
if (Process32FirstW(ProcSnap, &pe)) {
    do {
        wcout << L"Process name: " << pe.szExeFile
              << L" and id: " << pe.th32ProcessID << endl;
    } while (Process32NextW(ProcSnap, &pe));
}
Run Code Online (Sandbox Code Playgroud)