我已经构建了一个DLL,它通常通过SetWindowHookEx注入控制台应用程序。它很重要的DLL将信息输出到控制台,我一直在使用std :: cout。 DLL已接近完成,直到我尝试在发布模式下构建DLL,这使得所有cout行无效。我已经验证了DLL正在注入并且正在执行一个简单的空取消引用,导致程序在dllmain函数中崩溃。与std :: printf相同的故事。
void onAttach()
{
//WARNING THIS IS A DEMONSTRATION
std::cout<<"test"<<std::endl;
//int* intPtr = 0;
//*intPtr = 3; //This causes a crash
}
// entry point
BOOL WINAPI DllMain ( HMODULE hModule, DWORD dwReason, LPVOID lpReserved )
{
switch ( dwReason )
{
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls ( hModule );
CreateThread ( NULL, 0, ( LPTHREAD_START_ROUTINE ) onAttach, NULL, 0, NULL );
return true;
break;
case DLL_PROCESS_DETACH:
return true;
break;
}
}
我真的不知道如何解决这个问题。 Release链接器是否以某种方式排除了依赖关系?
我正在使用MSVS 2010和默认发布/调试配置设置。调试dll大约是5,137kb,发布dll只有23kb。
答案 0 :(得分:0)
你不应该在DllMain中做任何,这取决于另一个DLL。您至少违反了三次:printf
和std::cout
取决于CRT(后者依赖于Win32 DLL)而CreateThread
取决于Kernel32.DLL。
DllMain
适用于简单的事情,如归零变量等。
答案 1 :(得分:0)
我知道@salters是正确的,它表明不应在DLL中对其他库进行任何调用,但是经过反复试验,我发现以x64配置(而不是x86)编译DLL可以“删除” DLL。 ”或“显示”使用“ MessageBox”函数而没有任何问题(可能可以从许多其他库中调用函数)。希望这会有所帮助:)。