5

通常は 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 です。

4

2 に答える 2

0

別の DLL に依存する DllMain では何もしないでください。これに少なくとも 3 回違反しています。CRTprintfstd::cout依存しており (これは Win32 DLL に依存しています)、CreateThreadKernel32.DLL に依存しています。

DllMain変数のゼロ化などの単純なことを目的としています。

于 2013-01-08T09:07:22.470 に答える