国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 編程 > Delphi > 正文

插件管理框架 for Delphi(二)

2020-01-31 20:52:35
字體:
供稿:網(wǎng)友
unit untDllManager;

interface

uses
  Windows, Classes, SysUtils, Forms;

type

  EDllError = Class(Exception);

  TDllClass = Class of TDll;
  TDll = Class;

  TDllEvent = procedure(Sender: TObject; ADll: TDll) of Object;

  { TDllManager
    o 提供對 Dll 的管理功能; 
    o Add 時自動創(chuàng)建 TDll 對象,但不嘗試裝載;
    o Delete 時自動銷毀 TDll 對象;
  }

  TDllManager = Class(TList)
  private
    FLock: TRTLCriticalSection;
    FDllClass: TDllClass;
    FOnDllLoad: TDllEvent;
    FOnDllBeforeUnLoaded: TDllEvent;
    function GetDlls(const Index: Integer): TDll;
    function GetDllsByName(const FileName: String): TDll;
  protected
    procedure Notify(Ptr: Pointer; Action: TListNotification); override;
  public
    constructor Create;
    destructor Destroy; override;
    function Add(const FileName: String): Integer; overload;
    function IndexOf(const FileName: String): Integer; overload;
    function Remove(const FileName: String): Integer; overload;
    procedure Lock;
    procedure UnLock;
    property DllClass: TDllClass read FDllClass write FDllClass;
    property Dlls[const Index: Integer]: TDll read GetDlls; default;
    property DllsByName[const FileName: String]: TDll read GetDllsByName;
    property OnDllLoaded: TDllEvent read FOnDllLoad write FOnDllLoad;
    property OnDllBeforeUnLoaded: TDllEvent read FOnDllBeforeUnLoaded write FOnDllBeforeUnLoaded;
  end;

  { TDll
    o 代表一個 Dll, Windows.HModule
    o 銷毀時自動在 Owner 中刪除自身;
    o 子類可通過覆蓋override DoDllLoaded, 以及DoDllUnLoaded進(jìn)行功能擴(kuò)展;
  }

  TDll = Class(TObject)
  private
    FOwner: TDllManager;
    FModule: HMODULE;
    FFileName: String;
    FPermit: Boolean;
    procedure SetFileName(const Value: String);
    function GetLoaded: Boolean;
    procedure SetLoaded(const Value: Boolean);
    procedure SetPermit(const Value: Boolean);
  protected
    procedure DoDllLoaded; virtual;
    procedure DoBeforeDllUnLoaded; virtual;
    procedure DoDllUnLoaded; virtual;
    procedure DoFileNameChange; virtual;
    procedure DoPermitChange; virtual;
  public
    constructor Create; virtual;
    destructor Destroy; override;
    function GetProcAddress(const Order: Longint): FARPROC; overload;
    function GetProcAddress(const ProcName: String): FARPROC; overload;
    property FileName: String read FFileName write SetFileName;
    property Loaded: Boolean read GetLoaded write SetLoaded;
    property Owner: TDllManager read FOwner;
    property Permit: Boolean read FPermit write SetPermit;
  end;

implementation

{ TDll }

constructor TDll.Create;
begin
  FOwner := nil;
  FFileName := ´´;
  FModule := 0;
  FPermit := True;
end;

destructor TDll.Destroy;
var
  Manager: TDllManager;
begin
  Loaded := False;
  if FOwner <> nil then
  begin
    //在擁有者中刪除自身
    Manager := FOwner;
    //未防止在 TDllManager中重復(fù)刪除,因此需要將
    //FOwner設(shè)置為 nil; <-- 此段代碼和 TDllManager.Notify 需要配合
    //才能確保正確。 
    FOwner := nil;
    Manager.Remove(Self);
  end;
  inherited;
end;

function TDll.GetLoaded: Boolean;
begin
  result := FModule <> 0;
end;

function TDll.GetProcAddress(const Order: Longint): FARPROC;
begin
  if Loaded then
    result := Windows.GetProcAddress(FModule, Pointer(Order))
  else
    raise EDllError.CreateFmt(´Do Load before GetProcAddress of "%u"´, [DWORD(Order)]);
end;

function TDll.GetProcAddress(const ProcName: String): FARPROC;
begin
  if Loaded then
    result := Windows.GetProcAddress(FModule, PChar(ProcName))
  else
    raise EDllError.CreateFmt(´Do Load before GetProcAddress of "%s"´, [ProcName]);
end;

procedure TDll.SetLoaded(const Value: Boolean);
begin
  if Loaded <> Value then
  begin
    if not Value then
    begin
      Assert(FModule <> 0);
      DoBeforeDllUnLoaded;
      try
        FreeLibrary(FModule);
        FModule := 0;
      except
        Application.HandleException(Self);
      end;
      DoDllUnLoaded;
    end
    else
    begin
      FModule := LoadLibrary(PChar(FFileName));
      try
        Win32Check(FModule <> 0);
        DoDllLoaded;
      except
        On E: Exception do
        begin
          if FModule <> 0 then
          begin
            FreeLibrary(FModule);
            FModule := 0;
          end;
          raise EDllError.CreateFmt(´LoadLibrary Error: %s´, [E.Message]);
        end;
      end;
    end;
  end;
