在Excel中closures对dll的访问

我目前正在使用C ++和Excel工作。 我做了一个DLL在Excel中导出一个C ++函数。 我的问题是,当我在Excel中testing我的function,我想修改我的DLL,我需要退出Excel,因为它仍然运行.dll文件,Visual Studio C + +不能删除以前的DLL来做另一个。

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

谢谢!

你可以使用的一种方法是运行一个单独的Excel实例,并像这样自动打开/closuresExcel …(这是我在浏览器中input的伪代码)

 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 

第二种方法是dynamic加载和卸载DLL。 这可能是我会用的方法。 作为一个testing,我将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 

自动化Excel打开/closures的另一种方法是使用IDE的function(如果有的话)为您执行此操作。

例如,CVF,IVF和CodeBlocks都提供启动Excel和运行addin / dll(并实时debugging)的function。

作为一个例子,在CodeBlocks中进入Project / Set Program的参数…。 这将启动一个对话框。 您将您的xls文件与程序参数(例如C:\ myexceltest.xls)中的完整path,并将您的paht到主机应用程序字段中的Excel(例如D:\ Apps \ MSO \ Office10 \ EXCEL.EXE … 。或任何您的Excel.EXE位于)。

然后运行或debugging,它会自动工作。 你不能在运行DLL的时候改变DLL,但是要明确地closuresExcel或者从IDE中closuresExcel,回到你的源代码,进行修改,只需要点击运行或者其他任何东西在你的IDE和Bob的你的叔叔Excel和你的.xls自动启动。

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

这应该适用于任何语言(例如,这与Fortran DLL的工作等)