我正在尝试将 LabView 程序移植到 C++,但它包含的 OLE 调用给我带来了一些麻烦。
LabView 程序首先执行“自动化打开”,即获取对接口(interface)“XLib.XInterface”的引用(LabView 将此表达式称为“ActiveX 类”),然后调用在接口(interface)中找到的方法 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 对我来说有点陌生(很可能,这是问题的一部分)。任何提示将不胜感激。谢谢。
最佳答案
好吧,我想我自己弄明白了,尽管我并不完全理解我的解决方案。无论如何,当我使用
hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_IDispatch,
(void **)&pWApp);
它似乎有效;至少我不再收到“类未注册”错误。区别在于将参数 CLSCTX_LOCAL_SERVER 替换为 CLSCTX_ALL。我认为这与我正在使用 dll 这一事实有关。有没有人有更深入的解释?
关于c++ - C++ 的 OLE 自动化问题 - "Class not registered",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8172698/