【发布时间】:2012-12-21 22:15:10
【问题描述】:
我已经构建了一个 DLL,它通常通过 SetWindowHookEx 注入到控制台应用程序中。 DLL 将信息输出到我一直在使用 std::cout 的控制台很重要。 DLL 接近完成,直到我尝试在发布模式下构建 DLL,这使得所有 cout 行都无用。我已经验证了 DLL 正在注入并通过执行简单的 null 取消引用来执行,这会导致程序在 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 和默认发布/调试配置设置。 debug dll大约5137kb,release dll只有23kb。
【问题讨论】:
-
我怀疑
stdout在调试中被刷新,但不是在发布中。在发布时尝试std::cout << "Test" << std::endl;。 -
不幸的是,与 cout 使用 endl 的情况相同。
-
printf调用不会刷新输出。它还使用与std::cout不同的缓冲区,因此您真的不应该混合使用这些缓冲区。 -
您是否链接到 C 运行时的 DLL 版本 (
/MD)?如果您使用WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), "test", 4, NULL, NULL)而不是使用printf或cout,您可以打印到控制台吗? -
@AdamRosenfield 啊,谢谢。 WriteFile 有效。关于为什么会这样的任何理论?我试过调用 std::cout.flush() 虽然换行符应该这样做。
标签: c++ visual-studio-2010 dll dll-injection