DLL_PROCESS_ATTACH无法在Windows 7 C++上执行

llk*_*llk 2 c++ dll messagebox loadlibrary windows-7

我正在尝试加载.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);
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

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

Gre*_*ill 5

Raymond Chen在他的博客文章中有一些话要说,有些理由不会在你的DllMain中做任何可怕的事情:

绝对在任何情况下你都不应该像在DLL_PROCESS_ATTACH中创建一个窗口一样疯狂.除了线程亲和性问题之外,还存在全局钩子的问题.在装载机锁内运行的挂钩是一种灾难.如果您的机器死机,请不要感到惊讶.