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并操作其对象的唯一方法。