如何使用CoCreateInstance()来获取com对象?

Cod*_*Cat 7 c++ com mingw

我注册了一个COM组件.我想打电话给它.

CLSID clsid;
RIID iid;
HRESULT hr = CLSIDFromProgID(OLESTR("se.mysoft"),&clsid);
LPVOID *pRet;
HRESULT hr1 = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, iid, pRet);
Run Code Online (Sandbox Code Playgroud)

我可以获得成功的clsid,但我在哪里可以得到iid?

我用OLE VIEWER查找界面:

 [
 odl,
 uuid(F3F54BC2-D6D1-4A85-B943-16287ECEA64C),
 helpstring("Isesoft Interface"),
 dual,
 oleautomation
 ]
 interface Isesoft : IDispatch {
Run Code Online (Sandbox Code Playgroud)

然后我改变了我的代码:

CLSID clsid;
RIID iid;
IDispatch* pDispatch;
HRESULT hr = CLSIDFromProgID(OLESTR("se.mysoft"),&clsid);
HRESULT hr1 = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER,  IID_IDispatch,(void **)&pDispatch);
Run Code Online (Sandbox Code Playgroud)

但hr1返回失败.

Rom*_* R. 6

您的COM类实现了一些接口,每个接口都有其IID标识符.所以你需要从COM组件实现中获取它.这是您的代码,您需要提供准确指定您请求的接口的标识符.

一些COM类实现了众所周知的接口,尤其是.IDispatch,标识符是IID_IDispatch,或__uuidof(IDispatch).

UPD.由于您发现感兴趣的界面是Isesoft,您的代码将是:

CLSID clsid;
RIID iid;
IDispatch* pDispatch;
HRESULT nResult1 = CLSIDFromProgID(OLESTR("se.mysoft"), &clsid);
HRESULT nResult2 = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER,
  IID_Isesoft, (void **) &pDispatch);
Run Code Online (Sandbox Code Playgroud)

为了得到Isesoft和IID_Isesoft,__uuidof(Isesoft)提供给C++代码,你将需要导入的定义,这是典型的则上任意两个:

  • 其他供应商SDK包括例如 #include "isesoft\sdk.h"
  • 或者#import "libid:..."使用类型库标识符(名称空间和其他属性适用)

当您有HRESULT代码指示失败时,请务必发布值.