应用程序行为不同于差异机器和操作系统

时间:2014-11-08 04:40:50

标签: c windows winapi

我正在编写一个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, &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位应用程序。

1 个答案:

答案 0 :(得分:0)

这有点长时间阅读,但尝试...... this为初学者。

  

如果您在XP或更高版本上运行,建议的解决方法是从32位进程获取64位进程映像路径,是使用更新的GetProcessImageFileName获取路径(通过ProcessImageFileName(27)进程信息NtQueryInformationProcess类。 wow64层这次做的不多,因为它只是一个unicode字符串。但是这个函数有一个缺点 - 返回的路径是/ Device / HarddiskVolumeX形式,而不是DOS风格的基于驱动器号的路径。

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