end;

procedure TDll.SetFileName(const Value: String);
begin
  if Loaded then
    raise EDllError.CreateFmt(´Do Unload before load another Module named: "%s"´,
      [Value]);
  if FFileName <> Value then
  begin
    FFileName := Value;
    DoFileNameChange;
  end;
end;

procedure TDll.DoFileNameChange;
begin
  // do nonthing.
end;

procedure TDll.DoDllLoaded;
begin
  if Assigned(FOwner) and Assigned(FOwner.OnDllLoaded) then
    FOwner.OnDllLoaded(FOwner, Self);
end;

procedure TDll.DoDllUnLoaded;
begin
  //do nonthing.
end;

procedure TDll.DoPermitChange;
begin
  //do nonthing.
end;

procedure TDll.SetPermit(const Value: Boolean);
begin
  if FPermit <> Value then
  begin
    FPermit := Value;
    DoPermitChange;
  end;
end;

procedure TDll.DoBeforeDllUnLoaded;
begin
  if Assigned(FOwner) and Assigned(FOwner.OnDllBeforeUnLoaded) then
    FOwner.OnDllBeforeUnLoaded(FOwner, Self);
end;

{ TDllManager }

function TDllManager.Add(const FileName: String): Integer;
var
  Dll: TDll;
begin
  result := -1;
  Lock;
  try
    if DllsByName[FileName] = nil then
    begin
      Dll := FDllClass.Create;
      Dll.FileName := FileName;
      result := Add(Dll);
    end
    else
      result := -1;
  finally
    UnLock;
  end;
end;

constructor TDllManager.Create;
begin
  FDllClass := TDll;
  InitializeCriticalSection(FLock);
end;

destructor TDllManager.Destroy;
begin
  DeleteCriticalSection(FLock);
  inherited;
end;

function TDllManager.GetDlls(const Index: Integer): TDll;
begin
  Lock;
  try
    if (Index >=0) and (Index <= Count - 1) then
      result := Items[Index]
    else
      raise EDllError.CreateFmt(´Error Index of GetDlls, Value: %d, Total Count: %d´, [Index, Count]);
  finally
    UnLock;
  end;
end;

function TDllManager.GetDllsByName(const FileName: String): TDll;
var
  I: Integer;
begin
  Lock;
  try
    I := IndexOf(FileName);
    if I >= 0 then
      result := Dlls[I]
    else
      result := nil;
  finally
    UnLock;
  end;
end;

function TDllManager.IndexOf(const FileName: String): Integer;
var
  I: Integer;
begin
  result := -1;
  Lock;
  try
    for I := 0 to Count - 1 do
      if CompareText(FileName, Dlls[I].FileName) = 0 then
      begin
        result := I;
        break;
      end;
  finally
    UnLock;
  end;
end;

procedure TDllManager.Lock;
begin
  OutputDebugString(Pchar(´TRLock DM´ + IntToStr(GetCurrentThreadId) + ´:´ + IntToStr(DWORD(Self))));
  EnterCriticalSection(FLock);
  OutputDebugString(Pchar(´Locked DM´ + IntToStr(GetCurrentThreadId) + ´:´ + IntToStr(DWORD(Self))));
end;

procedure TDllManager.Notify(Ptr: Pointer; Action: TListNotification);
begin
  if Action = lnDeleted then
  begin
    //若TDll(Ptr).Owner和Self不同,則
    //表明由 TDll.Destroy 觸發(fā);
    if TDll(Ptr).Owner = Self then
    begin
      //防止FOwner設(shè)置為nil之后相關(guān)事件不能觸發(fā)
      TDll(Ptr).DoBeforeDllUnLoaded;
      TDll(Ptr).FOwner := nil;
      TDll(Ptr).Free;
    end;
  end
  else
  if Action = lnAdded then
    TDll(Ptr).FOwner := Self;
  inherited;
end;

function TDllManager.Remove(const FileName: String): Integer;
var
  I: Integer;
begin
  result := -1;
  Lock;
  try
    I := IndexOf(FileName);
    if I >= 0 then
      result := Remove(Dlls[I])
    else
      result := -1;
  finally
    UnLock;
  end;
end;

procedure TDllManager.UnLock;
begin
  LeaveCriticalSection(FLock);
  OutputDebugString(Pchar(´UnLock DM´ + IntToStr(GetCurrentThreadId) + ´:´ + IntToStr(DWORD(Self))));
end;

