5

我已经构建了一个 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 大约 5,137kb,release dll 只有 23kb。

4

2 回答 2

0

你不应该在 DllMain 中做任何依赖于另一个 DLL 的事情。您至少违反了 3 次:printf并且std::cout依赖于 CRT(这又依赖于 Win32 DLL)并CreateThread依赖于 Kernel32.DLL。

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

于 2013-01-08T09:07:22.470 回答
0

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

于 2019-04-09T10:07:49.870 回答