2013-04-06 61 views
1

我目前正在使用C++和Excel工作。我做了一个DLL来导出Excel中的C++函数。我的问题是,当我在Excel中测试我的函数并且想要修改我的DLL时,我需要退出Excel,因为它仍在运行.dll文件,并且Visual Studio C++无法删除以前的DLL来创建其他DLL。在Excel中关闭对DLL的访问

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

谢谢!你可以使用

+0

我敢肯定没有太多的选择,因为该DLL是用Excel本身加载。 – 2013-04-06 10:52:30

+0

您是否曾尝试在VBA脚本的开头/结尾处添加/删除引用? – Mike 2013-04-06 13:03:10

+0

如果在VBA立即窗口中键入'End',那么应该这样做。你也可以把'End'放在你的VBA脚本的末尾,它有时会卸载DLL,但并不总是我找到的。 – 2016-06-23 21:15:05

回答

0

一种方法是运行一个单独的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

这确实让我删除了DLL,但是当我用修改后的DLL替换它时,Excel崩溃了。任何想法为什么? – 2014-08-09 20:11:56

0

自动化Excel打开/关闭的另一种方法是使用IDE的功能(如果有的话)为您执行此操作。例如,CVF,IVF和CodeBlocks均提供启动Excel并运行addin/dll(并实时调试)的功能。

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

然后只是运行或调试,它会自动工作。当你运行它时,你不能改变DLL,但是可以明确地关闭Excel或者从IDE关闭Excel,然后返回源代码,进行更改,然后单击运行或IDE中的任何内容,并且Bob的叔叔Excel和你的.xls将会自动启动。

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

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