zoukankan      html  css  js  c++  java
  • 主控程序之插件装载器一

    对于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.

  • 相关阅读:
    [LC] 252. Meeting Rooms
    [LC] 243. Shortest Word Distance
    [LC] 215. Kth Largest Element in an Array
    [LC] 8. String to Integer (atoi)
    [LC] 367. Valid Perfect Square
    [LC] 66. Plus One
    [LC] 7. Reverse Integer
    [GeeksForGeeks] Print all nodes that don't have sibling in a binary tree.
    [Coding Made Simple] Maximum Sum Subsequence Non-adjacent
    [Coding Made Simple] Longest Bitonic Subsequence
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/2358355.html
Copyright © 2011-2022 走看看