gpt4 book ai didi

c++ - cout 和 printf 适用于内置调试未发布的 Dll

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:51:43 27 4
gpt4 key购买 nike

我构建了一个 DLL,它通常通过 SetWindowHookEx 注入(inject)到控制台应用程序中。 DLL 将信息输出到控制台很重要,我一直在使用 std::cout 进行操作。 DLL 接近完成,直到我尝试在 Release模式下构建 DLL,这使得所有 cout 行都变得无用。我已经通过执行导致程序在 dllmain 函数中崩溃的简单空取消引用来验证 DLL 正在注入(inject)和执行。与 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 大约 5,137kb,发布 dll 只有 23kb。

最佳答案

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

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

关于c++ - cout 和 printf 适用于内置调试未发布的 Dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14208569/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com