对于DELPHI来说,总共支持俩种类型的插件:DLL和BPL方式的插件。
对于比较完美的插件框架来说,俩种类型的插件都要支持。
unit DLLLoader;
interface
uses windows, Classes, SysUtils, Forms, StrUtils;
type TLibraryType = (dll, bpl); // plugin type: dll or bpl
TDLLLoader = class(TObject) private FHandle: THandle; FFileName: string; FLibraryType: TLibraryType; procedure SetFileName(const Value: string); protected function GetApplicationPath: string; public constructor Create(DllFileName: string); destructor destroy(); override; procedure FreeHandle(); virtual; property FileName: string read FFileName write SetFileName; property DLLHandle: THandle read FHandle; end;
implementation
{ TDLLLoader }
constructor TDLLLoader.Create(DllFileName: string); var ext: string; begin ext := RightStr(DllFileName, 4); if ext = '.dll' then FLibraryType := dll else if ext = '.bpl' then FLibraryType := bpl; FileName := DLLFileName; end;
destructor TDLLLoader.destroy; begin FreeHandle; inherited; end;
procedure TDLLLoader.FreeHandle; begin if FHandle <> 0 then case FLibraryType of dll: FreeLibrary(FHandle); bpl: UnloadPackage(FHandle); end; end;
function TDLLLoader.GetApplicationPath: string; begin result := ExtractFilePath(Application.ExeName); end;
procedure TDLLLoader.SetFileName(const Value: string); begin if FFileName <> Value then begin FFileName := Value; case FLibraryType of dll: FHandle := LoadLibrary(PChar(FFileName)); bpl: FHandle := LoadPackage(FFileName) end; if FHandle = 0 then raise Exception.Create(Value + 'load plugin fail.'); end; end;
end.
|