2015-11-03 21 views
0

我想打一個程序,獲取創建一個開放的窗口程序的名稱:GetModuleFileNameEx失敗

#include <iostream> 
using namespace std; 
#include <windows.h> 
#include <Psapi.h> 
#pragma comment(lib, "Psapi.lib") 


int main() 
{ 
    system("color 1f"); 

    DWORD dwProcessId; 
    DWORD dwThreadId ; 

    while(1) 
    { 
     Sleep(2000); 
     HWND hForg = GetForegroundWindow(); 
     dwThreadId = GetWindowThreadProcessId(hForg, &dwProcessId); 
     //cout << "Thread Id: " << dwThreadId << endl; 
     //cout << "Process Id: " << dwProcessId << endl; 

     DWORD dwDesiredAccess = PROCESS_QUERY_INFORMATION | PROCESS_VM_READ; 
     bool bInheritHandle = false; 
     HANDLE hProcess = OpenProcess(dwDesiredAccess, 
             bInheritHandle, dwProcessId); 
     if(INVALID_HANDLE_VALUE == hProcess) 
      cout << "Failed to open process!" << endl; 
     HMODULE hMod = (HMODULE)GetWindowLongPtr(hForg, GWLP_HINSTANCE); 
     if(!hMod) 
      cout << "Null Module!" << endl; 
     char szModFileName[MAX_PATH]; 

     GetModuleFileNameEx(hProcess, (HMODULE)hMod, szModFileName, MAX_PATH); 
     char szWindowName[MAX_PATH]; 
     GetWindowText(hForg, szWindowName, MAX_PATH); 
     cout << "Window Name: " << szWindowName << endl; 
     cout << "Created by: " << szModFileName << endl << endl; 
    } 


     cout << endl << endl << endl; 
     return 0; 
} 

,當我運行程序它的工作原理,但它永遠不會檢索程序的名稱,而是它檢索visual C++程序的名稱??? !!! 任何人都可以編輯或幫助我的代碼。 thnx

+1

如果進程或模塊句柄爲NULL,爲什麼你的代碼繼續進行,就像沒有錯誤一樣?另外,如果您還沒有這樣做,請在Visual Studio之外運行。 – PaulMcKenzie

回答

0

INVALID_HANDLE_VALUE定義爲-1,而OpenProcess在函數失敗時返回NULL。我不知道GetModuleFileNameEx如果給定NULL進程句柄會執行什麼操作,但是如果HMODULE爲NULL,則返回當前可執行文件的名稱,以便對其他無效輸入執行此操作。

根據GetModuleFileNameEx的MSDN文檔,獲取進程的可執行文件名的推薦方法是調用GetProcessImageFileName而不是GetModuleFileNameEx。您必須首先使用OpenProcess來解決您的問題。

+0

謝謝你我會試試 – Raindrop7

+0

thnx很多「1201ProgramAlarm」很棒!我用它,得到我想要的。另一個最後一個問題:如果我寫cout << hProcess << endl;我看到遞增的地址值,例如:0x00000060 0x00000064 ...我認爲beacuase我忘了關閉句柄hProcess。所以如果我不像我的情況那樣關閉,這是否意味着「內存泄漏」?如果是這樣OpenProcess()在堆上分配內存? thanx – Raindrop7

+0

@KokuVanish'OpenProcess'是一個windows函數,所以它會分配內存和其他資源,而不依賴於你的程序。它返回的是它正在使用的資源句柄(類似於索引)。您需要關閉句柄,以便可以釋放這些資源。如果你不這樣做,它最終將耗盡資源句柄,並且各種奇怪的東西將會開始發生。 – 1201ProgramAlarm