2012-07-02 47 views
0

我試圖將一些MSMQ功能編碼到DLL(C++)中,但遇到了麻煩。基本上,當我調用創建隊列時會引發一個低級異常(請參閱下面的callstack)。令我感到沮喪的是,這段代碼在可執行文件中工作正常,它似乎只在坐在dll中失敗。我已經對代碼進行了一些清理幷包含在下面。在DLL中創建MSMQ隊列的異常

調用堆棧:

[email protected]() + 0x58 bytes 
[email protected]() + 0x45 bytes  
mqsec.dll!CCancelRpc::Init() + 0xa5 bytes 
mqrt.dll!CFreeRPCHandles::Add() + 0x1bc bytes 
mqrt.dll!RtpOneTimeThreadInit() + 0x39 bytes 
[email protected]() + 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; 
} 
+1

記錄您返回的hr值。 –

+0

還沒有'CoInitializeEx'返回的'HRESULT'的檢查 –

回答

0

MSDN說here,因爲沒有辦法來控制其進程服務器加載或卸載的順序,CoInitializeEx的不應該從DllMain函數中調用。

你是否打電話給DllMain的CreateQueue