Vb.net 为什么可以';net使用GetObject查找类名
这是我之前的代码的后续:Vb.net 为什么可以';net使用GetObject查找类名,vb.net,process,createobject,Vb.net,Process,Createobject,这是我之前的代码的后续: 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\CL
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
最后一个给出奖励:Data:c:\lotus\123\123w.exe
VBA继续打开带有指定文件的123w.exe程序
那么为什么VB.net找不到类名呢?我不明白为什么它只是停止查看。您需要安装office api或PIA(主互操作程序集)才能正常工作 你可以在这里找到office 2010的PIA
通过搜索google查找其他版本由于某些原因VB.net找不到类名“Lotus123.Workbook”,所以我尝试获取没有类名的文件,效果很好
Dim wb As Object ' Lotus123.Document
wb = GetObject("S:\Temp\T\0375D.WK3")
文件名(gets电子表格文档)和返回应用程序对象父对象的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)
不起作用;只是挂了 VBA通常是32位的。你的VB.NET应用程序是多少位?@Heinzi我的VB.NET也是32位的,可能有一个误解:我不想使用Excel或VBA(或其PIA)。我只是使用VBA来测试在VB.net中无法正常工作的代码。我想从VB.net启动Lotus123。因此,我认为Excel、VBA或Office PIA根本不相关。当您调用类名为.net的getobject时,会搜索指定对象(OLE注册对象)的互操作库。因此,如果您想使用lotus123搜索lotus提供的api支持,则与.net或getobjectWell无关。文档中说使用getobject。CLSID指向.exe,而不是像Excel那样指向PIA。所以Lotus似乎连PIA都没有,但一旦我有了Lotus123.Workbook,操作它公开的对象就不是问题了。你说的“OLE注册对象”是什么意思?如何判断Lotus123是否是OLE注册的。我假设答案是肯定的,因为我可以在我的项目中添加对Lotus123的COM引用。已将文件(Interop.Lotus123.dll)添加到\obj\Debug文件夹中。有趣…但在Win8 64位中,这个答案不起作用。它只是挂着;没有例外,什么都没有。AFAIK GetObject/CreateObject是实例化Lotus123并操作其对象的唯一方法。