Delphi程序模块化设计

changfenglee 2011-11-16 09:53:36
最近在做一个项目,想把各版块做成模块,用了DLL以后发现千奇百怪的问题不断,烦不胜烦,想改用BPL吧,又没用过,程序的架构这些问题都已规划好,关键就是实施方法还没确定.请教各位大侠,关于DLL和BPL到底用哪种方式比较好

另外网上现在有关DLL的资料五花八门都有,并没有系统的资料可看,BPL更少,请朋友们帮忙推荐一些有关DLL或BPL的资料吧
...全文
1809 点赞 收藏 42
写回复
42 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
我看见佛 2011-12-02
翻出来看看,,,
回复
simontown 2011-11-21
最近我也在做这种项目,用DLL来划分模块实现插件化平台。我的做法是像数据库操作、主程序信息等,用interface来传递,主程序实现接口,然后把接口对象传递给DLL。不过纯用DLL确实会有不少问题,虽然绝大部分都能够直接或变相解决,但终归不是很方便。BPL鄙人不会,so木有采用。。。还有就是有些朋友说的带包编译,个人感觉也可能不是很方便,因为你发布时可能会发布N多包出去。。。比如我现在这个项目用了DEV套件,带包编译,光DEV的包就有好几十M,而且还跟版本关联太紧。
回复
drroc 2011-11-21
用Rtti反射调用Bpl,最好的方案,没有之一。

多变的地方,辅以脚本,pax,lua之类,就能很灵活了。
回复
JunyMa 2011-11-19
使用Dll的方式好呀,其它开发语言也可以调用
回复
wangpeng2011314 2011-11-19
看来dll和bpl都不怎么好学啊
回复
zlxym 2011-11-19
[Quote=引用 34 楼 cqs6616 的回复:]

其实delphi模块化开发的话,都离不开bpl,
我还是推荐 exe+bpl+dll的开发模式
[/Quote]
同意,这是最好的方法,只用DLL的话,代码共享有问题,很不方便,只用BPL的话,遇到窗体继承等问题时就不好办了。
回复
cqs6616 2011-11-18
其实delphi模块化开发的话,都离不开bpl,
我还是推荐 exe+bpl+dll的开发模式
回复
一剑飘雪 2011-11-18
目前我们也想使用插件式开发
大家可以共同学习啊。相互交流
我的qq344986457 密码答案:范
回复
changfenglee 2011-11-17
找到一个方案了,用纯DLL的问题太多,现在决定改为exe+dll+bpl

谢谢各位参与
回复
人方法方法是否发生的风格
回复
事实上事实上
回复
hanppern 2011-11-17
我们公司主要是用DLL,带包编译,发布时连包也带进去,基本可以解决用DLL带来的所有问题。
窗体和逻辑都是封装到DLL里,还用了不少三方控件,共用DataModal(adoConn,adoQuery,adoDataSet等),当做参数传到DLL里。三层架构,服务端一个DLL跟和客户端一个DLL对应,加起来超五百个DLL,用了四年,没发现什么由DLL引起的问题。
回复
changfenglee 2011-11-16
那大家有没有关于这DLL或者BPL方面的书,资料提供看看,DLL窗体的调用问题实在太多了,不系统的学一下是不行了
回复
changfenglee 2011-11-16
关于DLL的数据连接共享是很简单的,其实说简单一点就是等于建一个新的Unit,然后在里面把数据库连接的过程或函数定义好就行了,只不过DLL和UNIT的调用方式不太一样而已,比如:我在DLL里是这样写的
function AdoQry(Sql_Str:string):TADOQuery;stdcall;
var
Qry:TAdoQuery;
begin
Qry:=TADOQuery.Create(nil);
Qry.Connection:=Con;
Qry.SQL.Clear;
Qry.SQL.Add(Sql_Str);
Qry.Open;
Result:=Qry;
end;

然后主程序如果要引用这一段函数只要赋值给变量就可以了
AdoQry('Select * from 表名');
回复
OO_is_just_P 2011-11-16
像参数和返回者都是Integer,PChar,boolean的基本类型的,和其他语言编写的可以交互无任何影响。
像TAdoConnection等返回类型也是可以的,其他程序用Pointer可以得到地址,但是其他语言没有TAdoConnection类型与之对应而已,如果无聊也可以编写对应的结构,不过难度较大。
回复
我看见佛 2011-11-16
好好学习下,Thanks!
回复
OO_is_just_P 2011-11-16
procedure DisConnect; stdcall; export;
begin
MainConnection.Free;
end;
回复
OO_is_just_P 2011-11-16
[Quote=引用 14 楼 case5166 的回复:]
引用 10 楼 foxyy8888 的回复:
conn :TAdoConnection
Conn是一个TAdoConnection的一个实例,其实就是个Pointer
如果不喜欢TAdoConnection,那么用Pointer作为Conn的类型都可以,然后强制类型转换。
在主程序中建立的Temp Table在DLL中都可以看到,是不是共用Connection?

我是说比如建立一个P……
[/Quote]

//试试,改改。
var MainConnection :TAdoConnection;
一定要写到implementation上面

function GetConn(。。。;var ConnState:Boolean):Pointer; stdcall; export;
begin
MainConnection :=TAdoConnection.Create(nil);
Result :=nil;
Try
MainConnection.Connectstring(?记不清了) :='....';
MainConnection.Connected :=True;
Result :=Pointer(MainConnection);
ConnState :=True;
Except
ConnState :=False;
end;
end;

procedure DisConnect; stdcall; export;
begin
ConnState.Free;
end;
回复
funxu 2011-11-16
个人感觉如果你的程序要和其他程序交互,dll好些,因为bpl是delphi才支持的
回复
funxu 2011-11-16
dll,bpl各有各的优缺点,delphi开发人员指南里有一张讲bpl的,不过仅限入门级
回复
加载更多回复
相关推荐
发帖
Delphi
创建于2007-08-02

4925

社区成员

Delphi 开发及应用
申请成为版主
帖子事件
创建了帖子
2011-11-16 09:53
社区公告
暂无公告