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

时间:2013-09-03 10:56:24

标签: 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);

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

我使用了OLE VIEWER查找界面:

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

然后我改变了我的代码:

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);

但是hr1返回失败了。

3 个答案:

答案 0 :(得分: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);

要获得C ++代码可用的IsesoftIID_Isesoft__uuidof(Isesoft),您需要导入定义,通常是两个定义:

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

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

答案 1 :(得分:0)

您应该知道对象所需的界面,我们称之为IMyInterface

IMyInterface* pItf = NULL;
hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_IMyInterface, (void**)&pItf);

答案 2 :(得分:0)

仅找到接口的IID是不够的,您还需要Roman指出的typelib的LIBID。由于您知道接口的IID,因此请打开regedit并输入Computer \ HKEY_CLSSES​​_ROOT \ Interface {F3F54BC2-D6D1-4A85-B943-16287ECEA64C} \ TypeLib,因此请使用反斜杠。您获得LIBID,假定值为{6F88B941-D87E-4B5E-BAE2-01cc21900dd8}。在您的程序中添加语句#import "libid:6F88B941-D87E-4B5E-BAE2-01cc21900dd8",此处没有大括号。生成项目,然后通常在x64 \ Release或x64 \ Debug文件夹中,找到文件se.tlh,以ProgID的服务器部分命名。该文件包含所有公开接口的声明和IID,希望该接口也包含IceSoft接口(顺便说一句,名称很滑稽)。您是否还在regedit或oleview中搜索接口Imysoft,因为这将是带有ProgID se.mysoft的CoClass的默认调度接口的通用名称。

现在更改您的代码:

#import "libid:6F88B941-D87E-4B5E-BAE2-01cc21900dd8"//replace correct LIBID
… later:
CLSID clsid;
RIID iid;
CComPtr<IceSoft> pIceSoft; // no *
HRESULT hr = CLSIDFromProgID(OLESTR("se.mysoft"),&clsid);
hr = IIDFromString(OLESTR("{F3F54BC2-D6D1-4A85-B943-16287ECEA64C}"), &iid);
HRESULT hr1 = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, iid, (void **)&pIceSoft);

最后一句话:由于您的hr1返回了不应返回的失败,因此我认为CLSID出了问题。 hr1的错误代码将是800401F3(CO_E_CLASSSTRING:无效的类字符串)。从CLSIDFromProgID(OLESTR("se.mysoft"),&clsid);语句中获取值,并在regedit输入Computer \ HKEY_CLASSES_ROOT \ se.mysoft中将其与子项CLSID的值进行比较。

尽管如此,使用您的代码,您只会得到一个无用的IDispatch指针,因为这正是您要的。