我构建了一个 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。
你不应该这样做anything在 DllMain 中,它依赖于另一个 DLL。您至少违反了三次:printf
and std::cout
依赖于 CRT(CRT 又依赖于 Win32 DLL)并且CreateThread
取决于 Kernel32.DLL。
DllMain
用于简单的事情,例如将变量归零等。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)