动态调用bpl,如何调用bpl中的procedure和function(200分)

M

maming

Unregistered / Unconfirmed
GUEST, unregistred user!
查找bpl发现有人提过这方面的问题,没有得到正确的答案。
我再出200分求解。
你要是看了
http://www2.inprise.com.tw/tw/reference9.html
你就不会以为这是个小问题了。
 
//不敢说话,听听高手意见。
 
我是这样认为的,无所谓高手,也许你的一个建议也是你认为的高手们无法想到的,
所以请大家不多多的说出自己的想法,不管做得到做不到。谢谢先。
 
动态调用?不明白
 
就是在要用的时候才调入内存。
 
我试过了,验证了我的理解。BPL不可以用作DLL来输出函数的。
只能输出类,如果你一定要这样调用的话,可以在BPL里面定义
一个类,通过输出他的方法来实现。
 
这个问题和李维的文章有什么关系呢?李维文章里面什么都没讲啊?
包最终是BORLAND用来解决类的问题的,不是用来输出函数的。输出
函数或过程的话只能用运行期包,由DELPHI自己负责管理调用。
我想不出来为什么一定要动态调用包,而且一定要输出过程呢?实在
不行你可以输出一个接口类嘛,这个接口类专门用来输出你的过程就
好了。我在做模块化的时候就是这么用的。在包里面定义一个接口类,
这个接口类有几个比如版本等属性,然后有一些需要输出的方法。在
调用的主程序里,创建一个接口类的实例,就可以用这些方法了。
 
这是没事找事做呀?我觉得没必要这么做啊。
 
to 京工之鸟:
你的想法就是我当初的想法,我这样做过,但觉得很麻烦。你做过还有源程序吗?
给个简单的我学习,多谢先。
有人说可以象dll样输出的话,我想比用interface要简单些和灵活些。
 
象dll样输出 我已试成功了,而且是在mdi中试成功的。
贴出代码,大家同喜。希望bbkxjy来拿分。
主要的原因是bpl输出的目录默认为/bpl下。
而我一直没有在意。
bpl部分;
...
type
TUIPackageForm = class(TForm)
DataSource1: TDataSource;
DBNavigator1: TDBNavigator;
DBGrid1: TDBGrid;
procedure FormClose(Sender: TObject
var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

procedure ShowMDIChildForm(MainApp:TApplication);stdcall;
exports
ShowMDIChildForm;
var
UIPackageForm: TUIPackageForm;
implementation
{$R *.DFM}
procedure ShowMDIChildForm(MainApp:TApplication);stdcall;
begin
Application:=MainApp;
UIPackageForm:=TUIPackageForm.Create(MainApp);
UIPackageForm.Show;
end;
procedure TUIPackageForm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := cafree;
end;
动态调用的主程序部分。
type
Tshowmdiform=procedure(MainApp:TApplication);stdcall;

showmdiform:Tshowmdiform;
begin
UIConnect := LoadPackage('bpl');
showmdiform:=getprocaddress(UIConnect,'ShowMDIChildForm');
if (@showmdiform<>nil) then
showmdiform(application)
else showmessage('no prc');
end;
过几天就散分,让那些想知道的朋友看看先。或许还会有更好的建议。
我还想知道"京工之鸟"兄的做法。因为那种技术要好些,虽然复杂点。
明天开始试,请京工之鸟兄多多帮忙。
 
那么这个和DLL几乎没有区别啊?

P.S:怎么搞得?掉了好几封信件?E_Mail通知有的时候不灵了?
 
知道acitivex中如何使用mdi form 吗?[:D]
 
to autumn:应该也一样的可以实现吧!变通变通。

bpl和dll有很大的区别,bpl只限于delphi程序,可静可动。
还有就是bpl中的类输出要方便些。
 
maming 兄:
我想 bpl 主要优势是输出 VCL 的类,以跨模块(exe, dll, bpl 等)使用 VCL。要输出
一般的函数和过程,可能普通 dll 要更通用一些。你可以从 export 表看到最简单的 bpl
也要包含 system.pas 的代码,即使根本没用到 VCL 的框架,而普通 dll 不会这样。
 
现在的EMAIL通知好像经常丢诶?

我试过代码了,没有问题,谢谢!:)
 
两个EXE是不行的,类是属于一个进程的,在另一个进程里没有办法调用,不然,
我们就用不着BPL了。registclass是在进程内注册,BPL最主要实现的就是可以把
包内的类注册到主进程中。
 
如果用动态链接库就不行,DELPHI会在DLL和EXE里,各建一套类,相同的
一个类比如都是BUTTON,一个在DLL里,一个在EXE里,就不可以用AS或IS
操作符。但在BPL里,就可以了。
你可以参考《DELPHI技术手册》一书。
 
to 京工之鸟兄:
我昨天试了,是不行。如果用interface 是否可以呢?就是所谓的com吧!

 
我说的INTERFACE不是这个INTERFACE,不过,定义一个COM接口当然可以在别的
EXE里调用。没必要这么复杂吧?
我没看懂你真正的问题是什么?下面这句话什么意思?你以前用怎么样的静态调
用?现在又要改成什么样的动态调用?
“他们这间都是动态调用的,我以前的都是用静态调用,好占系统资源,因为公司
有很多机器是老的没有办法,只能改成动态调用。”
 
顶部