C++ C++;-&引用;“未注册的类别”;

C++ C++;-&引用;“未注册的类别”;,c++,com,automation,ole,labview,C++,Com,Automation,Ole,Labview,我想把一个LabVIEW程序移植到C++中,它包含的OLE调用给了我一些麻烦。 LabView程序首先执行“自动打开”,即获取对接口“XLib.XInterface”(LabView将此表达式称为“ActiveX类”)的引用,然后调用在接口中找到的方法QA,最后再次关闭引用。我认为LabView从类型库中获取了它在接口上的信息,但我不能完全确定 我已尝试将一些代码改编为Word automation,我发现: 程序成功地查找了CLSID,但CoCreateInstance失败,声称该类未注册。我

我想把一个LabVIEW程序移植到C++中,它包含的OLE调用给了我一些麻烦。 LabView程序首先执行“自动打开”,即获取对接口“XLib.XInterface”(LabView将此表达式称为“ActiveX类”)的引用,然后调用在接口中找到的方法QA,最后再次关闭引用。我认为LabView从类型库中获取了它在接口上的信息,但我不能完全确定

我已尝试将一些代码改编为Word automation,我发现:

程序成功地查找了CLSID,但CoCreateInstance失败,声称该类未注册。我还尝试直接从类型库输入CLSID,绕过CLSIDFromProgID,但得到了相同的结果。不用说,LabVIEW程序工作得很好,而且我使用的C++代码在使用PrimID“Word。应用程序”时,没有任何麻烦来创建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这一事实有关。有人有更深刻的解释吗?

找到LabView COM组件所在的DLL,并从该文件夹类型的命令提示符中找到
regsvr32 LabViewDLLName.DLL
(当然,用LabView DLL的实际名称替换显而易见的名称)。这将为自动化类创建正确的注册表信息。使用SysInternals的ProcMon实用程序可以准确地找出程序在注册表中的查找位置以及此DLL可能具有的依赖项。
hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_IDispatch,
            (void **)&pWApp);