【问题标题】:Exception creating MSMQ queue in DLL在 DLL 中创建 MSMQ 队列的异常
【发布时间】:2012-07-02 22:03:58
【问题描述】:

我正在尝试将一些 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;
}

【问题讨论】:

  • 记录你得到的 hr 值。
  • 也没有检查CoInitializeEx返回的HRESULT

标签: c++ winapi dll msmq


【解决方案1】:

MSDN 说 here,因为无法控制进程内服务器加载或卸载的顺序,所以不应从 DllMain 函数调用 CoInitializeEx。

你是从 DllMain 打电话给CreateQueue 吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 2014-12-17
    • 2014-05-14
    • 2011-06-16
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    相关资源
    最近更新 更多