如何获取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 块之外,则一切正常,但每个列出的窗口都会调用一次)。
还有其他方法可以进入正题吗?这种方法是完全错误的还是我只是错过了一些东西?
提前感谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
使用 GetCurrentProcess,它返回一个当前进程的伪句柄。如果您需要真实句柄,请将伪句柄传递给 重复句柄。
请注意,在
DllMain
中执行过多操作是非常危险的。调用KERNEL32
函数以外的任何函数都非常危险,即使这样,也有一些KERNEL32
函数您不应该调用。请参阅DllMain
文档, 本文档 和 几个 博客 帖子 来自 Microsoft 开发人员建议不要在DllMain
中执行过多操作。Use GetCurrentProcess, which returns a pseudo-handle to the current process. If you need a real handle, pass in the pseudo-handle to DuplicateHandle.
Note that it is very dangerous to do too much in
DllMain
. Calling anything other thanKERNEL32
functions is quite dangerous, and even then there are someKERNEL32
functions that you shouldn't be calling. See theDllMain
documentation, this document, and several blog posts from Microsoft developers recommending against doing too much inDllMain
.最简单的方法是只要使用 GetCurrentProcess你需要手柄。
Easiest way would be to simply use GetCurrentProcess whenever you need the handle.
尝试调用 GetProcessHandleFromHwnd()。
Try calling GetProcessHandleFromHwnd().
您犯了一个错误:
GetWindowThreadProcessId 不返回进程 ID,而是返回线程 ID。
你的程序必须这样写:
You made a mistake:
GetWindowThreadProcessId does not return the process ID but the thread ID.
Your program must be written like this: