cout和printf在Dll内置调试未发布

时间:2013-01-08 05:12:19

标签: c++ visual-studio-2010 dll dll-injection

我已经构建了一个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。

2 个答案:

答案 0 :(得分:0)

你不应该在DllMain中做任何,这取决于另一个DLL。您至少违反了三次:printfstd::cout取决于CRT(后者依赖于Win32 DLL)而CreateThread取决于Kernel32.DLL。

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

答案 1 :(得分:0)

我知道@salters是正确的,它表明不应在DLL中对其他库进行任何调用,但是经过反复试验,我发现以x64配置(而不是x86)编译DLL可以“删除” DLL。 ”或“显示”使用“ MessageBox”函数而没有任何问题(可能可以从许多其他库中调用函数)。希望这会有所帮助:)。