windows - Indlæser DLL via GetModuleHandle/LoadLibrary og bruger FreeLibrary

Indlæg af Hanne Mølgaard Plasc

Problem



her er min kode:


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;


Skal vi ringe FreeLibrary, hvis du bruger LoadLibrary? eller vil dens referencetælling blive reduceret automatisk, når min ansøgning ophører?

Bedste reference


Jeg vil citere herfra. [3]



  Systemet opretholder et referencetal pr. Proces på alle indlæste moduler. Opkald LoadLibrary øger referencetællingen. At kalde funktionen FreeLibrary eller FreeLibraryAndExitThread reducerer referencetællingen. Systemet aflæser et modul, når dets referencetælling når nul eller når processen afsluttes (uanset referencetællingen).



Så stort set behøver du ikke at ringe FreeLibrary, men du bør overveje at gøre det. Jeg tror personligt, det er en fejl, når ressourcerne ikke håndteres korrekt.