C++ 在Windows 7 C++;

C++ 在Windows 7 C++;,c++,dll,windows-7,messagebox,loadlibrary,C++,Dll,Windows 7,Messagebox,Loadlibrary,我试图加载一个.dll文件,并在加载时让它显示一个消息框。据我所知,一旦加载了.dll,它就会调用dllmain(),并切换到dll\u进程\u附加选项。我已经为加载它的.dll和.exe编写了代码。.exe可以正确加载它并打印出加载dll的地址,但我没有看到显示消息框。我在Microsoft.com上的某个地方读到,dll在加载时会进入一个“锁”,以防止出于安全目的执行某些函数或代码。此功能是否阻止显示消息框?是否有提升权限、系统等变通方法。。。?我也不确定DEP是否有任何效果,我已将其设置为

我试图加载一个
.dll
文件,并在加载时让它显示一个消息框。据我所知,一旦加载了
.dll
,它就会调用
dllmain()
,并切换到
dll\u进程\u附加
选项。我已经为加载它的
.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);
}
#包括
#包括
int main()
{
HMODULE hDll=LoadLibraryA(“dll.dll”);
如果(hDll==NULL)

陈雷蒙在他的博客文章中对此发表了一些看法,标题是:

在任何情况下都不应该像在DLL\u进程\u ATTACH中创建窗口那样疯狂。除了线程亲和性问题,还有全局钩子的问题。在加载程序锁中运行的钩子都会导致灾难。如果您的机器死锁,请不要感到惊讶


除了博客文章的链接外,还有其他一些关于和事物的信息性文章

通常,您应该只调用内核32中不创建线程/窗口的函数,使用COM或调用LoadLibrary(或其他涉及加载程序锁的函数)


一个合理的安全事项列表应该是:DisableThreadLibraryCalls、Tls*、InitializeCriticalSection,在您的情况下(出于调试目的);OutputDebugString

在这里只是猜测,但实际上除了“加载”之外,您不需要对DLL执行任何操作它名副其实——你可能会发现,当你第一次对库做一些实质性的事情时,Windows会懒洋洋地调用
DllMain
。@coolcoder:你说得对,使用调试器会有所帮助。
#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;
}