这是我之前的Question about GetObject此代码的后续跟踪:
Dim wb As Object ' Lotus123.Document
wb = GetObject("S:\Temp\T\0375D.WK3", "Lotus123.Workbook")
在VBA中正常工作但在VB.net中失败并出现错误:FileNotFoundException:“在自动化操作期间找不到文件名或类名。”
我使用Process Monitor检查了该过程,发现: 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:\ lotus \ 123 \ 123w.exe VBA继续使用指定的文件打开123w.exe程序。
那为什么VB.net不能找到类名呢?我不明白为什么它只是放弃了。
答案 0 :(得分:0)
由于某种原因,VB.net找不到类名“Lotus123.Workbook”,所以我尝试获取没有类名的文件,它工作正常。
Dim wb As Object ' Lotus123.Document
wb = GetObject("S:\Temp\T\0375D.WK3")
答案 1 :(得分: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 64bit中,wb = GetObject(sFile)
不起作用;只是挂了。
答案 2 :(得分:-1)
您需要安装office api或PIA(主互操作程序集)才能实现此功能
你可以在这里找到PIA for office 2010 http://www.microsoft.com/en-us/download/details.aspx?id=3508
通过搜索谷歌找到其他版本