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