插件编写

简介: 一 编写DLL 新建一dpr文件 library PDLL; uses Sysutils,classes,main in 'main.pas'; {$E plg.} //定义后缀名为plg exports DescribePlugin, InitPlugin; begin end; main.

一 编写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;

相关文章
|
前端开发
vscode编写前端提升效率的三个必不可缺的插件以及使用方法
vscode编写前端提升效率的三个必不可缺的插件以及使用方法
|
2月前
|
人工智能 Java 数据库连接
IDEA开发 常用代码规范插件 常用辅助类插件
IDEA开发 常用代码规范插件 常用辅助类插件
82 0
|
4月前
|
Kubernetes NoSQL Go
最简单的 K8S 部署文件编写姿势,没有之一!
最简单的 K8S 部署文件编写姿势,没有之一!
|
6月前
|
存储 数据库 数据安全/隐私保护
Duplicator插件的主要功能是什么?
【6月更文挑战第4天】Duplicator插件的主要功能是什么?
71 1
|
7月前
|
IDE 开发工具 C语言
QT案例IDE编写 -- 代码编写
QT案例IDE编写 -- 代码编写
82 0
|
前端开发 Go API
如何编写 esbuild 插件
如何编写 esbuild 插件
460 0
如何编写 esbuild 插件
|
XML IDE Java
【Groovy】Gradle 构建工具 ( 自动下载并配置构建环境 | 提供 API 扩展与开发工具集成 | 内置 Maven 和 Ivy 依赖管理 | 使用 Groovy 编写构建脚本 )
【Groovy】Gradle 构建工具 ( 自动下载并配置构建环境 | 提供 API 扩展与开发工具集成 | 内置 Maven 和 Ivy 依赖管理 | 使用 Groovy 编写构建脚本 )
297 0
【Groovy】Gradle 构建工具 ( 自动下载并配置构建环境 | 提供 API 扩展与开发工具集成 | 内置 Maven 和 Ivy 依赖管理 | 使用 Groovy 编写构建脚本 )
|
关系型数据库 数据库 PostgreSQL
如何使用代码生成插件easycode
如何使用代码生成插件easycode
201 0
如何使用代码生成插件easycode
|
小程序 API 数据安全/隐私保护
小程序模板及插件开发应用
本节对小程序模板和插件开发以及会涉及到的场景做了介绍。
小程序模板及插件开发应用
LLVM编写插件
Link: https://blog.csdn.net/GigibondBaby/article/details/81699421
1363 0