7

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

4

3 回答 3

7

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

要获取Isesoftand IID_Isesoft__uuidof(Isesoft)可用于 C++ 代码,您需要导入定义,这通常是以下两个之一:

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

当您有HRESULT指示失败的代码时,请确保发布这些值。

于 2013-09-03T11:00:02.200 回答
2

我想你CLSID是正确的,因为hr它的值为 0。从你的 idl.file 的提取中,我得出结论,接口的 ID 是 {F3F54BC2-D6D1-4A85-B943-16287ECEA64C} 和它的 name Isesoft。您当前的代码提供了一个指向的指针,如果为 0 IDispatchhr1则应hr为 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指针,因为这就是您所要求的。

于 2019-08-18T06:28:01.680 回答
1

你应该知道你想要的对象的接口,让我们调用它IMyInterface

IMyInterface* pItf = NULL;
hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_IMyInterface, (void**)&pItf);
于 2013-09-03T11:10:48.353 回答