我正在编写一个Windows(MS)应用程序来获取活动窗口的进程名称。
在运行32位Windows XP Professional的台式PC上,应用程序按预期运行。但在具有64位Windows 7专业版操作系统的笔记本电脑上,无法按预期工作。对于某些进程,返回无效句柄。我在运行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位应用程序。
答案 0 :(得分:0)
这有点长时间阅读,但尝试...... this为初学者。
如果您在XP或更高版本上运行,建议的解决方法是从32位进程获取64位进程映像路径,是使用更新的GetProcessImageFileName获取路径(通过ProcessImageFileName(27)进程信息NtQueryInformationProcess类。 wow64层这次做的不多,因为它只是一个unicode字符串。但是这个函数有一个缺点 - 返回的路径是/ Device / HarddiskVolumeX形式,而不是DOS风格的基于驱动器号的路径。
注意一个错误是如何试图告诉您只有32位的64位地址被复制到指针中。这篇文章比我更好地描述了它。