【问题标题】:DLL_PROCESS_ATTACH failing to execute on Windows 7 C++DLL_PROCESS_ATTACH 无法在 Windows 7 C++ 上执行
【发布时间】:2012-01-23 07:33:16
【问题描述】:

我正在尝试加载一个.dll 文件并让它在加载时显示一个消息框。据我了解,一旦加载了.dll,它就会调用dllmain() 并切换到DLL_PROCESS_ATTACH 选项。我已经为.dll 和加载它的.exe 编写了代码。 .exe 可以正确加载它并打印出加载 dll 的地址,但我没有看到正在显示的消息框。我在 Microsoft.com 上的某处读到,加载时 dll 进入“锁定”状态,以防止出于安全目的执行某些功能或代码。此功能是否阻止显示消息框?是否有解决方法,例如提升权限、系统等...?我也不确定 DEP 是否有任何影响,我将其设置为仅保护关键 Windows 进程。

调用过程:

#include <iostream>
#include <windows.h>
int main()
{
    HMODULE hDll = LoadLibraryA("dll.dll");
    if (hDll == NULL)
        std::cerr << "Unable to load dll";
    else
        std::cout << "Dll loaded @ " << hDll;
    FreeLibrary(hDll);
}

dll文件:

#include <windows.h>
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            MessageBox(NULL, "Dll has been loaded.", "Loaded", MB_OK);
            break;
    }
    return TRUE;
}

如果我有办法通过调试器运行.dll 并查看MessageBox() 返回的内容,我认为这可能会对我有所帮助,但我不知道该怎么做。谢谢!

【问题讨论】:

  • 只是在这里猜测,但您实际上并没有对 DLL 执行任何操作,除了在名称中“加载”它 - 您可能会发现 Windows 懒惰地调用 DllMain当你第一次用图书馆做一些实质性的事情时。
  • @coolcoder:你说得对,使用调试器会有所帮助。

标签: c++ dll windows-7 messagebox loadlibrary


【解决方案1】:

Raymond Chen 在题为Some reasons not to do anything scary in your DllMain的博客文章中对此有话要说:

在任何情况下,您都不应该做任何疯狂的事情,比如在 DLL_PROCESS_ATTACH 中创建一个窗口。除了线程亲和性问题之外,还有全局钩子的问题。在加载程序锁内运行的钩子是灾难的根源。如果您的机器出现死锁,请不要感到惊讶。

【讨论】:

    【解决方案2】:

    除了博文Greg 的链接之外,还有其他几篇关于loader lock 和事物you shouldnot doin DllMain 的信息博文。

    一般来说,您应该只调用 kernel32 中不创建线程/窗口、使用 COM 或调用 LoadLibrary(或其他涉及加载程序锁的函数)的函数。

    恕我直言,安全事项的合理列表是:DisableThreadLibraryCalls、Tls*、InitializeCriticalSection 以及在您的情况下(用于调试目的);输出调试字符串

    【讨论】:

      猜你喜欢
      • 2015-08-27
      • 2011-12-01
      • 1970-01-01
      • 2011-02-06
      • 2015-10-13
      • 1970-01-01
      • 2012-10-14
      • 2016-12-02
      • 2010-12-26
      相关资源
      最近更新 更多