2014-01-09 176 views
1

這是一個後續行動,我以前Question about GetObject此代碼VB.net找到類名: FileNotFoundException:「自動化操作期間未找到文件名或類名」。爲什麼不能使用GetObject的

我檢查了與過程進程監視器,發現: VBA和VB.net檢查這些鍵:

HKCR\Lotus123.Workbook\CLSID\(Default) 
HKCR\CLSID\{29130007-2EED-1069-BF5D-00DD011186B7} 
HKCU\Software\Classes 

然後VB.net簡單地停止

但VBA不斷用這些去鍵

HKLM\SOFTWARE\Microsoft\COM3\REGDBVersion 
HKCR\CLSID\{29130007-2EED-1069-BF5D-00DD011186B7}\InprocServer32 NAME NOT FOUND 
HKCR\CLSID\{29130007-2EED-1069-BF5D-00DD011186B7}\InprocServerX86 NAME NOT FOUND 
HKCR\CLSID\{29130007-2EED-1069-BF5D-00DD011186B7}\InprocServer32 NAME NOT FOUND 
HKCR\CLSID\{29130007-2EED-1069-BF5D-00DD011186B7}\InprocServerX86 NAME NOT FOUND 
HKCR\CLSID\{29130007-2EED-1069-BF5D-00DD011186B7}\LocalServer32 SUCCESS 
HKCR\CLSID\{29130007-2EED-1069-BF5D-00DD011186B7}\LocalServer32\(Default) SUCCESS 

最後一個給予獎勵:數據:C:\蓮花\ 123 \ 123w.exe 和VBA接着打開123w.exe PROG內存與指定的文件。

那麼爲什麼不能找到VB.net的類名呢?我不明白爲什麼它只是放棄尋找。

+0

VBA通​​常是32位的。你的VB.NET應用程序有多少點? – Heinzi

+0

@Heinzi我的VB.net是32位也 –

回答

0

似乎存在文件名(得到電子表格文檔)和Lotus123.Workbook返回應用程序對象的父對象之間的失配。

以下代碼適用於XP 32位以及Win8 64位。我用流程監視器檢查了引擎蓋下發生了什麼。 CreateObject使用給定的對象檢查註冊表中的CLSID。然後它使用CLSID查找必要的信息。

Public Shared Function GetLotusWB(ByVal sFile As String) As Object 

    'HKCU takes precedence if exists 
    'HKCU\Software\Classes\Lotus123.Workbook\CLSID 
    'HKCU\Software\Classes\CLSID\{29130007-2EED-1069-BF5D-00DD011186B7} 

    'normally this is used because Lotus123 doesn't create HKCU entries 
    'HKCR\Lotus123.Workbook\CLSID = {29130007-2EED-1069-BF5D-00DD011186B7} 
    'HKCR\CLSID\{29130007-2EED-1069-BF5D-00DD011186B7}\InprocHandler32 = ole32.dll 
    'HKCR\CLSID\{29130007-2EED-1069-BF5D-00DD011186B7}\LocalServer32 = C:\Lotus\123\123w.exe 

    'using object as that sometimes works better 
    Dim LotusObj As Object = CreateObject("Lotus123.Workbook") 

    'get application 
    'need a reference to Lotus 123 else declare as Object 
    Dim LotusApp As Lotus123.Application = LotusObj.Application 
    'FAILS: LotusApp.Visible = True 

    'open file; also works fine As Lotus123.Document 
    Dim ldoc As Object = LotusApp.OpenDocument(sFile) 

    'visible and activate (must declare as Object else gives exception) 
    Dim appObject As Object = ldoc.Application 
    appObject.Visible = True 
    ldoc.Activate() 

    Return ldoc 

End Function 

在VB.net,這不起作用Dim wb As Object: wb = GetObject(sFile, "Lotus123.Workbook")(在VBA工作)

在Win8的64位這個wb = GetObject(sFile)不起作用;只是掛起。

+0

AFAIK GetObject/CreateObject是實例化Lotus123並操作其對象的唯一方法。 –

-1

你需要安裝office API或PIA(主互操作程序集),以獲得這方面的工作

你可以找到PIA於2010年在這裏辦公 http://www.microsoft.com/en-us/download/details.aspx?id=3508

通過谷歌搜索

+0

也許有一個誤解:我不想使用Excel或VBA(或其PIA)。我只是用VBA來測試VB.net無法正常工作的代碼。我想從VB.net啓動Lotus123。所以我不認爲Excel,VBA或Office PIA是相關的。 –

+0

另外我已經安裝了Office PIA。 –

+0

當你使用類名稱調用getobject .net搜索指定對象(OLE註冊對象)的互操作庫時,所以如果你想使用lotus123搜索什麼api支持蓮花提供它與.net或getobject無關 –

0

對於找到其他版本某些原因VB.net無法找到類名「Lotus123.Workbook」,所以我試圖得到沒有類名的文件,它工作正常。

Dim wb As Object ' Lotus123.Document 
wb = GetObject("S:\Temp\T\0375D.WK3") 
+0

但在Win8 64位這個答案不起作用。它只是掛起;沒有例外,沒有任何東西。 –