2014-11-08 54 views
0

我在寫一個Windows(MS)應用程序以獲取活動窗口的進程的名稱。不同的機器和操作系統的應用程序行爲不同

在運行32位Windows XP Professional的臺式PC上,應用程序按預期運行。但是在配備64位Windows 7 Professional操作系統的筆記本電腦上,該功能無法按預期工作。對於某些進程,返回無效句柄。在運行Windows 8.1 64位的ultrabook上,我獲得了相同的結果。

相關的代碼片段如下:

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位應用程序。

回答

0

這是一個很長的閱讀,但嘗試... this初學者。

如果在XP或以上運行時,建議的解決方法,以獲得在從32位處理的64位處理圖像路徑,是使用(較新GetProcessImageFileName它獲取的路徑(經由ProcessImageFileName 27 )進程信息類的NtQueryInformationProcess)。 wow64層這次做的不多,因爲它只是一個unicode字符串。然而這個函數有一個缺點 - 返回的路徑是/ Device/HarddiskVolumeX而不是基於DOS風格的驅動器盤符的路徑。

請注意,一個錯誤是如何告訴你,只有32位的64位地址被複制到你的指針。這篇文章比我能描述得更好。

+0

re paths:我注意到用'GetProcessImageFileName' – XerZetZip 2014-11-08 04:56:11

+0

是的,它試圖告訴你,它只將64位地址的一半複製到該32位存儲區。有關詳細信息,請參閱上面的文章鏈接「this」。 – 2014-11-08 05:25:52

相關問題