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

Sli*_*ght 5 c++ dll visual-studio-2010 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我真的不知道如何处理这个问题.Release链接器是否以某种方式排除了依赖关系?

我正在使用MSVS 2010和默认的发布/调试配置设置.调试dll大约是5,137kb,发布dll只有23kb.

MSa*_*ers 0

您不应该在 DllMain 中执行任何依赖于另一个 DLL 的操作。您至少违反了三次:printf并且std::cout依赖于 CRT(而 CRT 又依赖于 Win32 DLL)以及CreateThread依赖于 Kernel32.DLL。

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

  • @salters 我的代码正在被注入。从今以后,您可以假设我的 DLL 是最后加载的。我还提到我在整个项目中使用了 std::cout 。您的帖子更多的是“建议”,而不是您在最后一句话中承认的答案。 (3认同)
  • *叹气*这只是一些表达要点的基本代码。请发挥你的想象力,假装它在 onAttach 函数中,好吗?更不用说这根本不能回答问题。我很欣赏所有的答案,但这看起来更像是一个刺痛而不是一个答案。 (2认同)