M MrMengyi Unregistered / Unconfirmed GUEST, unregistred user! 2006-04-28 #1 静态使用就不讨论的,这里着重讨论动态加载以及相关问题。 1.如何动态加载 2.如何发现包中的单元、类 3.类的注册 4.类注册的冲突
M MrMengyi Unregistered / Unconfirmed GUEST, unregistred user! 2006-04-28 #2 1.动态加载包:使用LoadPackage加载 bpl实际是一种动态连接库,LoadPackage得到的UINT返回值,实际就是加载动态连接库的句柄。 LoadPackage还进行一些初始化工作, 卸载包使用UnloadPackage函数
1.动态加载包:使用LoadPackage加载 bpl实际是一种动态连接库,LoadPackage得到的UINT返回值,实际就是加载动态连接库的句柄。 LoadPackage还进行一些初始化工作, 卸载包使用UnloadPackage函数
M MrMengyi Unregistered / Unconfirmed GUEST, unregistred user! 2006-04-28 #3 2.如何发现包中的单元、类 使用GetPackageInfo得到包中的单元,这个函数用到回调函数 得到类好象没有直接的方法,我只在网上找到一个。 根据单元名称,构造出该单元的注册函数,使用GetProcAddress得到这个函数的地址进行调用。注册函数就是单元文件里,Register这个函数了,它会调用RegisterComponents函数。 RegisterComponents函数会调用Classes单元中,RegisterComponentsProc函数指针。因此,将这个函数指针替换为自己定义的,就能够得到注册的函数信息了。 存在的问题,都是使用回调函数,使用起来有点麻烦。并且不好封装成类。而且必须使用动态的VCL包和RTL包
2.如何发现包中的单元、类 使用GetPackageInfo得到包中的单元,这个函数用到回调函数 得到类好象没有直接的方法,我只在网上找到一个。 根据单元名称,构造出该单元的注册函数,使用GetProcAddress得到这个函数的地址进行调用。注册函数就是单元文件里,Register这个函数了,它会调用RegisterComponents函数。 RegisterComponents函数会调用Classes单元中,RegisterComponentsProc函数指针。因此,将这个函数指针替换为自己定义的,就能够得到注册的函数信息了。 存在的问题,都是使用回调函数,使用起来有点麻烦。并且不好封装成类。而且必须使用动态的VCL包和RTL包
M MrMengyi Unregistered / Unconfirmed GUEST, unregistred user! 2006-04-28 #6 一个问题: LoadPackage会不会自动注册包中的类? 我测试的结果是不会自动注册,那么动态使用包的时候,类能找到么?
L leon.huang Unregistered / Unconfirmed GUEST, unregistred user! 2006-04-28 #7 最好用接口技术,DLL之间可以共享,我都用了很久了
M MrMengyi Unregistered / Unconfirmed GUEST, unregistred user! 2006-04-28 #8 请leon.huang详细讲一下,好吗? 我最终的目的也是脱离Delphi,构造自己的共享DLL
M MrMengyi Unregistered / Unconfirmed GUEST, unregistred user! 2006-04-29 #10 leon.huang提出的方法对我有些启发 目前bpl是有版本的,不同的版本之间不兼容,这有很大的问题 如果使用接口,应该能避免这个问题。 组件从TComponent继承,并包含所要继承的组件。就是面向对象所说的Has方式,而不是Is方式
leon.huang提出的方法对我有些启发 目前bpl是有版本的,不同的版本之间不兼容,这有很大的问题 如果使用接口,应该能避免这个问题。 组件从TComponent继承,并包含所要继承的组件。就是面向对象所说的Has方式,而不是Is方式