如何获得一个DLL加载过程句柄

我试图得到从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块的一切工作,但它被调用每个列出的窗口之外的messagebox调用)。

有没有其他方法可以说明问题? 这种做法是完全错误的还是我错过了一些东西?

提前感谢

Solutions Collecting From Web of "如何获得一个DLL加载过程句柄"

使用GetCurrentProcess ,它返回当前进程的伪句柄。 如果你需要一个真正的句柄,把伪句柄传递给DuplicateHandle 。

请注意,在DllMain做太多是非常危险的。 调用除KERNEL32函数以外的任何内容都是非常危险的,即使如此,也有一些KERNEL32函数不应该被调用。 请参阅DllMain文档, 本文以及Microsoft开发人员的多篇 博文 ,建议不要在DllMain中做太多事情。

最简单的方法就是在需要处理时简单地使用GetCurrentProcess 。

尝试调用GetProcessHandleFromHwnd() 。

你犯了一个错误:

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