我正在尝试获取从 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 block 之外,一切正常,但它会为每个列出的窗口调用一次)。
有没有其他方法可以达到目的?这种方法是完全错误的还是我只是遗漏了什么?
提前致谢
最佳答案
使用GetCurrentProcess ,它返回当前进程的伪句柄。如果需要真实句柄,将伪句柄传入DuplicateHandle .
请注意,在 DllMain
中做太多事情是非常危险的。调用 KERNEL32
函数以外的任何函数都是非常危险的,即便如此,仍有一些 KERNEL32
函数是您不应该调用的。查看DllMain
文档,this document , 和 several blog posts from Microsoft 开发人员建议不要在 DllMain
中做太多事情。
关于c++ - 如何获得一个DLL加载进程句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3365190/