试图获取进程名称,但我得到十六进制而不是文本

时间:2017-08-06 15:05:46

标签: c++ c++11 visual-c++

这是我的代码(请忽略我的'尝试'声明,我知道......):

/\[color=(\#[0-9A-F]{6}|[a-z]+)\]([^[]*)\[\/color\]/

基本上我试图通过一个非常简单的'for'循环来检查所有进程ID,并获取那些存在的名称,但是我得到的内容是0D45FBA等等。

我尝试了很多东西,这段代码只是我尝试过的最后一件事没有成功,我正在寻求帮助。

还试图从UNICODE到Multi-Byte,反之亦然等等。

2 个答案:

答案 0 :(得分:0)

wchar_t *zGetName(DWORD kPid)内,您正在复制,然后返回指向字符串kPE32.szExeFile的指针,但kPE32是一个局部变量。它在函数结束后被丢弃,因此你有一个指向无效内存的指针。它指向随机垃圾就不足为奇了。

您需要将该字符串复制到新内存中,该内存在函数结束后保持有效,或者为函数提供目标内存以将其复制。

答案 1 :(得分:0)

基本上你有两个问题:

  1. 返回指向超出范围的局部变量的指针。
  2. 将宽字符串打印为窄字符串。
  3. 这可以满足您的需求。我将名称复制到std::wstring并将其返回,然后使用std::wcout打印结果。

    我使用Visual Studio 2015和2017社区版成功测试了它,没有任何问题。

    #include <Windows.h>
    #include <TlHelp32.h>
    
    #include <iostream>
    #include <iomanip>
    #include <string>
    
    std::wstring zGetName(DWORD kPid)
    {
        std::wstring ret;
    
        if (kPid)
        {
            PROCESSENTRY32W kPE32;
            kPE32.dwSize = sizeof(PROCESSENTRY32W);
            HANDLE kSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
            if (kSnap)
            {
                if (Process32FirstW(kSnap, &kPE32))
                {
                    do
                    {
                        if (kPE32.th32ProcessID == kPid)
                        {
                            ret = kPE32.szExeFile;
                            break;
                        }
                    }
                    while (Process32NextW(kSnap, &kPE32));
                }
                CloseHandle(kSnap);
            }
        }
        return ret;
    }
    
    int main()
    {
        for (DWORD kFirst = 0; kFirst < 10000; ++kFirst)
        {
            std::wstring kName = zGetName(kFirst);
            if (!kName.empty())
            {
                std::wcout << L"[" << std::setw(4) << kFirst << "] - " << kName << L"\n";
            }
        }
        return 0;
    }
    

    示例输出:

    [   4] - System
    [ 340] - winlogon.exe
    [ 368] - smss.exe
    [ 560] - svchost.exe
    [ 636] - csrss.exe
    [ 728] - wininit.exe
    [ 736] - csrss.exe
    [ 740] - conhost.exe