我注册了一个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返回失败了。
答案 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 ++代码可用的Isesoft
和IID_Isesoft
,__uuidof(Isesoft)
,您需要导入定义,通常是两个定义:
#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
指针,因为这正是您要的。