3

1.dll をロードする .exe があり、1.dll が 1_1.dll をロードします。.exe で複数のスレッドを作成します。そのうちの 1 つから、他のものとの間で 1.dll 関数を呼び出す関数を呼び出します。これを行うのに失敗した 1_1.dll から関数を呼び出します。

//  Initialize COM.
    HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
    if( FAILED(hr) )
    {
        //m_iStatus = ERROR_COINITIALIZE_EX;
        return;
    }
    //  Set general COM security levels.
    hr = CoInitializeSecurity(
        NULL,
        -1,
        NULL,
        NULL,
        RPC_C_AUTHN_LEVEL_PKT_PRIVACY,
        RPC_C_IMP_LEVEL_IMPERSONATE,
        NULL,
        0,
        NULL);
    if( FAILED(hr) )
    {
        CoUninitialize();
        //m_iStatus = ERROR_COINITIALIZE_SEC;
        return;
    }

次のメッセージで CoInitializeSecurity を呼び出すと失敗します。

インターフェイスをマーシャリングまたはアンマーシャリングする前に、セキュリティを初期化する必要があります。一度初期化すると変更できません。

ここで何が起こっているのか、何が間違っているのか、どうすれば修正できるのか、誰か説明してもらえますか?

4

1 に答える 1

4

CoInitializeSecurity 関数...

...プロセスごとに、明示的または暗黙的に1 回だけ呼び出されます

DLL が呼び出す必要がある唯一のケースCoInitializeSecurityは、それがプロセスに読み込まれる場合です。これは、COM を独自に初期化しないことが知られています。プロセスは基本的に DLL のシン ホストです。つまり、ほとんどありません。

するのは.EXEの仕事ですCoInitializeSecurity

于 2013-09-14T19:04:35.433 に答える