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

szExeFile in PROCESSENTERY32 stucture gives a weird value

本文关键字:一个 结构 PROCESSENTERY32 szExeFile      更新时间:2023-10-16

>Wen 我尝试列出当前正在运行的进程的所有名称和 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

这是代码:

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));

您已在项目设置中定义了UNICODE/_UNICODE。因此,PROCESSENTRY32结构中的TCHAR数组将扩展到wchar_t数组。对于cout没有重载,它需要一个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));
}

std::cout不是为打印wchar_t*字符串而设计的,而是使用 std::wcout ,或者不使用项目中的多字节和 Unicode 字符串。此外,混合std::wcoutstd::cout是非法的。

如果要在此代码节中使用ANSI版本的函数,请在名称中添加后缀A,例如,如果_UNICODE定义为Process32FirstW,编译器将更改Process32First,但可以直接调用Process32FirstA

相关文章: