BasePlugins.pas
上传用户:yj_qiu
上传日期:2022-08-08
资源大小:23636k
文件大小:3k
源码类别:

游戏引擎

开发平台:

Delphi

  1. (*
  2.  @Abstract(Basic plugins interface unit)
  3.  (C) 2006-2007 George "Mirage" Bakhtadze. <a href="http://www.casteng.com">www.casteng.com</a> <br>
  4.  Created: Aug 17, 2007 <br>
  5.  Unit contains base plugin interface class
  6. *)
  7. unit BasePlugins;
  8. interface
  9. type
  10.   TLoadPluginResult = (lpOK, lpLoadPackageFail, lpRegisterNotCalled);
  11.   TClasses = array of TClass;
  12.   
  13.   TPackageInfo = record
  14.     Name, FileName, Description: string;
  15.     Handle: HModule;
  16.     ClassesAdded: TClasses;
  17.   end;
  18.   TPluginSystem = class
  19.   private
  20.     LoadedPackages: array of TPackageInfo;
  21.     RegisterPluginCalled: Boolean;
  22.     function GetPlugin(Index: Integer): TPackageInfo;
  23.     function GetTotalPlugins: Integer;
  24.   protected
  25.     /// Called by RegisterPlugin
  26.     procedure RegisterClasses(AClasses: array of TClass); virtual; abstract;
  27.   public
  28.     /// Called by an application to load a plugin
  29.     function LoadPlugin(const FileName: string): TLoadPluginResult;
  30.     /// Should be called by a plugin from its initialization part to register itself
  31.     procedure RegisterPlugin(const AName, ADescription: string; AClasses: array of TClass);
  32.     property TotalPlugins: Integer read GetTotalPlugins;
  33.     property Plugin[Index: Integer]: TPackageInfo read GetPlugin;
  34.   end;
  35. var
  36.   PluginSystem: TPluginSystem;
  37. implementation
  38. uses SysUtils;
  39. { TC2EdPluginSystem }
  40. function TPluginSystem.GetPlugin(Index: Integer): TPackageInfo;
  41. begin
  42.   Assert((Index >= 0) and (Index < TotalPlugins), 'TPluginSystem.GetPlugin: Invalid index');
  43.   if (Index < 0) or (Index >= TotalPlugins) then Exit;
  44.   Result := LoadedPackages[Index];
  45. end;
  46. function TPluginSystem.GetTotalPlugins: Integer;
  47. begin
  48.   Result := Length(LoadedPackages);
  49. end;
  50. function TPluginSystem.LoadPlugin(const FileName: string): TLoadPluginResult;
  51. var Handle: HModule;
  52. begin
  53.   try
  54.     RegisterPluginCalled := False;
  55.     Handle := LoadPackage(FileName);
  56.   except
  57.     Handle := 0;
  58.   end;
  59.   if Handle = 0 then Result := lpLoadPackageFail else
  60.     if not RegisterPluginCalled then Result := lpRegisterNotCalled else
  61.       Result := lpOK;
  62.   if Result = lpOK then begin
  63.     LoadedPackages[High(LoadedPackages)].Handle   := Handle;
  64.     LoadedPackages[High(LoadedPackages)].FileName := FileName;
  65.   end;
  66. end;
  67. procedure TPluginSystem.RegisterPlugin(const AName, ADescription: string; AClasses: array of TClass);
  68. var i: Integer;
  69. begin
  70.   SetLength(LoadedPackages, Length(LoadedPackages)+1);
  71.   RegisterPluginCalled := True;
  72.   LoadedPackages[High(LoadedPackages)].Name         := AName;
  73.   LoadedPackages[High(LoadedPackages)].Description  := ADescription;
  74.   SetLength(LoadedPackages[High(LoadedPackages)].ClassesAdded, Length(AClasses));
  75.   for i := 0 to High(AClasses) do LoadedPackages[High(LoadedPackages)].ClassesAdded[i] := AClasses[i];
  76.   RegisterClasses(LoadedPackages[High(LoadedPackages)].ClassesAdded);
  77. end;
  78. initialization
  79. finalization
  80.   FreeAndNil(PluginSystem);
  81. end.