如何获取DLL加载进程句柄

发布于 2024-09-12 04:57:21 字数 586 浏览 4 评论 0 原文

我正在尝试获取从 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 块之外,则一切正常,但每个列出的窗口都会调用一次)。

还有其他方法可以进入正题吗?这种方法是完全错误的还是我只是错过了一些东西?

提前感谢

I'm trying to get the handle to the process which loaded a dll from the dll.

My approach is:
in DLL_PROCESS_ATTACH I call EnumWindows(EnumWindowsProc,NULL);

my EnumWindowsProc implementation is the following:

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

the problem is that GetCurrentProcessId() == GetWindowThreadProcessId(hWnd,NULL) is never true (if i place the messagebox call outside the if block everything works but it gets called once for every listed window).

Is there any other way to get to the point? Is this approach totally wrong or am I just missing something?

Thanx in advance

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

╄→承喏 2024-09-19 04:57:21

使用 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 than KERNEL32 functions is quite dangerous, and even then there are some KERNEL32 functions that you shouldn't be calling. See the DllMain documentation, this document, and several blog posts from Microsoft developers recommending against doing too much in DllMain.

窝囊感情。 2024-09-19 04:57:21

最简单的方法是只要使用 GetCurrentProcess你需要手柄。

Easiest way would be to simply use GetCurrentProcess whenever you need the handle.

℡Ms空城旧梦 2024-09-19 04:57:21

您犯了一个错误:

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

You made a mistake:

GetWindowThreadProcessId does not return the process ID but the thread ID.

Your program must be written like this:

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;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文