end.
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
久久综合第一页| 青青草中文字幕| 在线观看免费高清完整| 国产桃色电影在线播放| 国产一区精品| 99在线免费视频| 欧美高清视频| 成人av小说网| 国产精品99爱免费视频| 97视频在线| 久热中文字幕在线观看| 国产青草视频在线观看视频| 97操碰视频| 九色在线网站| 97一区二区三区| 粉嫩av一区| √天堂资源中文www| 日本a级黄色| 国产精品久久一区二区三区不卡| 在线看黄色av| 国产毛片毛片| 99reav| 国产69精品久久久久孕妇国产69久久| 国产日本在线| 久久精品国产亚洲a∨麻豆| 国产精品剧情一区二区在线观看| 欧洲有码在线视频| 在线色视频网| 91欧美在线视频| 国产偷激情在线| 国产中文在线| 免费女人毛片视频| 国产精品伦一区二区三区视频 | 午夜视频在线看| av网站在线播放| 国产二区在线播放| 中文字幕在线视频不卡| 免费av在线| www.狠狠色.com| 在线播放一区二区精品产| 国产香蕉尹人视频在线| 国产在线激情视频| 免费的黄网站在线观看| 亚洲欧美综合乱码精品成人网 | 91久久精品国产性色| 中文字幕免费在线视频| 国产有码在线| 九色自拍视频| 黄色片免费在线| 国产原创av在线| 最近中文字幕mv免费高清视频8 | 国产精品福利视频一区二区三区| 国产精品自拍在线观看| 久久精品免视着国产成人| 狠狠色综合久久婷婷| 国产一级在线观看| 97影院理论午夜| 青青久在线视频免费观看| 久久精品视频观看| 国产精品久久久久久久久鸭| 97影院秋霞午夜在线观看| 亚洲videos| 91超碰免费在线| 精品亚洲综合| 国产中文字幕av| 国产天堂在线| wwww亚洲| 国产精品视频一区二区久久 | 国产精品自产拍在线观看2019| 国产女王在线**视频| 国产精品视频一区麻豆| 在线视频观看亚洲| 免费观看一二区视频网站| 国产欧美日韩专区| 欧美高清视频| 2020亚洲男人天堂| 国产蜜臀在线| av在线天堂| 中文字幕在线免费| 日本韩国精品一区二区| 国产精品人人| 免费看的av| 91啦中文在线| 国产小视频免费在线网址| 日本高清中文字幕在线| 国产精品白浆视频免费观看| 九九精品九九| 青青久在线视频免费观看| 精品麻豆视频| 国产叼嘿网站免费观看不用充会员| xxxxx中文字幕| av手机天堂| 亚洲社区在线| 一区免费观看| 永久免费av片在线观看全网站| 国产偷窥洗澡视频| 美女网站在线观看| 亚洲久草视频| 夜色资源网av在先锋网站观看| 国产视频中文字幕| 国产一二三在线观看| 天天操天天射天天色| 国产综合视频一区二区三区免费| 人人干人人插| 欧美激情福利视频在线观看免费| 性国产高清在线观看| 亚洲欧美精选| www免费在线观看视频| 任你操在线观看| 精品孕妇一区二区三区| 国内外激情在线| 成人午夜无人区一区二区| 国产主播色在线| 国产精品四虎| 在线一区观看| 四虎影视成人永久免费观看视频| 在线观看中文| 二区中文字幕| 国产xxxx做受性欧美88| av网站大全在线观看| 九九热在线视频| 国产黄色在线| 日本成人网址| 国产一区电影| 任你操视频在线观看| 国产写真视频在线观看| 国产www在线观看| 俺来俺也去www色在线观看| 国产你懂的在线观看| 国产porn在线| 国产麻豆精品一区二区三区v视界| 国产精选在线视频拍拍拍| 国产夫妻视频| 国产九九九九| 亚洲精品xxxxx| 国产精品黄页网站在线播放免费| 亚洲视频在线网| 国产一卡2卡3卡四卡网站| 亚洲社区在线| 国产成人精品男人的天堂538| 久热国产视频| 精品一区二区在线欧美| 狠狠插狠狠操| 日韩不卡高清| 亚洲精品在线播放视频| 国产精品久久一区二区三区不卡| 九九在线免费视频| h网站久久久| 天天激情综合| 四虎免费播放| 在线观看中文字幕的网站| 国产三级在线| 国产精品伦理一区二区三区 | 免费观看一二区视频网站| 国产高清av| 国产欧美在线观看视频| 导航福利在线| 狠狠干五月天| 久久亚洲资源| 成年女人在线视频| 四虎国产精品永久| av中文在线| 免费观看久久久久| 激情综合丁香| 国产精品亚洲第五区在线| 中文视频在线| 亚洲欧美国产另类首页| 夜夜爽夜夜操| 免费视频二区| 天天爱天天做色综合| 国产偷倩在线播放| 2021天堂中文幕一二区在线观| 精品三级久久久久久久电影聊斋| 91极品在线| 超碰免费在线播放| 国产原创在线播放| 国产婷婷视频在线| 中文字幕4区| gogo在线高清视频| 九九在线观看免费视频| xxx国产精品| 最新av中文字幕| 92国产在线视频| 久久精品无码一区二区日韩av| 久久国产热视频| 国产精品粉嫩av| 亚洲精品天堂在线| 国产九色在线| 亚洲视频精品在线观看| 国产中文第一页| 91亚洲天堂| 国产嫩草在线视频| 四虎精品视频| 国产亚洲精品一区二区在线观看| 精品极品三级久久久久| 久久精品蜜桃| 在线免费观看你懂的| 激情丁香在线| 天天激情综合| 136福利第一导航国产在线|