0

いくつかの MSMQ 機能を dll (c++) にコーディングしようとしていますが、問題が発生しています。基本的に、キューを作成する呼び出しを行うと、低レベルの例外が発生します (以下の呼び出しスタックを参照)。私をいらいらさせているのは、このコードが実行可能ファイルで正常に動作することです.dllに座っているときにのみ失敗するようです. コードを少しサニタイズし、以下に含めました。

コールスタック:

KernelBase.dll!_RaiseException@16()  + 0x58 bytes   
msvcrt.dll!__CxxThrowException@8()  + 0x45 bytes    
mqsec.dll!CCancelRpc::Init()  + 0xa5 bytes  
mqrt.dll!CFreeRPCHandles::Add()  + 0x1bc bytes  
mqrt.dll!RtpOneTimeThreadInit()  + 0x39 bytes   
mqrt.dll!_MQCreateQueue@16()  + 0x23 bytes  
mqoa.dll!CMSMQQueueInfo::Create()  + 0xba bytes 

コード:

 HRESULT CreateQueue()
 {
    HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);

    CComQIPtr<IMSMQQueueInfo, &IID_IMSMQQueueInfo> ipQueueInfo;

    hr = CoCreateInstance(CLSID_MSMQQueueInfo,
     NULL,
     CLSCTX_SERVER,
     IID_IMSMQQueueInfo,
     (void**)(&ipQueueInfo.p));

    if(hr != S_OK)
      return hr;

    hr = ipQueueInfo->put_PathName(L".\\private$\\TestQueue");
    if(hr != S_OK)
       return hr;

    VARIANT vtFalse;
    VariantInit(&vtFalse);
    vtFalse.vt = VT_BOOL;
    vtFalse.boolVal = FALSE;
    hr = ipQueueInfo->Create(&vtFalse, &vtFalse);
    return hr;
}
4

1 に答える 1

0

MSDN によると、ここでは、インプロセス サーバーがロードまたはアンロードされる順序を制御する方法がないため、 DllMain関数から CoInitializeEx を呼び出すべきではありません。

CreateQueueDllMain から呼び出していますか?

于 2012-07-03T06:39:12.283 に答える