【问题标题】:szExeFile in PROCESSENTERY32 stucture gives a weird valuePROCESSENTERY32 结构中的 szExeFile 给出了一个奇怪的值
【发布时间】:2016-06-13 10:24:23
【问题描述】:

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

【问题讨论】:

    标签: c++ visual-studio winapi visual-c++ process


    【解决方案1】:

    您已在项目设置中定义了UNICODE/_UNICODEPROCESSENTRY32 结构中的TCHAR 数组因此扩展为wchar_t 数组。 cout 没有采用 const wchar_t* 的重载,因此它使用通用指针实现,并显示指针值。

    您应该改用std::wcout

    注意:虽然可以调用 ANSI 版本的 API,但保留这些 API 只是为了与 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));
    }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 谢谢。分为2个操作wcout和cout
      • Process32First 扩展为 Process32FirstW,如果定义了 UNICODE 预处理器符号(UNICODE 符号控制 Windows API,_UNICODE 符号控制 CRT)。没有名为Process32FirstA 的符号,因此您不能调用它(无论如何这都是个坏主意)。
      猜你喜欢
      • 2013-12-19
      • 1970-01-01
      • 2018-12-30
      • 2021-08-13
      • 1970-01-01
      • 2017-02-02
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      相关资源
      最近更新 更多