我正在编写Windows(MS)应用程序,以获取活动窗口的进程名称。
在运行32位Windows XP Professional的台式PC上,应用程序将按预期运行。但是,在具有64位Windows 7 Professional OS的便携式计算机上,该计算机无法正常工作。对于某些进程,将返回无效的句柄。在运行Windows 8.1 64位的超级本上,我得到相同的结果。
相关代码段如下:
DWORD dwThreadID, dwProcessID;
GUITHREADINFO gti;
HANDLE hProcess;
char szProcessFileName[MAX_PATH] = {0};
gti.cbSize = sizeof(GUITHREADINFO);
GetGUIThreadInfo(0, >i);
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操作系统的应用程序运行,如上文所述,对于某些工艺OpenProcess
和GetModuleFileNameEx
失败。GetModuleFileNameEx
通常会因ERROR_PARTIAL_COPY(错误代码:299)或ERROR_INVALID_PARAMETER(错误代码:87)而OpenProcess
失败,而由于ERROR_INVALID_HANDLE(错误代码:6)而失败。
不知道发生了什么。任何帮助是极大的赞赏。我想知道这是否与用户权限有关。
源代码在运行Windows 7 Pro x64的64位计算机上被编译为32位应用程序。
这是一个很长的阅读,但尝试...这对于初学者。
如果您在XP或更高版本上运行,从32位进程获取64位进程映像路径的建议解决方法是使用较新的GetProcessImageFileName,它获取路径(通过NtQueryInformationProcess的ProcessImageFileName(27)进程信息类) )。这次wow64层没有做太多事情,因为它只是一个unicode字符串。但是,此函数有一个缺点–返回的路径的格式为/ Device / HarddiskVolumeX,而不是基于DOS样式驱动器号的路径。
请注意一个错误是如何试图告诉您一个64位地址中只有32位被复制到您的指针中。这篇文章比我能更好地描述它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句