亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > 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進行功能擴展;
  }

  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中重復刪除,因此需要將
    //FOwner設置為 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設置為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ā)表

圖片精選

九一在线视频| 免费观看久久久4p| 亚洲成人午夜影院| 波多野结衣大片| 亚洲免费伊人电影| 一区二区三区蜜桃| 欧美国产成人精品一区二区三区| 成人美女黄网站| 3751色影院一区二区三区| 二吊插入一穴一区二区| 精品无码久久久久成人漫画| 一级全黄肉体裸体全过程| 国产精品18久久久久| 国产又黄又猛又粗| 日韩成人在线免费观看| 五月天激情国产综合婷婷婷| 亚洲成人福利片| 色婷婷综合在线观看| 国产精品电影网站| 日本亚洲自拍| 九九热线视频只有这里最精品| 看全色黄大色黄大片免责看的| 亚洲午夜电影在线| 日韩精品视频免费在线观看| 免费观看特级毛片| 欧美另类视频在线| 电影一区二区| 亚洲色偷偷综合亚洲av伊人| 国产毛片av| 亚洲性线免费观看视频成熟| 九色成人国产蝌蚪91| av不卡一区| 国产免费观看高清视频| 亚洲一区二区三区视频在线| 欧美剧在线免费观看网站| 日本中文字幕免费在线观看| 韩日电影在线观看| 97在线免费| 午夜影院在线观看欧美| 亚洲国产成人影院播放| 亚洲视频精选在线| 欧美特级www| 欧美精品做受xxx性少妇| 中文字幕一区日韩精品| 久久久久国产精品视频| 久久久久中文字幕亚洲精品| 蜜桃精品一区二区| 国产手机在线视频| 欧美在线观看一二区| 成人小说亚洲一区二区三区| 国产一区二区三区四区在线观看| 狠狠色狠狠色综合系列| 丰满爆乳一区二区三区| 亚洲三级毛片| 国产精品久久久久久久久久99| 久久久亚洲国产| www.激情五月.com| 国产xxxxx视频| 日韩制服丝袜先锋影音| 伊人久久成人网| 国产99久久精品一区二区 夜夜躁日日躁| 久久久久久人妻一区二区三区| 欧美午夜精品久久久| 国产青草视频在线观看视频| 少妇无码一区二区三区| 国内精品免费一区二区三区| 亚洲欧美综合自拍| 免费在线观看h片| 久久久欧美精品sm网站| 亚洲第一福利一区| 精品伊人久久97| 中文在线免费一区三区| 成人午夜精品久久久久久久蜜臀| 日韩欧美成人一区二区三区| 国偷自产av一区二区三区小尤奈| 免费观看30秒视频久久| 欧洲美女7788成人免费视频| 色婷婷综合激情| 亚洲色图欧美视频| 桃花视频大全不卡免费观看网站| 69精品无码成人久久久久久| 久久99精品久久久久久野外| 日本暖暖在线视频| 性xxxxxxxxx18欧美| 四虎国产成人精品免费一女五男| 美女免费视频网站| 亚洲国产综合在线看不卡| 国产拍欧美日韩视频二区| a美女胸又www黄视频久久| 妞干网福利视频| 国产亚洲精品aa午夜观看| 久草在线资源福利| 国产视频一视频二| 久久久蜜桃一区二区人| 激情丁香久久| 中文字幕第66页| 久久米奇亚洲| 毛片中文字幕| 国产精品1区2区3区| 正在播放亚洲1区| 久草综合在线视频| 欧美激情视频一区二区三区在线播放| 午夜免费性福利| 成人性生活视频免费看| 欧美人体一区二区三区| 欧美一区二区三区在线| 久久久xxx| 中文字幕一区二区三区四区在线视频| 国产精品黄色大片| 五月天免费网站| eeuss草民免费| 精品国产黄a∨片高清在线| 99sesese| 卡通动漫亚洲综合| 亚洲欧洲制服丝袜| 亚洲欧美日韩免费| 亚洲性猛交xxxxwww| 亚洲精品视频在线播放| 欧美黄色成人| 91精品国产综合久久福利软件| 欧美视频中文字幕| 五月花丁香婷婷| 欧美高清视频看片在线观看| 久久久黄色av| 国产精品久久久久久久免费软件| 免费男女羞羞的视频网站中文字幕妖精视频| 日韩欧美一区二区三区在线视频| 一本在线高清不卡dvd| 亚洲综合自拍偷拍| 亚洲国产成人一区二区三区| 久久嫩草精品久久久久| 久久99久久99精品中文字幕| 亚洲国产精品激情在线观看| 美脚丝袜脚交一区二区| 亚洲在线国产日韩欧美| 日韩av综合| 成人国产精品免费| 能看的毛片网站| 最猛黑人系列在线播放| 成人高清一区| 亚洲精品一区二区三区av| 永久免费看mv网站入口78| 在线不卡的av| а 天堂 在线| 亚洲一区免费网站| 亚洲欧美日韩色图| 捆绑紧缚一区二区三区视频| av在线1区2区| 国产精品蜜月aⅴ在线| 亚洲一区二区三区四区五区黄| 国产一级片免费在线观看| 无套内谢丰满少妇中文字幕| 91蝌蚪porny| 美女爆乳18禁www久久久久久| 午夜精品一区二区三区在线观看| 亚洲深夜激情| 中文精品久久久久人妻不卡| 欧美日韩精品区| 在线精品播放av| 奇米一区二区三区av| av不卡在线播放| 色一情一区二区三区| 日韩精品视频中文在线观看| av一级二级| 337p日本欧洲亚洲大胆精品| 日韩一区二区三区免费视频| 国产美女精品| 国产日韩中文字幕| 国产又大又粗又硬| 国产一级伦理片| 色天天综合网| 高h调教冰块play男男双性文| a黄色片在线观看| 中文在线不卡| 日韩专区在线观看| 国产精品外围在线观看| 波多野结衣网页| 亚洲开发第一视频在线播放| 色偷偷av一区二区三区| 久久免费资源| 欧美激情国产日韩| 国产精品qvod| 国产伦精品一区二区三区在线| 成人黄色片在线观看| 久久久999国产| 一本久久综合亚洲鲁鲁| 高清视频国产| 蜜桃福利午夜精品一区| 欧美激情国产精品| 91大神精品| 成人午夜在线观看视频| 久久国产精品 国产精品| 国产日产精品一区二区三区四区的观看方式| 午夜一区二区三区四区| free性m.freesex欧美| 香蕉精品999视频一区二区| 久久精品青青大伊人av| free极度另类性欧美| 欧美高清视频在线播放| 亚洲精品一区二区网址| 亚洲aⅴ在线观看| 国产亚洲精品久久久| 久久久免费毛片| 日韩一区二区不卡| 尤物在线精品| 日韩专区在线| www.youjizz.com亚洲| 五月天丁香视频| 精品国产31久久久久久| 曰本女人与公拘交酡| 欧美肥老太太性生活| 国产911在线观看| 国产精品久久久久久久av电影| 两个人看的免费完整在线观看| 亚洲无线观看| 国产精品99一区| 欧美日韩欧美一区二区| 久久综合综合久久综合| 亚洲大型综合色站| **网站欧美大片在线观看| 91国偷自产中文字幕久久| 男女私大尺度视频| 伊人久久大香线蕉av一区二区| 亚洲免费人成在线视频观看| 91传媒在线免费观看| 亚洲 日韩 国产第一| 亚洲综合色丁香婷婷六月图片| 中国丰满熟妇xxxx性| 久久免费高清| 国产精华一区| 日韩成人免费在线视频| 日本www在线观看视频| 亚洲电影第三页| 又大又长粗又爽又黄少妇视频| 精品人妻一区二区三区四区在线| 色中色综合网| 精品日韩欧美一区二区| 女同久久另类99精品国产| 天天成人综合网| 欧美视频国产视频| 一区二区三区韩国| 国产又粗又长免费视频| 伊甸园亚洲一区| 黄网站网址视频| 久久爱www| 国产免费一级| 日韩视频在线一区二区| 亚洲爆乳无码专区| 一区二区三区四区在线观看国产日韩| 欧美中文字幕一区二区| 国产盗摄——sm在线视频| 一区二区三区在线观看免费视频| 成人亚洲欧美激情在线电影| 成人午夜激情视频| 国产欧美一区二区| 国产欧美一区视频| 色噜噜日韩精品欧美一区二区| 在线免费观看黄色小视频| eeuss影院www影院| 成人一区二区三区视频在线观看| 黑人玩欧美人三根一起进| 99九九久久| 成人免费黄色av| 99热这里只有精品1| 香蕉视频成人在线观看| 国产精品伦理| 欧美日韩在线观看视频| 日韩一级电影| 亚洲日韩中文字幕在线播放| 免费毛片一区二区三区| 91午夜交换视频| 国产无遮挡裸体免费久久| 色悠久久久久综合先锋影音下载| 麻豆精品一区二区三区视频| 五月精品视频| 青青青青国产视频| 猫咪av在线| 欧美日韩国产成人在线观看| 亚洲女人天堂成人av在线| 美女网站在线免费欧美精品| 老太脱裤子让老头玩xxxxx| 久久伊人资源站| 成人中文在线| 欧美视频中文一区二区三区在线观看| 中文字幕免费高清在线| 超碰97国产在线| www.综合色| 999亚洲国产精| 2025韩国理伦片在线观看| 亚洲毛片在线看| 午夜视频一区二区| 婷婷开心激情综合| 亚洲影院在线观看| free性中国hd国语露脸| 一区二区三区影院| 欧美日韩一级视频| 成人免费视频网址| 激情开心成人网| 欧美精品在线网站| 日本三级片在线观看| 国产综合久久久| 久久成人久久爱| 2019中文字幕视频| 91麻豆福利精品推荐| 天海翼一区二区| 亚洲国产精品久久久久秋霞蜜臀| 小说区图片区图片区另类灬| 精品久久久国产精品999| 欧美激情a∨在线视频播放| 国产一区二区三区四区在线观看| 91九色精品| www.色.com| 人妻一区二区视频| 久久成人在线观看| 91视频论坛| 免费看男男www网站入口在线| 国产剧情久久久| 国产欧美视频在线| 国产mv久久久| 3d动漫精品啪啪一区二区三区免费| jiuse.com91视频| 欧美熟女一区二区| 91久久国产综合久久蜜月精品| 中文字幕在线官网| 国产在视频线精品视频www666| 亚洲va国产天堂va久久en| 久久婷婷五月综合色国产香蕉| 日韩亚洲视频|