zoukankan      html  css  js  c++  java
  • 插件编写

    一 编写DLL

    新建一dpr文件

    library PDLL;

    uses

    Sysutils,classes,main in 'main.pas';

    {$E plg.} //定义后缀名为plg

    exports

    DescribePlugin,

    InitPlugin;

    begin

    end;

    main.pas为:

    unit main

    interface

    uses Dialogs,Menus,Classes;

    type

    THolder=class

    public

    procedure ClickHandler(Sender:TObject);

    end

    procedure DescribePlugin(var Desc:pchar);export;stdcall;

    procedure InitPlugin(ParentMenu:TMainMenu);export;stdcall;

    var

    Holder:THolder;

    implementation

    procedure DescribePlugin(var Desc:pchar);

    begin

    Desc :=pchar('Test plugin 2-Menu test');

    end;

    procedure InitPlugin(ParentMenu:TMainMenu);

    var

    i:TMainItem;

    begin

    i :=NewItem('Plugin & Test',scNone,False,True,Holder.ClickHandler,0,'mnuTest');

    ParentMenu.Items[1].Add(i);

    end;

    procedure THolder:ClickHandler;

    begin

    ShowMessge('Clicked');

    end;

    initialization

    Holder :=THolder.Create;

    finalization

    Holder.Fee;

    end;

    将此文件编译成DLL文件(pdll.plg)

    二 编写测试程序

    1.绘制窗体

    略......

    2.编写代码

    (1) 定义常量

    const

    cPLUGIN_INIT='InitPlugin';

    cPlugin_DESCRIBE='DescribePlugin';

    (2) 定义过程类型

    type

    TPluginDescribe=procedure (var Desc:pchar);stdcall;

    TPluginInit=procedure (ParentMenu:TMainMenu);stdcall;

    (3) 定义两私有过程

    procedure LoadPlugin(sr:TSearchRec);

    (4) 过程实现代码

    procedure TfrmMain.LoadPlugin(srLTSearchRec);

    var

    Description:pchar;

    LibHandle:Integer;

    DescribeProc:TPluginDescribe;

    InitProc:TPluginInit;

    begin

    LibHandle:=LoadLibrary(pchar('PlugDLL\'+sr.Name));

    if LibHandle<>0 then

    begin

    DescribeProc :=GetProcAddress(LibHandle,cPlugin_DESCRIBE);

    if Assigned(DescribeProc) then

    begin

    DescribeProc(Description);

    Plugins.Lines.Add(strPas(Description));

    InitProc :=GetProcAddress(LibHandle,cPLUGIN_INIT);

    if Assigned(InitProc) then

    begin

    InitProc(menuMain);

    end;

    end

    else

    begin

    MessageDlg('Fle "'+sr.Name+'" is not a valid plugin.',mtInformation,[mbOk],0);

    end;

    end

    else

    MessageDlg('An Error occured loading the plugin "'+sr.Name+'"',mtInformation,[mbOk],0)

    end;

    end;

    procedure TfrmMain.LoadPlugins;

    var

    sr:TSearchRec;

    path:string;

    Found:Integer;

    begin

    path :=ExtractFilePath(Application.ExeName);

    try

    Found :=FindFirst(path+'plugDLL\*.plg',faAnyFile,sr);

    while Found=0 do

    begin

    LoadPlugins(sr);

    Found :=FindNext(sr);

    end;

    finally

    FindClose(sr);

    end;

    end;

    Button1的OnClick事件

    var

    i:TMenuItem;

    begin

    i:=NewItem('PLugin &Test',srNone,False,True,nil,0,'mnuTest');

    menumain.Items[i].add(i);

    end;

    Button2的OnClick事件:

    LoadPlugins;

  • 相关阅读:
    Backbone Events 源码笔记
    IIS8集成模式下打开静态资源被aspx处理程序处理,StaticFileModule失效问题分析
    Orchard 与 ABP架构比较 (aspnetboilerplate)
    Orchard EventBus 事件总线及 IEventHandler作用
    Orchard 事件通知小坑
    推荐一个国内编程语言排名网站
    po_文件格式[转]
    关于poedit打开po文件乱码的问题
    JAVA和.NET工作流相关项目收集
    php里的二进制安全
  • 原文地址:https://www.cnblogs.com/djcsch2001/p/2035833.html
Copyright © 2011-2022 走看看