C++组件对象模型

标签 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 指针而且我不知道如何设置它。 请帮我 谢谢你

最佳答案

您没有显示 pWMPDispatch 的声明,但我敢打赌它是一个 IDispatch*。应该是,因为您在 CoCreateInstance 调用中使用了 IID_IDispatch。所以你不需要其他变量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
}

关于C++组件对象模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49733640/

相关文章:

c++ - std::enable_shared_from_this:是否允许在析构函数中调用 shared_from_this()?

c - OpenGL 无法使用 Visual C++ 编译器渲染场景

c++ - 输出 QProcess readAll 对标签的响应

c++ - 编译器是否优化了 "for"语句中的第二个条件?

c++ - 用 CString 替换 LPCTSTR 是否安全?

c++ - 用于 C++ 应用程序的 SMART ASSERT?

c# - 如何告诉 Range.NumberFormat 按原样放置数据?

c++ - COM 代码库位置 - 如何选择要使用的版本?

com - 如何从 PowerShell 调用复杂的 COM 方法?

c++ - C/C++ 中十六进制转义码的位数