为什么VB.net不能使用GetObject查找类名

时间:2014-01-09 05:17:39

标签: vb.net process createobject

这是我之前的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不能找到类名呢?我不明白为什么它只是放弃了。

3 个答案:

答案 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

通过搜索谷歌找到其他版本