簡體   English   中英

通過GetModuleHandle / LoadLibrary加載DLL並使用FreeLibrary

[英]Loading DLL via GetModuleHandle/LoadLibrary and using 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嗎? 或者當我的申請終止時,它的引用計數會自動遞減?

我將從這里引用。

系統在所有已加載的模塊上維護每個進程的引用計數。 調用LoadLibrary會增加引用計數。 調用FreeLibrary或FreeLibraryAndExitThread函數會減少引用計數。 系統在其引用計數達到零或進程終止時(無論引用計數如何)卸載模塊。

所以基本上你不需要調用FreeLibrary但你應該考慮這樣做。 我個人認為,如果沒有正確處理資源,這是一個錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM