C ++组件对象模型

时间:2018-04-09 13:02:26

标签: c++ visual-c++ com

我想用c ++设置一个指向软件自动化调度的指针 我的代码是:

::CLSIDFromProgID(OLESTR("SGNSAutomation.SGNSApplication"), &clsid);
IID iid;

  HRESULT hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, 
  IID_IDispatch, (LPVOID*)&pWMPDispatch);
  IDispatch * pdisp = (IDispatch *)NULL;
  DISPID dispid;
  OLECHAR * Name = OLESTR("openCase");
 HRESULT hresult =pdisp->GetIDsOfNames(IID_NULL, &Name,1,LOCALE_SYSTEM_DEFAULT,&dispid);

但最后一行出错: Win32Project1.exe中0x008B4AD7处的未处理异常:0xC0000005:访问冲突读取位置0x00000000。

我该如何解决这个问题? 我认为这是因为我没有设置pdisp指针,我不知道如何设置它。 请帮我 谢谢

1 个答案:

答案 0 :(得分:2)

您没有显示pWMPDispatch的声明,但我敢打赌它是IDispatch*。它应该是,因为您在IID_IDispatch电话中使用了CoCreateInstance。所以你不需要另一个变量pdisp。只需使用pWMPDispatch即可。另外,请务必检查每个HRESULT返回代码。我认为你的代码看起来应该是这样的

HRESULT hr = ::CLSIDFromProgID(OLESTR("SGNSAutomation.SGNSApplication"), &clsid);
if (FAILED(hr)) {
    // handle error here by returning or throwing
}

hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_IDispatch, (LPVOID*) &pWMPDispatch);
if (FAILED(hr)) {
    // handle error here by returning or throwing
}

DISPID dispid;
LPOLESTR Name = OLESTR("openCase");
hr = pWMPDispatch->GetIDsOfNames(IID_NULL, &Name, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
if (FAILED(hr)) {
    // handle error here by returning or throwing
}