【问题标题】:How to use CoCreateInstance() to get a com object?如何使用 CoCreateInstance() 获取 com 对象?
【发布时间】:2013-09-03 10:56:23
【问题描述】:

我已经注册了一个 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 返回失败。

【问题讨论】:

标签: c++ com mingw


【解决方案1】:

您的 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 代码指示失败时,请确保发布这些值。

【讨论】:

  • com类不是我创建的,我看不到代码和IID标识符。然后我使用IID_IDispatch,但是程序不能工作(可以编译但运行失败) )。
  • 如果 COM 库/组件不是您的,您需要供应商提供更多信息,或者您可能会通过类型库查找标识符(请参阅COM/OLE Viewer tool)。
  • 我可以在 VB 中调用它:set se = createobject("se.mysoft")。我不知道如何在c++中调用它
  • “一些 COM 类实现了众所周知的接口” 那么,可能值得指出 所有 COM 类实现至少 IUnknown :)
  • 我找到了工具,但还是失败了。
【解决方案2】:

我认为您的CLSID 是正确的,因为hr 的值为0。从您的idl.file 的提取中,我得出结论接口的ID 是{F3F54BC2-D6D1-4A85-B943- 16287ECEA64C} 及其名称Isesoft。您当前的代码提供了指向IDispatch 的指针,如果hr 为0,则hr1 应为0。要获得指向此接口的原始COM 指针,您必须传递CLSID 和IID 以及指向的指针的地址Isesoft.

现在更改您的代码:

CLSID clsid;
RIID iid;
IseSoft* pIceSoft; 
HRESULT hr = CLSIDFromProgID(OLESTR("se.mysoft"),&clsid);
HRESULT hr2 = IIDFromString(OLESTR("{F3F54BC2-D6D1-4A85-B943-16287ECEA64C}"), &iid);
HRESULT hr3 = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, iid, (void **)&pIseSoft);

最后一句话:由于您的hr1 返回一个不应该的失败,我认为 CLSID 有问题。您可以在从接口获得 IID 的 idl 文件中找到正确的 CLSID。

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

【讨论】:

  • 它有效!!!!谢谢,非常Mutch
【解决方案3】:

你应该知道你想要的对象的接口,我们称之为IMyInterface

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

【讨论】:

  • 在哪里可以找到接口?我没有 COM 组件的源代码。我可以在VB中调用它: set se = createobject("se.mysoft") 我不知道如何在c++中调用它。
  • @CodeCat 你试过导入 .dll 吗?这会生成您可以包含以访问 COM 对象的头文件。只需在你的 cpp 文件中写入 #import "yourdll.dll" (并确保你有一个路径)
  • 当我导入dll文件并编译时,编译器显示很多错误。
猜你喜欢
  • 2015-07-15
  • 2010-11-28
  • 2012-10-14
  • 2011-09-08
  • 2018-12-23
  • 2017-08-30
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多