2011-11-17 33 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