簡體   English   中英

如何獲取 DLL 加載進程句柄

[英]How to get a DLL loading process handle

我正在嘗試獲取從 dll 加載 dll 的進程的句柄。

我的方法是:在 DLL_PROCESS_ATTACH 中我調用 EnumWindows(EnumWindowsProc,NULL);

我的 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) 永遠不會為真(如果我將消息框調用放在 if 塊之外,一切正常,但它會為每個列出的窗口調用一次)。

有沒有其他方法可以達到目的? 這種方法是完全錯誤的還是我只是遺漏了什么?

提前謝謝

使用GetCurrentProcess ,它向當前進程返回一個偽句柄。 如果您需要真正的句柄,請將偽句柄傳遞給DuplicateHandle

請注意,在DllMain做太多是非常危險的。 調用KERNEL32函數以外的任何函數都是非常危險的,即使這樣,您也不應該調用一些KERNEL32函數。 請參閱DllMain文件, 這個文件幾個博客帖子微軟的開發人員建議不這樣做太多DllMain

最簡單的方法是在需要句柄時簡單地使用GetCurrentProcess

你犯了一個錯誤:

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;
}

嘗試調用GetProcessHandleFromHwnd()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM