研究心得------->Delphi(C++Builder)包(Package)动态加载和动态注册类技术的深入探索 (0分)

  • 主题发起人 主题发起人 wr960204
  • 开始时间 开始时间
jianl:
怎么可以,愿闻其祥。
 
djdsz:
你没明白我和LiChaoHui的意思
lajfox:
>>用包方式至少有一个致命问题:你需要Borland的额外的license
>>比如Ado控件、DBExpress控件等,我因为碰上了这个问题无法解决
???那些不是自带的吗?怎么无法解决呢?
 
dll 中的datamodal中函数:
procedure Initdll(AConnection: TADOConnection;app:TApplication;aOperator:TOperator); stdcall;
var
i:integer;
begin
application := app;
currentOperator := aOperator;
if DM=nil then
begin
DM:=TDM.Create(nil);
end;
for i := 0 to DM.ComponentCount - 1 do
begin
if DM.Components is TCustomADODataSet then
(DM.Components as TCustomADODataSet).Connection := AConnection;
end;
end;
 
jianl:
你这段代码能说明什么呢?我上面并没有说DLL不能连接数据库,而是说不能同时使用一个数据库
连接,有关这方面,你可以看看hubdog的《葵花宝典》中的李维先生的有关包使用的一篇文章
 
我是随便乱贴帖子的人吗?
这段代码是全省系统正在只有的代码。
算了不说了,伤自尊了。呵呵
 
to :
jianl
你的代码不运行带包编译,
能够传递VCL对象吗?
不能吧
 
独立的DLL可以传递VCL对象,我有个软件就是这么做的。当然,前提是双方必须都是Delphi
 
[:D][:D]
包与普通DLL的区别:
(1) VCL元件只能在同一个模块内被访问,主程序不能直接访问DLL中的VCL元件;反之,DLL也不能
直接访问主程序中的VCL元件。
(2) 每个使用VCL元件的DLL都要加上一段VCL框架代码,这段代码的长度大约在100~200K左右。
所以,不是说DLL不能传递VCL对象,而是每个DLL都要重复,这才是bpl比DLL的优势
 
>你的代码不运行带包编译,
我们没有使用包编译。客户都是P4的机器,软件是500k还是50M他们根本不关心。
 
>>我们没有使用包编译。客户都是P4的机器,软件是500k还是50M他们根本不关心
奔腾4和500k还是50M有什么关系,两码事嘛[:D][:D]
 
确实不是一回事,我偷懒少写了一句,硬盘60G,呵呵
 
>>这段代码是全省系统正在只有的代码。
>>算了不说了,伤自尊了。呵呵
确实令人作呕!![:(!][:(!]
 
要呕请便,恕不奉陪
 
动态加载包的方法在使用同一编译器时还是挺有用的,但我觉得可以使用的地方不多。
另外,关于共享DLL中的数据库连接这种思路是非常有问题的,为什么?
因为很多人编程时大量在界面窗体上使用了"Query1.Sql.Add('update...')"一类的语句
这才显得数据库连接共享特别有用。
而面向对象编程的思想应该是某个对象提供企业逻辑供别的模块调用才对,所以呢作为一个
窗体而言,它只需要知道哪个对象可以让自己调用所需要的方法就行,而不用关心数据库是
怎么连接的,SQL语句是怎么写的。
--当然了,我并不是说这种写法和这种想法是行不通。
 
在这里我只是想说明一种能加载任意BPL文件中的控件的方法,而无需事先知道该BPL的内容。
BPL和DLL各有千秋。DLL可以不分Delphi的版本号而和通用。BPL则必须和Delphi的版本号对应。
但是BPL提供了另外一些DLL所不能提供的东西,例如共享变量(当然DLL如果不怕麻烦的话也能实现)。
我认为不管BPL还是DLL都提供了很好的模块化开发方式。
我曾经作过一个进销存,所有的模块都是动态BPL来实现的。想添加模块很简单拷贝一个BPL模块到PlugIn
目录下就行了。升级打补丁就是把像对应的BPL覆盖就行了。而编程时和普通的程序没什么区别,很方便的。
 
wr960204你好,我看了你的文章学到很多东西谢谢,但是现在有个问题,就是先生在上面贴的
代码,我运行了一遍,但是在:
function TPackage.RegClassInPackage: Boolean;
//该函数只能在工程文件需要VCL,RTL两个包文件时才能用
//因为我们需要把全局的函数指针Classes.RegisterComponentsProc指向我们自己
//函数(该函数为IDE准备,IDE会为它设定函数而我们的程序也要模仿IDE为它设定函数)。
//如果不是带VCL和RTL两个包,那么我们设置的只是我们本身Classes单元的函数指针
//而不是包括Package的全局的。
//
//而有趣的是如果我们的工程不带包运行,那么我们基本上可以同时用它来查看最近几个版本的
//Borland编译器所产生的包文件而不会产生异常,但是控件不能够注册了。
var
I : Integer;
oldProc : Pointer;
RegProc : procedure();
RegProcName, UnitName: string;
begin
oldProc := @Classes.RegisterComponentsProc;
Classes.RegisterComponentsProc := @RegComponentsProc;
FPageInfos.Clear;
try
try
for i := 0 to FContainsUnit.Count - 1 do
begin
RegProc := nil;
UnitName := FContainsUnit;
RegProcName := '@' + UpCase(UnitName[1])
+ LowerCase(Copy(UnitName, 2, Length(UnitName))) + '@Register$qqrv';
//后面这个字符串@Register$qqrv是Borland定死了的,Delphi5,6,7,BCB5,6都是这样子的
//Delphi3是Name + '.Register@51F89FF7'。而Delphi4手里没有,不曾试验过
RegProc := GetProcAddress(FPackHandle,
PChar(RegProcName));
if Assigned(RegProc) then
begin
CurrentPackage := Self;
RegProc;
end;
end;
except
UnRegisterModuleClasses(FPackHandle);
ClearPageInfo;
Result := True;
Exit;
end;
finally
Classes.RegisterComponentsProc := oldProc;
end;
end;

没有进入if Assigned(RegProc) then
begin
CurrentPackage := Self;
RegProc;
end;
end;
因此为创建不了窗体。请问是不是我有些什么没有做好,比如在生成BPL的时候要注意什么
 
to PowerVR
我没看懂你说的是什么意思?
我的例子你可以去这个地方下载
http://www.csdn.net/cnshare/soft/16/16503.shtm
 
后退
顶部