Загрузка DLL через GetModuleHandle / LoadLibrary и использование FreeLibrary - PullRequest
3 голосов
/ 09 сентября 2011

вот мой код:

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;

Нужно ли нам вызывать FreeLibrary при использовании LoadLibrary? или счетчик ссылок будет автоматически уменьшаться при завершении работы моего приложения?

1 Ответ

6 голосов
/ 09 сентября 2011

Я приведу от здесь .

Система поддерживает подсчет ссылок для каждого загруженного модуля. Вызов LoadLibrary увеличивает счетчик ссылок. Вызов функции FreeLibrary или FreeLibraryAndExitThread уменьшает счетчик ссылок. Система выгружает модуль, когда его счетчик ссылок достигает нуля или когда процесс завершается (независимо от счетчика ссылок).

Так что в принципе вам не нужно звонить FreeLibrary, но вы должны подумать об этом. Лично я считаю, что это ошибка, когда ресурсы обрабатываются неправильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...