关闭对Excel中dll的访问

Close access to a dll in Excel

本文关键字:dll 访问 Excel      更新时间:2023-10-16

我目前正在使用c++和Excel进行一个项目。我制作了一个DLL来导出Excel中的c++函数。我的问题是,当我在Excel中测试我的函数时,我想修改我的DLL,我需要退出Excel,因为它仍然在运行。DLL文件,Visual studio c++不能删除以前的DLL来创建另一个。

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

谢谢!

你可以使用的一种方法是运行一个单独的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:UsersDavidDownloadsmy.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

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

例如,CVF、IVF和CodeBlocks都提供了启动Excel和运行插件/dll(以及实时调试)的功能。

作为一个例子,在CodeBlocks中进入项目/设置程序的参数... .这将启动一个对话框。你把你的xls文件的完整路径在程序参数(例如C:myexceltest.xls),你把Excel的路径在主机应用程序字段(例如D:AppsMSOOffice10 Excel . exe ....)或者无论你的Excel.EXE在哪里)。

然后只需运行或调试,它就会自动工作。你不能在运行的时候修改DLL,但是直接关闭Excel或者在IDE中关闭Excel会让你回到你的源代码,在你的IDE中做一些改变,然后点击运行或者其他什么,你的Excel和。xls就会自动启动。

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

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