2011-11-17 21 views
3

我试图将一个LabView程序移植到C++,并且OLE调用它包含给我一些麻烦。 (LabView将此表达式称为“ActiveX类”),然后调用在接口中找到的方法QA,即“自动化打开”,即获取对接口“XLib.XInterface”的引用最后再次关闭参考。我认为LabView从类型库的接口获取它的信息,但我并不确定。C++的OLE自动化问题 - “类未注册”

我试着去适应用于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

查找其中的LabView COM组件是从DLL,并从该文件夹类型的命令提示'REGSVR32 LabViewDLLName.dll'(用LabView的DLL的实际名称替换明显,当然)。这将为自动化类创建正确的注册表信息。 –

+1

使用SysInternals的ProcMon实用程序可以准确找出您的程序在注册表中的位置以及此DLL可能具有的依赖关系。 –

回答

0

OK,我想我想通了我自己,尽管我不完全理解我的解决方案。无论如何,当我使用

hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_IDispatch, 
      (void **)&pWApp); 

它似乎工作;至少我没有得到“班级未注册”的错误了。区别在于用CLSCTX_ALL替换参数CLSCTX_LOCAL_SERVER。我认为这与我使用dll的事实有关。有没有人有更深刻的解释?

+1

http://blogs.msdn.com/b/larryosterman/archive/2004/10/12/241420.aspx可能会帮助 – leonigmig

+0

谢谢,它帮助:) – xqrp