Windows 7 C ++でDLL_PROCESS_ATTACHの実行が失敗する

私は .dll ファイルを読み込み、ロード時にメッセージボックスを表示しようとしています。私の理解では、 .dll がロードされると、 dllmain()を呼び出して DLL_PROCESS_ATTACH オプションに切り替えます。私は .dll とそれをロードする .exe の両方のコードを書いています。 .exe は正しくロードして、dllがロードされたアドレスを出力できますが、メッセージボックスは表示されません。 Microsoft.comのどこかで、セキュリティ上の目的で特定の機能やコードが実行されないように、dllがロードされて「ロック」されていると読んでいます。この機能はメッセージボックスの表示をブロックしていますか?昇格特権、システムなどの回避策はありますか? DEPに影響があるかどうかはわかりませんが、重要なWindowsプロセスのみを保護するように設定しています。

呼び出しプロセス:

#include 
#include 
int main()
{
    HMODULE hDll = LoadLibraryA("dll.dll");
    if (hDll == NULL)
        std::cerr << "Unable to load dll";
    else
        std::cout << "Dll loaded @ " << hDll;
    FreeLibrary(hDll);
}

dllファイル:

#include 
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            MessageBox(NULL, "Dll has been loaded.", "Loaded", MB_OK);
            break;
    }
    return TRUE;
}

デバッガを使用して .dll を実行し、 MessageBox()が返すものを確認する方法があれば助けになると思いますが、どうすればよいか分かりません。ありがとう!

2
@coolcoder:あなたは、デバッガを使用すると役立つでしょう。
追加された 著者 bk1e,
ちょうどここで推測しますが、実際にはDLLを「ロード」して別にDLLを実際には何もしません。Windowsでは最初に DllMain を遅延呼び出ししますあなたは図書館で相当なことをしています。
追加された 著者 ta.speot.is,

2 答え

レイモンド・チェン氏はブログ・エントリーのあなたのDllMainで恐ろしい何もしない何らかの理由

もちろん、DLL_PROCESS_ATTACH内にウィンドウを作成するのと同じように、何もしないでください。スレッドアフィニティの問題に加えて、グローバルフックの問題があります。ローダーロック内で実行されているフックは災害のためのレシピです。あなたのマシンがデッドロックしても驚かないでください。

5
追加された
+1、私は非常に同じブログ記事にリンクしていた
追加された 著者 Adam Rosenfield,

Greg のブログ記事に加えて、ローダーロックとその他のもの しない DllMain にあります。

一般的には、カーネル32のスレッド/ウィンドウを作成しない関数を呼び出すか、COMを使うか、LoadLibrary(またはローダーロックを含む他の関数)を呼び出すだけです。

IMHOの安全なものの合理的なリスト:DisableThreadLibraryCalls、Tls *、InitializeCriticalSection、あなたの場合(デバッグの目的で); OutputDebugString

1
追加された