首页 文章

在Excel中关闭对dll的访问

提问于
浏览
2

我目前正在使用C和Excel开展项目 . 我制作了一个DLL来导出Excel中的C函数 . 我的问题是,当我在Excel中测试我的功能并且我想修改我的DLL时,我需要退出Excel,因为它仍然在运行.dll文件,并且Visual Studio C无法删除以前的DLL来制作另一个 .

每次关闭并重新启动Excel都有点烦人,所以我想知道在VBA脚本完成时是否有办法关闭对Dll的访问 .

谢谢!

2 回答

  • 0

    你可以使用的一种方法是运行一个单独的excel实例并像这样自动打开/关闭excel ...(这是我在浏览器中输入的伪代码)

    Sub TestMyDll()
      Dim xl as New Excel.Application
      xl.Workbooks.Open "file"
      xl.Run "MyFunctionCall"
      xl.Workbooks(1).Close False
      xl.Quit
      Set xl = Nothing
    End Sub
    

    第二种方法是动态加载和卸载dll . 这可能是我会使用的方法 . 作为测试,我将Winhttp.dll复制到另一个目录并将其命名为my.dll . 不要将dll放在与包含代码的工作簿相同的目录中,否则excel可能会加载dll .

    Option Explicit
    
    Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
    Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
    
    'my.dll is a copy of Winhttp.dll in a directory other than where this workbook is saved.
    'Calling this will result in an error unless you call LoadLibrary first
    Private Declare Function WinHttpCheckPlatform Lib "my.dll" () As Long
    
    Private Sub Foo()
        Dim lb As Long
    
        lb = LoadLibrary("C:\Users\David\Downloads\my.dll")
    
        MsgBox WinHttpCheckPlatform
    
        'I found I had to do repeated calls to FreeLibrary to force the reference count
        'to zero so the dll would be unloaded.
        Do Until FreeLibrary(lb) = 0
        Loop
    End Sub
    
  • 0

    自动化Excel打开/关闭的另一种方法是使用IDE的功能(如果有的话)为您执行此操作 .

    例如,CVF,IVF和CodeBlocks各自提供启动Excel和运行addin / dll(并实时调试)的工具 .

    例如,在CodeBlocks中转到Project / Set Program的参数....这将启动一个对话框 . 您将xls文件的完整路径放在Program Arguments(例如C:\ myexceltest.xls)中,然后将paht放入Host Application字段中的Excel(例如D:\ Apps \ MSO \ Office10 \ EXCEL.EXE ... . 或Excel.EXE所在的位置) .

    然后只需运行或调试,它就会自动运行 . 您无法在运行时更改DLL,但是显式或从IDE关闭Excel会让您回到源代码,进行更改,只需单击运行或IDE中的任何内容,Bob就是您的叔叔Excel和.xls将自动启动 .

    如果您在源代码中设置了断点,那么在IDE中运行Debug将允许您实时调试DLL .

    这适用于任何语言(例如,这适用于Fortran DLL等)

相关问题