这是我的代码(请忽略我的'尝试'声明,我知道......):
/\[color=(\#[0-9A-F]{6}|[a-z]+)\]([^[]*)\[\/color\]/
基本上我试图通过一个非常简单的'for'循环来检查所有进程ID,并获取那些存在的名称,但是我得到的内容是0D45FBA等等。
我尝试了很多东西,这段代码只是我尝试过的最后一件事没有成功,我正在寻求帮助。
还试图从UNICODE到Multi-Byte,反之亦然等等。
答案 0 :(得分:0)
在wchar_t *zGetName(DWORD kPid)
内,您正在复制,然后返回指向字符串kPE32.szExeFile
的指针,但kPE32
是一个局部变量。它在函数结束后被丢弃,因此你有一个指向无效内存的指针。它指向随机垃圾就不足为奇了。
您需要将该字符串复制到新内存中,该内存在函数结束后保持有效,或者为函数提供目标内存以将其复制。
答案 1 :(得分:0)
基本上你有两个问题:
这可以满足您的需求。我将名称复制到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