c++ - 如何获得一个DLL加载进程句柄

标签 c++ windows winapi dll code-injection

我正在尝试获取从 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/

相关文章:

c# - 设置事件窗口

c++ - QT 和 C++ : can't call function outside main() function

c++ - 摆动/摆动相机

指定 lambda 捕获时出现 C++11 编译错误

regex - 包含制表符的 findstr 查询

.net - 我可以将 32 位 native dll(不是 .Net 程序集)链接到我的 64 位 .Net 应用程序吗?

c++ - 简单高效的C++容器,具有map和list容器的特点

android - 如何找到并运行 keytool

c++ - 以编程方式在 Windows 中获取事件连接

Python - 在不使用 100% cpu 的情况下检查按键