计数和打印工作在Dll内建调试而不是发布

cout and printf Works On Dll Built In Debug Not Release

本文关键字:调试 打印 工作 Dll      更新时间:2023-10-16

我已经构建了一个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。你至少违反了三次:printfstd::cout依赖于CRT(而CRT又依赖于Win32 dll), CreateThread依赖于Kernel32.DLL。

DllMain用于简单的事情,如归零变量等

我知道@salters在声明不应该在DLL中调用其他库是正确的,但是经过反复试验,我发现在x64配置中编译DLL(而不是x86) DLL可以"cout"或显示使用"MessageBox"函数而没有任何问题(可能从许多其他库调用函数)。