无法使用AddFromFile添加DLL引用

时间:2013-08-19 18:09:42

标签: excel vba dll com

我正在尝试使用Excel VBA中的COM可见.NET DLL。我在使用regasm注册DLL然后通过Tools - >手动添加引用时成功了。 VBA开发人员窗口中的引用菜单项。

但是,我现在尝试在不使用regasm命令的情况下注册DLL,以便可以在任何计算机上使用Excel文件而无需注册DLL。到目前为止,这是我尝试过的:

Dim JART_Instance As Object

Sub Initialize()
    Dim RefPath As String, X As Byte
    Const RefName = "JART xxx"
    RefPath = Application.ActiveWorkbook.Path & "\JART\JART.dll"

    With ActiveWorkbook.VBProject.References
        For X = 1 To .Count
            If .Item(X).Description Like RefName Then
                .Remove .Item(X)
            End If
        Next
       .AddFromFile (RefPath)
    End With
End Sub

Sub PostInitialize()
    Set JART_Instance = New JART.MainJobControl
End Sub

我添加了对“Microsoft Visual Basic for Applications Extensibility 5.3”的引用。当我运行上面的代码时,我得到“运行时错误'48':加载DLL时出错”。我用regasm加载了这个DLL几次。我是否需要执行更改项目中使用的GUID并重试的操作。我已经看到了代码示例,它应该可以工作。

如果我引用tlb文件而不是.dll我没有得到DLL加载错误。相反,每当我尝试使用JART_Instance变量表示尚未设置引用时,我都会收到错误。即使在Initialize之后直接调用PostInitialize并且没有证据表明任何代码引发了错误或无法运行。如果我尝试在PostInitialize函数中放置一个“停止”命令,它会告诉我“此时无法进入中断模式”。

任何想法,谢谢。

2 个答案:

答案 0 :(得分:1)

Excel-DNA有一个辅助函数,可以为在该平台上编写的Com Addins执行此操作。

似乎:

  1. 加载插件
  2. 将其注册到CoRegisterClassObject
  3. 将其progid添加到注册表
  4. 将其添加到注册表项HKCU \ Software \ Microsoft \ Office \ Excel \ Addins
  5. 在Excel中调用Application.ComAddins.Update
  6. 删除所有以前的注册表项
  7. 使用CoRevokeClassObject取消注册对象
  8. 一旦Excel加载了插件,它就会在删除注册表项并调用CoRevokeClassObject时不会卸载。它会保持加载状态,直到Excel关闭并释放它。

    所以,这是可行的但不容易。

答案 1 :(得分:0)

好的,所以我使用shell命令用regasm注册DLL。这是我的代码:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim strWinCmd As String
    Dim retVal As Double
    strWinCmd = "cmd.exe %SystemRoot%\Microsoft.NET\Framework\v2.0.50727\regasm.exe /u /codebase /tlb .\JART\JART.dll"
    retVal = Shell(strWinCmd, vbHide)
End Sub

Private Sub Workbook_Open()
    Dim strWinCmd As String
    Dim retVal As Double
    strWinCmd = "cmd.exe /c %SystemRoot%\Microsoft.NET\Framework\v2.0.50727\regasm.exe /codebase /tlb """ & Application.ActiveWorkbook.Path & "\JART\JART.dll"""
    Call Shell(strWinCmd, vbNormalFocus)

    Call Button_Handlers.Sleep(1500)

    Call Button_Handlers.Initialize
End Sub

作为参考,Button_Handlers.Sleep只调用系统睡眠方法,Button_Handlers.Initialize执行此操作:

Sub Initialize()
    'This JART.MainJobControl is the main class in the JART DLL
    Set JART_Instance = New JART.MainJobControl
    'Use JART_Instance
End Sub

所以基本上我试图在启动时注册DLL并在关闭时取消注册。我的问题是,当我在新PC上打开此文件时,我在Button_Handlers.Initialize中出错。它告诉我,我正在尝试使用未定义的类(JART.MainJobControl),就像没有引用DLL一样。如果我尝试重新打开文件,一切正常???

我这样做的方法是在已经用regasm注册的机器上手动添加对DLL的引用。然后我保存这个excel文件并将其传输到没有注册DLL的机器,并尝试打开它并运行它。我认为,由于引用已经添加到excel文件中,所以代码所要做的就是用regasm注册它。有谁知道为什么这不起作用?我睡得不够久。我可以将此作为一个单独的问题发布。