2011-09-09 23 views
3

を使用しては私のコードです:ロードDLLのGetModuleHandle/LoadLibraryを経て、ここにFreeLibrary

function GetProcedureAddress(var P: FARPROC; const ModuleName, ProcName: AnsiString): Boolean; 
var 
    ModuleHandle: HMODULE; 
begin 
    Result := False; 
    ModuleHandle := GetModuleHandle(PAnsiChar(AnsiString(ModuleName))); 
    if ModuleHandle = 0 then 
    ModuleHandle := LoadLibrary(PAnsiChar(ModuleName)); // DO WE NEED TO CALL FreeLibrary ? 
    if ModuleHandle <> 0 then 
    begin 
    P := Pointer(GetProcAddress(ModuleHandle, PAnsiChar(ProcName))); 
    if Assigned(P) then 
     Result := True; 
    end; 
end; 

function PathMakeSystemFolder(Path: AnsiString): Boolean; 
var 
    _PathMakeSystemFolderA: function(pszPath: PAnsiChar): BOOL; stdcall; 
begin 
    Result := False; 
    if GetProcedureAddress(@_PathMakeSystemFolderA, 'shlwapi.dll', 'PathMakeSystemFolderA') then 
    Result := _PathMakeSystemFolderA(PChar(Path)); 
end; 

我々はLoadLibraryのを使用している場合にFreeLibraryを呼び出す必要がありますか?またはアプリケーションの終了時に参照カウントが自動的に減少しますか?

+0

AnsiStringにAnsiStringを型キャストする必要はありません。GetProcedureAddressのModuleNameを参照しています。 –

+0

あなたは正しいです。 – kobik

+0

プロセスによって取得されたすべてのオブジェクトは、終了時に解放されます。しかし、もはや必要がなくなったら解放するのがよい習慣です。 –

答えて

6

hereから引用します。

システムは、ロードされたすべてのモジュールでプロセスごとの参照カウントを維持します。 LoadLibraryを呼び出すと、参照カウントがインクリメントされます。 FreeLibraryまたはFreeLibraryAndExitThread関数を呼び出すと、参照カウントが減少します。モジュールは、参照カウントがゼロになったとき、またはプロセスが終了したときにモジュールをアンロードします(参照カウントに関係なく)。

したがって、基本的にFreeLibraryに電話する必要はありませんが、そうすることを検討する必要があります。私は個人的には、リソースが正しく処理されないときはバグだと思っています。

+0

はい、しかし私がライブラリを解放すれば初期参照カウントが0の場合、GetModuleHandleは動作しません。したがって、基本的には、モジュールがまだマップされていないことを考慮して、アプリケーションの参照カウントを1だけインクリメントします。 – kobik

+2

@kobik - 参照カウントを1または10だけ増やしても問題ありません.dllはプロセスアドレス空間に1回だけマップされます。 GetModuleHandleに対してResourceLiseに対してLoadLibraryを使用すると、ペナルティは発生しません。答えが意味することは、あなたがそれを終えた時に図書館を解放することが良い習慣であるということです。 –

+0

基本的に私のprocuderで "GetModuleHandle"を使用する必要はないと言っていますか?常にLoadLibraryを使用しますか? – kobik

関連する問題