VBA FreeLibrary不会卸载DLL

我需要删除一个DLL文件,当我完成使用它(代码完成后清理)。

我尝试使用Excel VBA中的“LoadLibrary”和“FreeLibrary”,但无论我做什么,Excel.exe都会附着到DLL文件中。

Public Declare PtrSafe Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long Public Declare PtrSafe Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long Private Sub Load_Unload_DLL() Dim lb As Long, pa As Long lb = LoadLibrary("C:\Users\Administrator\Documents\MathLibrary.dll") 'MsgBox "Library address: " & lb Dim FreeResult As Long FreeResult = 1 Do Until FreeResult = 0 FreeResult = FreeLibrary(lb) Loop Name "C:\Users\Administrator\Documents\MathLibrary.dll" As "C:\Users\Administrator\Documents\MathLibrary2.dll" Kill ("C:\Users\Administrator\Documents\MathLibrary2.dll") End Sub 

尽pipe“FreeResult”等于“0”,但在执行“Kill”命令时收到以下错误:

路径访问错误

和进程资源pipe理器显示DLL文件确实仍然由Excel加载:

Process Explorer

该文件可以重命名,但不能删除(如代码所示)。

我错过了什么吗?

这取决于你的问题的根源是什么,这可能会也可能没有帮助,但我认为这是朝着正确的方向迈出的一步。

FreeLib的返回值0表示出现错误,而不是库已经释放,请参阅: https : //msdn.microsoft.com/en-us/library/windows/desktop/ms683152%28v= vs.85%29.aspx

从我所了解的FreeLib应该只被调用多次LoadLibrary被使用…所以,而不是循环,直到出现一个错误(FreeLib = 0),你可以有一个循环,释放库,然后检查是否库仍然加载,尝试这样的事情:

  Do Until lb = 0 FreeLibrary lb If CBool(Err.LastDllError) Then debug.print "dll error" & " " & Err.LastDllError Err.Clear Exit Do End If lb = 0 ' Reset lb needed for test on next line ' Check if the dll really has been released... lb = GetModuleHandle("C:\Users\Administrator\Documents\MathLibrary.dll") Loop 

你需要声明这个函数来使用GetModuleHandle( VBA7版本): Private Declare PtrSafe Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal GetModuleHandle As String) As LongPtr

另外,我用LongPtrVBA7声明LoadLib和VBA7是这样的:

 Private Declare PtrSafe Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As LongPtr Private Declare PtrSafe Function FreeLibrary Lib "kernel32" (ByVal hLibModule As LongPtr) As Long 

希望能帮助到你 :)