这里是我的代码:
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
但你应该考虑这样做。 我个人认为这是一个错误,当资源处理不当。