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