c++ - C++ 的 OLE 自动化问题 - "Class not registered"

标签 c++ com automation ole labview

我正在尝试将 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/

相关文章:

C++ 运算符重载错误

c++ - 自上而下的动态编程 VS 递归朴素解决方案。检查运行时执行

vb.net - 需要在我的 COM 服务器实例之间共享属性

r - 在 R 中创建以字符列为条件的二进制列

c++ - 在 vector 中读取和写入不同类型

c++ - 子 vector 修改原始 vector

c++ - 我如何获得显示在 IShellView 上下文菜单中的 IContextMenu?

c# - 在 C# 中实现 OPOS 设备

automation - ADTF SDK : import manifest AND handle it

ios - 如何在 Swift 中通过部分标签文本搜索来定位 XCUIElement?