3

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

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

谢谢!

4

2 回答 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
于 2013-04-06T15:19:26.023 回答
0

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

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

例如,在 CodeBlocks 中转到 Project/Set Program's arguments ... 。这将启动一个对话框。您将带有完整路径的 xls 文件放在 Program Arguments 中(例如 C:\myexceltest.xls),并将 Excel 的路径放在 Host Application 字段中(例如 D:\Apps\MSO\Office10\EXCEL.EXE ... . 或您的 Excel.EXE 所在的任何位置)。

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

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

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

于 2017-09-25T19:40:46.477 回答