通常は SetWindowHookEx を介してコンソール アプリケーションに挿入される DLL を作成しました。私が std::cout で行ってきた情報を DLL がコンソールに出力することは重要です。すべての cout 行が役に立たなくなるリリース モードで DLL をビルドしようとするまで、DLL は完成に近づいていました。dllmain 関数でプログラムをクラッシュさせる単純な null 逆参照を行うことで、DLL が挿入され、実行されていることを確認しました。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 です。