Delphi的Package技术(200分)

  • 主题发起人 主题发起人 MrMengyi
  • 开始时间 开始时间
M

MrMengyi

Unregistered / Unconfirmed
GUEST, unregistred user!
静态使用就不讨论的,这里着重讨论动态加载以及相关问题。
1.如何动态加载
2.如何发现包中的单元、类
3.类的注册
4.类注册的冲突
 
1.动态加载包:使用LoadPackage加载
bpl实际是一种动态连接库,LoadPackage得到的UINT返回值,实际就是加载动态连接库的句柄。
LoadPackage还进行一些初始化工作,
卸载包使用UnloadPackage函数
 
2.如何发现包中的单元、类
使用GetPackageInfo得到包中的单元,这个函数用到回调函数

得到类好象没有直接的方法,我只在网上找到一个。
根据单元名称,构造出该单元的注册函数,使用GetProcAddress得到这个函数的地址进行调用。注册函数就是单元文件里,Register这个函数了,它会调用RegisterComponents函数。
RegisterComponents函数会调用Classes单元中,RegisterComponentsProc函数指针。因此,将这个函数指针替换为自己定义的,就能够得到注册的函数信息了。
存在的问题,都是使用回调函数,使用起来有点麻烦。并且不好封装成类。而且必须使用动态的VCL包和RTL包
 
关注这个问题.收藏并学习中.谢谢楼主.
 
d6开发人员指南中有一部分
 
一个问题:
LoadPackage会不会自动注册包中的类?
我测试的结果是不会自动注册,那么动态使用包的时候,类能找到么?
 
最好用接口技术,DLL之间可以共享,我都用了很久了
 
请leon.huang详细讲一下,好吗?
我最终的目的也是脱离Delphi,构造自己的共享DLL
 
leon.huang提出的方法对我有些启发
目前bpl是有版本的,不同的版本之间不兼容,这有很大的问题
如果使用接口,应该能避免这个问题。
组件从TComponent继承,并包含所要继承的组件。就是面向对象所说的Has方式,而不是Is方式
 
后退
顶部