【发布时间】:2018-11-15 10:42:34
【问题描述】:
这个 api 有问题。我已经检查了返回功能。没有错误。但什么也不输出。
HANDLE hSnapProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
PROCESSENTRY32 process;
process.dwSize = sizeof(PROCESSENTRY32);
Process32First(hSnapProcess, &process);
do
{
if (process.th32ProcessID != 0)
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, process.th32ProcessID);
if (hProcess != NULL)
{
wchar_t filePath[MAX_PATH];
if (!GetModuleFileNameExW(hProcess, NULL, filePath, MAX_PATH))
{
std::wcout << filePath << std::endl;
}
}
CloseHandle(hProcess);
}
} while (Process32Next(hSnapProcess, &process));
CloseHandle(hSnapProcess);
【问题讨论】:
-
我很困惑。代码完全按照它应该做的:如果
GetModuleFileNameExW成功则不输出任何内容,如果失败则转储未初始化变量的内容。为什么您希望将任何内容写入控制台? -
@IInspectable 它只是为了检查它是否输出以供以后使用。顺便问一下,你的意思是未初始化的变量?
-
@jab:不,它是未初始化的。此 API 不对失败时的输出参数做出任何保证。如果您想知道,请调用
GetModuleFileNameExW传递nullptr作为进程句柄。 -
@IInspectable 是的,你当然是对的,我错误地认为
filePath是std::string,但它显然必须是LPWSTR。正在删除评论。 -
要检索远程进程的主要可执行模块的名称,请使用
GetProcessImageFileName或QueryFullProcessImageName函数。这比使用 NULL 模块句柄调用GetModuleFileNameEx函数更有效、更可靠。
标签: c++ windows visual-studio winapi