2010-07-29 65 views
0

我想要獲得從DLL加載DLL的過程的句柄。我調用EnumWindows(EnumWindowsProc,NULL);我的方法是:在DLL_PROCESS_ATTACH中調用 如何獲得一個DLL加載過程句柄

我EnumWindowsProc實現如下:

BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) { 
    if(GetCurrentProcessId() == GetWindowThreadProcessId(hWnd,NULL)){ 
     MessageBox(hWnd,L"I loaded your dll!",L"it's me",MB_OK); 
     return TRUE; 
} 
    return FALSE; 
} 

的問題是,GetCurrentProcessId()== GetWindowThreadProcessId(HWND,NULL)是不正確的(如果我把這些URL調用外,如果阻止一切正常,但它會爲每個列出的窗口調用一次)。

有沒有其他辦法可以說明問題?這種方法是完全錯誤的還是我錯過了一些東西?

Thanx提前

+0

GetWindowThreadProcessId返回線程ID,第二個參數得到的進程ID。 (注意:不要發瘋DllMain中,只有幾個功能,這些功能實際上是安全的在功能使用) – Anders 2010-07-29 17:17:58

+0

我知道,但我的問題是我需要做的裏面的DllMain所有的東西,因爲我的DLL被注入正在運行的過程。 – pigiuz 2010-07-29 19:56:27

回答

4

使用GetCurrentProcess,它返回當前進程的僞句柄。如果您需要真正的手柄,請將僞手柄傳遞至DuplicateHandle

請注意,在DllMain中做太多操作是非常危險的。調用除KERNEL32以外的任何其他函數都是相當危險的,即使如此,仍有一些KERNEL32函數不應該被調用。見DllMain文檔,this document,並severalblogpostsfrom微軟的開發人員建議反對這樣做在DllMain太多。

0

你犯了一個錯誤:

GetWindowThreadProcessId不返回的進程ID,但線程ID。

你的程序必須這樣寫:

BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) { 
    DWORD process; 
    GetWindowThreadProcessId(hWnd,&process); 
    if(GetCurrentProcessId() == process){ 
     MessageBox(hWnd,L"I loaded your dll!",L"it's me",MB_OK); 
     return TRUE; 
    } 
    return FALSE; 
} 
相關問題