gpt4 book ai didi

c - 不同机器和操作系统上的应用程序行为有所不同

转载 作者:行者123 更新时间:2023-11-30 17:26:23 25 4
gpt4 key购买 nike

我正在编写一个Windows(MS)应用程序来获取事件窗口的进程名称。

在运行 32 位 Windows XP Professional 的台式电脑上,应用程序按预期运行。但在装有 64 位 Windows 7 Professional 操作系统的笔记本电脑上,它无法按预期工作。对于某些进程,会返回无效句柄。我在运行 Windows 8.1 64 位的 super 本上得到了相同的结果。

相关代码片段如下:

DWORD dwThreadID, dwProcessID;
GUITHREADINFO gti;
HANDLE hProcess;
char szProcessFileName[MAX_PATH] = {0};

gti.cbSize = sizeof(GUITHREADINFO);

GetGUIThreadInfo(0, &gti);

dwThreadID = GetWindowThreadProcessId(gti.hwndActive, &dwProcessID);
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessID);

// Get the name of the process (no error checking for brevity)
GetModuleFileNameEx(hProcess, NULL, szProcessFileName, MAX_PATH);

当应用程序在非 Windows XP 操作系统中运行时,如上所述,对于某些进程,OpenProcessGetModuleFileNameEx 会失败。 GetModuleFileNameEx 通常会因 ERROR_PARTIAL_COPY(错误代码:299)或 ERROR_INVALID_PARAMETER(错误代码:87)而失败,而 OpenProcess 通常会因 ERROR_INVALID_HANDLE(错误代码:6)而失败

不知道发生了什么。任何帮助是极大的赞赏。我想知道这是否与用户权限有关。

源代码在运行 Windows 7 Pro x64 的 64 位计算机上编译为 32 位应用程序。

最佳答案

读起来有点长,但请尝试... this首先。

If you are running on XP or above, the recommended workaround to get at the 64-bit process image path from a 32-bit process, is to use the newer GetProcessImageFileName which gets the path (via ProcessImageFileName (27) process information class of NtQueryInformationProcess). The wow64 layer does not do much this time because it is just a unicode string. However this function has a downside – the path returned is of the form /Device/HarddiskVolumeX instead of DOS style drive letter based paths.

请注意一个错误是如何试图告诉您 64 位地址中只有 32 位被复制到您的指针中。这篇文章比我描述得更好。

关于c - 不同机器和操作系统上的应用程序行为有所不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26813833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com