【发布时间】:2017-08-16 19:23:22
【问题描述】:
我需要在使用完 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
尽管“FreeResult”等于“0”,但我在执行“Kill”命令时收到以下错误:
进程资源管理器显示 DLL 文件确实仍由 Excel 加载:
文件可以重命名,但不能删除(如代码所示)。
我错过了什么吗?
【问题讨论】:
-
FreeLib 只是减少引用计数。检查 FreeLib 返回值。如果它不为零,那么您实际上还没有卸载它。
-
@cyboashu 谢谢!我已经对此进行了测试,并更新了我的代码来解决这个问题。即使 FreeLib 返回 0 我仍然遇到错误。
-
我不推荐使用
FreeLibrary的循环。我试过在有和没有GetModuleHandle的情况下这样做,但它有点不稳定。更多详情here
标签: excel vba dll delete-file