C ++的OLE自动化问题 - “类未注册”

时间:2011-11-17 18:58:44

标签: c++ com automation ole labview

我试图将LabView程序移植到C ++,而它包含的OLE调用给我带来了一些麻烦。

LabView程序首先进行"自动化打开"即获得对界面的引用" XLib.XInterface" (LabView将此表达式称为" ActiveX类"),然后调用接口中找到的方法QA,最后再次关闭引用。我认为LabView从类型库获取其界面信息,但我并不确定。

我尝试为Word自动化调整一些代码:http://www.codeproject.com/KB/office/MSOfficeAuto.aspx

CoInitialize(NULL);
CLSID clsid;
HRESULT hr = CLSIDFromProgID(L"XConfig.XInterface", &clsid);

IDispatch *pWApp;
if(SUCCEEDED(hr))
{
    hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, 
                          IID_IDispatch, (void **)&pWApp);
}
// etc.

该程序成功查找了CLSID,但CoCreateInstance失败,声称该类未注册。我还尝试直接从类型库输入CLSID,绕过CLSIDFromProgID,但产生相同的结果。毋庸置疑,LabView程序运行正常,而且我使用的C ++代码在使用progID" Word.Application"时完全没有麻烦创建Word实例。有问题的界面如下所示:

[
   odl,
   uuid(33AAA2DA-70EB-48EE-ACA7-DD0D1F5CAF2D),
   helpstring("XInterface Interface"),
   dual,
   oleautomation
]
interface XInterface : IDispatch {
   [id(0x00000001), helpstring("method QA")]
   HRESULT QA();
   [id(0x00000002), helpstring("method LoadFromDisk")]
   HRESULT LoadFromDisk();
   ...

正如您可能已经注意到的,OLE对我来说是一种新的东西(很可能,这是问题的一部分)。任何提示将不胜感激。感谢。

1 个答案:

答案 0 :(得分:0)

好吧,我想我自己弄清楚了,即使我不完全理解我的解决方案。无论如何,当我使用

hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_IDispatch,
            (void **)&pWApp);
它似乎有效;至少我不再得到“类未注册”的错误。不同之处在于将参数CLSCTX_LOCAL_SERVER替换为CLSCTX_ALL。我认为这与我正在使用dll这一事实有关。有没有人有更深刻的解释?

相关问题