专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Delphi教程 » bpl文件:bpl和dll文件的区别[翻译] »正文

bpl文件:bpl和dll文件的区别[翻译]

来源: 发布时间:星期四, 2009年2月12日 浏览:126次 评论:0



[原文]

That is correct. A BPL is a DLL. (But not all DLLs are BPLs.)

> But I still found some dferent, such as that I can create a
> object from the Host exe and that pass to a BPL and mody it safely, but
> I do same to a dll, I can not mody any referenced property of the object.

When you use packages, there is _disibledevent=>> 但是我还是发现了些区别比如
>我可以在主应用中创建个对象把它传递给bpl然后
>我可以安全得修改它但是如果我用dll我就不能修改和
>引用这个对象属性


使用packages时每个单元 每个窗体 每个sysutils 每个system等等在内存中都只有份拷贝

所有作用于类操作符 比如is和as 都依赖于类引用引用其实就是个(受限)指针指向类定义(就是虚表 vmt) 如果两个引用指向相同vmt那么它们就是同个类引用


如果你在exe和dll里使用同个在stdctrls中定义这两个类vmt有区别地址is 和 as运算符在区别模块中不能正确地工作 但是如果你使用包那么内存中就只有个类拷贝保存在vcl70.bpl中那么所有引用那个包模块会共享同个类定义
个原因就是system单元中内存管理器所有串分配最后都是getmem和freemem如果exe分配了个串它使用它自己getmem拷贝如果它把串传给dll在dll中去free那么这个dll会它自己freemem拷贝而这个freemem不能访问exe中内存管理器这样就会产生而如果用packages它们都会使用rtl70.bpl中内存管理器(这个问题也可以通过在exe和dll间共享个内存管理器来解决共享内存只是个例子但还是不能解决类的间问题)


综上述我认为bpls和dlls的间主要区别就是输出数量用dll输出东西就是用exports关键字指定那些而用bpl所有单元erfaces里定义都输出包括全局变量和类定义initialization和finalization部分地址也输出另外在dll和bpl内部确实有很大区别bpl输出所有供RTI识别个文件是bpl而不是dll文件所需所有如果你loadpackage我也可以loadlibrary把它当作普通dll来load然后它会packages中所有单元initializatin部分并做些其他housekeeping?操作包里时产生汇编代码和dll中产生汇编代码是相同

次翻译文章很多地方翻译得不好


我觉得这篇文章很不错希望有时间高手能够重新翻译谢谢
















0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: