半路出家的delphier一如我,对于win32api式的调用有着近乎厌恶的抵触情绪,我很早以前看c++的教程时看到lptrXXXXX的变量就头大,以至于到现在都不会用c++,都不曾写成功过那怕一个hello world程序,所以对于dll式的导出函数后面加stdcall使用右到左的参数调用方式,总觉得没有delphi的美感.再加上看到了许多bpl可以导出类,而dll很麻烦的文章,更是坚定了我的方向.
开始吧.....
一个插件系统需要什么?
一个最小的插件系统当然需要插件本身,调用插件的容器,最后需要契约.
契约是什么呢?契约就是两个对象相互沟通的一个标准,这个标准应该统一,这样容器才能和不同的插件通讯.我们可以使用接口来表述这个契约.例如
type
IPlugin = interface
['{48BF4000-B028-4B57-9955-B1A8305DA394}']
procedure Execute;
end;
容器,它可以配置加载哪些插件,并能调用插件的功能,并和插件交互数据,这种数据应该有统一性,因此我们的目标当然是需要和插件能够交互TObject,因为我们可以封装任何的数据在TObject中去,至于这个TObject中是些什么什么数据,只需要插件和容器知道就可以了.那么我们修改契约如下:
type
IPlugin = interface
['{48BF4000-B028-4B57-9955-B1A8305DA394}']
function GetObject: TObject;
procedure SetObject( value: TObject );
procedure Execute;
end;
插件,我们使用实现了接口的一个bpl来构建插件,让容器动态载入一个bpl,然后访问其中的IPlugin来调用插件
coding吧
我们构造一个容器,它动态的载入一个bpl,并且通过预定义的名称来访问其中的 IPlugin,并调用IPlugin.Execute,这个预定义的名称其实是在bpl中实现了IPlugin的类的名称,这个类的名称我们可以通过修改bpl的名称或者同时发布一个配置文件来让容器获得.现在我们先暂时写死在程序里,毕竟这个问题是个小问题
构建插件
new->package生成一个package,就用'package1'的缺省名称,new->unit
unit TPluginImpl1;
interface
uses uIPlugin, dialogs, Classes;
type
{$M+}
TPlugin = class( TInterfacedPersistent, IPlugin )
function GetObject: TObject;
procedure SetObject( value: TObject );
procedure Execute;
private
FMsg: string;
public
procedure AfterConstruction; override;
end;
{$M-}
implementation
{ TPlugin }
procedure TPlugin.AfterConstruction;
begin
inherited;
FMsg := 'init String';
end;
procedure TPlugin.Execute;
begin
showmessage( FMsg );
end;
function TPlugin.GetObject: TObject;
begin
result := TObject( FMsg );
end;
procedure TPlugin.SetObject( value: TObject );
begin
FMsg := string( Value );
end;
initialization
RegisterClass( TPlugin );
finalization
UnRegisterClass( TPlugin );
end.
TPlugin实现了IPlugin接口,并且注册了该组件,使它能够被容器访问到.
compile,之后,会在%delphi%/bpl目录生成package1.bpl.
构建容器
procedure TForm3.Button1Click( Sender: TObject );
var
theClass : TPersistentClass;
thePlugin : TPersistent;
IPlug : IPlugin;
FPackege : Cardinal;
begin
FPackege := LoadPackage( 'package1.bpl' ); //加载包
theClass := GetClass( 'TPlugin' ); //通过字符串获得类定义
if theClass = nil then
begin
ShowMessage( 'TPlugin not load' );
exit;
end;
thePlugin := theClass.Create; //创建实例
Supports( thePlugin, StringToGUID( '{48BF4000-B028-4B57-9955-B1A8305DA394}'
), IPlug ); //转换成IPlugin接口
try
IPlug.Execute; //执行插件的
finally
IPlug := nil;
end;
UnloadPackage( FPackege ); //卸载包
end;
project->options->package
点选build with runtime package
修改成vcl;rtl,确定
可以发布测试了
拷贝你的project1.exe,package1,windowSystem32目录下的vcl70.bpl,rtl70.bpl到一个目录,把他们拷贝到一个目录下,发布到一个没有delphi的机器上试试吧.
相关推荐
数据库课程案例——电力公司收费管理系统分析与实践,完整带SQL语句
某电力公司收费管理信息系统实现客户信息、用电类型(类别号、类别名、电价)及业务员管理;实现客户用电信息管理(客户号、月份、用电类别号、用电度数);实现客户费用管理(客户号、月份、费用、收费标志),收费标志的默认值为“未收”;实现收费登记(客户、月份、应收费用、实收费用、业务员),并自动修改收费标志(用触发器实现);创建触发器,实现收费时自动更加应收费用和实收费用,计算本次结余,然后修改客户信息表中的结余金额;创建存储过程统计指定月份应收费用和实收费用;创建存储过程查询指定月份未交费的用户信息,以便崔费;创建
数据库课程设计某电力公司收费系统.doc
数据库课程设计某电力公司收费系统
基于java智慧医疗预约挂号管理系统设计与实现
在患者就医和患者的信息管理方面,往常的就医问诊模式之下都是采用的是人工线下的进行管理和整理工作,在这一过程之中存在这一定的不安全和低效性,面对与患者的基数的越来越大,患者的信息管理也在面领着巨大的挑战,管理人员面领着巨大的患者信息的信息量,运用之前的信息管理方式往往会在统计和登记上出现错误的情况的产生,为后续的管理工作造成了一定的困难。信息化的智慧医疗预约挂号管理系统的实现不仅给患者的预约管理工作带来了方便也进一步的促进了医疗事业信息化的发展,从而实现高效化的就医工作。2.3 mysql数据库 3。
数据库课程设计某电力公司收费系统.docx
数据库课程设计某电力公司收费系统.docx数据库课程设计某电力公司收费系统.docx数据库课程设计某电力公司收费系统.docx数据库课程设计某电力公司收费系统.docx数据库课程设计某电力公司收费系统.docx数据库课程设计某电力公司收费系统.docx数据库课程设计某电力公司收费系统.docx数据库课程设计某电力公司收费系统.docx
学生宿舍管理系统【控制台+MySQL】(Java课设)
学生宿舍管理系统【控制台+MySQL】(Java课设)
Java综合课设:公园管理系统的简单实现 Java + MySQL + Swing
公园管理系统的简单实现 Java +MySQL + GUI
Eclipse+Java+Swing+Mysql实现自助存取款机(ATM)系统
1.登录系统2.注册系统3.取款4.存款5.转账6.余额查询7.退出系统。
Java项目之宠物管理系统(附源码+论文)
本论文系统地描绘了整个网上宠物管理系统的设计与实现,主要实现的功能有以下几点:管理员;首页、个人中心、宠物分类管理、商品分类管理、宠物用品管理、宠物商店管理、宠物领养管理、用户管理、宠物寄存管理、用户领养管理、宠物挂失管理、论坛管理、管理员管理、系统管理、订单管理,前台首页;首页、宠物用品、宠物商店、宠物领养、宠物挂失、论坛信息、宠物资讯、个人中心、后台管理、购物车、客服,用户;
Eclipse+Java+Swing实现宠物商店管理系统-TXT存储信息
Java+Swing实现宠物商店一、系统介绍二、系统展示1.主界面2.增加宠物3.删除宠物4.修改宠物5.查询宠物6.模块查询三、系统实现Cat.javaDog.javaMouse.javaMainScreen.javaPetShop.java四、其他1.其他系统实现2.获取源码 一、系统介绍 本系统通过文件系统实现实现宠物的增删改查。 二、系统展示 1.主界面 2.增加宠物 3.删除宠物 4.修改宠物 5.查询宠物 6.模块查询 三、系统实现 Cat.java package com.sjsq
基于java+ssh的医院在线挂号系统设计与实现毕业设计(项目报告+答辩PPT+源代码+数据库+讲解视频)
项目报告基于SSH的医院在线挂号系统设计与实现互联网技术迅速的发展给我们的生活带来很大的方便,同时也让许多行业迅速的发展起来。互联网技术已走向科技发展的巅峰期,我们要做的就是合理的使用互联网技术让我们的各个行业得到更快速的发展。就医疗领域来说,如今看病难已成为我们生活中的一大难题,传统的医院挂号中,我们需要用手动方式来处理信息,这种方式需要我们的医护工作人员和管理人员花费大量的时间来处理事务性信息,不仅劳动强度大,而且浪费时间。患者长时间的排队等候不仅延误了患者病情,而且不利于医院秩序的维护。所以在这里我的
基于 Java+MySQL 实现(GUI)医院简易挂号管理系统【100011071】
采用桌面应用程序模式,开发一个医院挂号系统,管理包括人员、号种及其挂号费用,挂号退号等信息,完成登录、挂号、查询和统计打印功能。
库存管理:使用Java和MYSQL的库存管理系统
库存管理系统 用于库存管理的多用户RDBMS系统作为我第二年的UG课程的一部分,从事此项目。 科技栈JavaFX,MySQL 环境 聪明的想法 MySQL工作台8 JDK 8 Gluon Scene Builder 原型:
基于java+MySQL的宠物管理系统
基于java+MySQL的宠物管理系统
Java 学生成绩管理系统(基于GUI和数据库的建立)
Java课程设计
基于java+mysql+控件台学生信息管理系统
项目类型:Java SE项目(控制台打印)项目名称:基于Java学生信息管理系统(student_sys)当前版本:V3.0版本用户类型:单用户(只有管理员)开发语言:java语言运行工具:Eclipse/MyEclipse都可以,eclipse最兼容适用场景:课程设计参考学习功能描述:本系统属于控制台打印输出操作,管理员登录后对其学生信息进行增删改查。
【原创】java+swing+mysql教师管理系统设计与实现
本系统为java+swing+mysql的教师管理系统,管理员、教师 功能如下: 管理员:教师管理;修改密码;退出;教师:修改个人资料;修改密码;退出;
学生成绩管理系统GUI界面设置
JOptionPane.showMessageDialog(jf, "请 输 入 账 号","",JOptionPane.WARNING_MESSAGE);JOptionPane.showMessageDialog(jf, "请 输 入 密 码","",JOptionPane.WARNING_MESSAGE);JOptionPane.showMessageDialog(jf, "请 输 入 密 码","",JOptionPane.WARNING_MESSAGE);
2748




被折叠的 条评论
为什么被折叠?



