2017-08-16 14 views
1

DLLファイルを使用すると、DLLファイルを削除する必要があります(コードが完了したらクリーンアップ)。VBA FreeLibraryはDLLをアンロードしません

私はExcelのVBAで "LoadLibrary"と "FreeLibrary"を使用してみますが、Excel.exeがDLLファイルに何をしていても試してみます。 DLLファイルは実際にまだによってロードされていることを示す

Path Access Error

とプロセスエクスプローラ:コマンドを「殺す」を実行するときに、私は次のエラーが表示され、「0」等しい「FreeResult」もかかわらず

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 

をエクセル:

Process Explorer

ファイルの名前は変更はなく、INDIとして(削除されていないことができますコードに記載されています)。

何か不足していますか?

+0

FreeLibは単に参照カウントをデクリメントお役に立てば幸いです。 FreeLibの戻り値を確認します。ゼロでなければ、実際にアンロードしていない。 – cyboashu

+0

@cyboashuありがとう!私はすでにそれをテストしており、これに対処するためにコードを更新しました。 FreeLibが0を返しても、私はまだエラーに遭遇します。 – Shrout1

答えて

0

あなたの問題の根本的な原因によって、これは役立つかもしれませんが、正しい方向への一歩だと思います。

FreeLibから0の戻り値はエラーとNOTライブラリが解放されたことがあったことを示し、ここを参照してください:https://msdn.microsoft.com/en-us/library/windows/desktop/ms683152%28v=vs.85%29.aspx

を私はLoadLibrary関数があったようFreeLibだけのように何度も呼び出されるべきで理解して何から

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 

:使用...そう、かなりの誤差までループより(FreeLib = 0)あなたの代わりにライブラリを解放して、ライブラリがまだロードされているかどうかを確認するループを持つことができ、このような何かをしようと表示されますGetModuleHandle(VBA7バージョン)を使用するには、この関数を宣言する必要があります:Private Declare PtrSafe Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal GetModuleHandle As String) As LongPtr

また、私はこのようなVBA7ためLongPtrとLOADLIBとFreeLibを宣言しています:

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 

は、それが:)

関連する問題