计数和打印工作在Dll内建调试而不是发布
cout and printf Works On Dll Built In Debug Not Release
我已经构建了一个DLL,通常通过SetWindowHookEx注入到控制台应用程序中。对于DLL来说,将信息输出到控制台是很重要的,我一直在使用std::cout。DLL接近完成,直到我尝试在发布模式下构建DLL,这使得所有的计数行都无效。我已经验证了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;
}
}
我真的不知道如何处理这个问题。发布链接是否排除了依赖关系?我使用MSVS 2010和默认的发布/调试配置设置。调试dll大约5137 kb,发布dll只有23kb。
你不应该做任何在DllMain依赖于另一个DLL。你至少违反了三次:printf
和std::cout
依赖于CRT(而CRT又依赖于Win32 dll), CreateThread
依赖于Kernel32.DLL。
DllMain
用于简单的事情,如归零变量等
我知道@salters在声明不应该在DLL中调用其他库是正确的,但是经过反复试验,我发现在x64配置中编译DLL(而不是x86) DLL可以"cout"或显示使用"MessageBox"函数而没有任何问题(可能从许多其他库调用函数)。
相关文章:
- main() 中的 std::cout 在调试期间不会在调试控制台中打印任何内容
- 为自定义打印调试实现传递任何类型的变量
- C++ 中 uint8_t* 值的含义和调试(打印)
- 在 Visual Studio 调试器中,如何从内存中打印字节范围?
- 如何关闭用于在程序中打印调试数据的函数
- 如何打印调试C++ Win32 DLL?
- cLion & cMake 不调试/打印错误
- printf 语句在调试期间未在控制台上打印
- Android Studio,CMake.如何在编译时打印调试消息
- q调试打印错误的数字
- 为什么程序打印在调试和发布中浮动不同
- C++调试打印到流会生成警告
- 如何使dumpObjectInfo打印调试信息
- 是否可以调试打印当前函数的调用方
- C++-创建虚拟函数以打印调试消息的最佳方式
- 如何用尽可能少的代码行打印我在屏幕/调试器上看到的内容
- 打印和调试时,视觉C++值会有所不同
- C++调试打印宏OS X Clang兼容
- 是否有标准的方法将调试打印放在库中?
- 编译时从发布二进制文件中删除调试打印