之前, 對BPL和DLL的區別, 一直是一知半解的狀態, 大部分的書(我看過的), 就算比較經典的delphi書, 也說得很含糊! 終于找到比較詳細的說明!!!
That is correct. A BPL is a DLL. (But not all DLLs are BPLs.)
> But I still found some different, such as that I can create a > object from the Host exe and that pass to a BPL and modify it safely, but > if I do same to a dll, I can not modify any referenced property of the object.
When you use packages, there is only ever one copy of any unit in memory. One copy of Forms, one copy of SysUtils, one copy of System (well, most of it), one copy of StdCtrls, etc.
All class-related operations, such as the "is" and "as" operators, rely on class references. Class references are actually just addresses. They point to definitions for the layouts of the classes'''' internals. (They point to what''''s called the virtual-method table, the VMT.) Two classes are the same if they point to the same VMT -- if the addresses are equal.
When you have a class defined in the EXE''''s copy of StdCtrls and the same class defined in a DLL''''s copy of StdCtrls, those classes will really have different addresses. The "is" and "as" operators won''''t work with cross-module clases. But when you use packages, there is only one copy of the class, kept in vcl70.bpl, so all modules that reference that package will share a single class definition.
Another factor is the memory manager in System. All string allocations ultimately call GetMem and FreeMem. If the EXE allocates a string, it uses its own GetMem. It then passes the string to a DLL, and the DLL might try to free it. The DLL will call its own copy of FreeMem, which won''''t have access to the EXE''''s memory-manager structures, and you''''ll get errors. With packages, everything will use the same memory manager from rtl70.bpl. (This can also be solved by using a shared memory manager between the EXE and the DLL; ShareMem is one example. That won''''t solve the class-comparison problem, though.)
Above, I said the major difference between BPLs and DLLs is the number of exported functions. With a DLL, the only things exported are what appear in the "exports" clause that you write yourself. With a BPL, everything from all the units'''' "interface" sections gets exported, including global variables and class definitions. Also exported are the addresses of the "initialization" and "finalization" sections. And, internally, that is indeed the major difference. A BPL exports the functions necessary for the RTL to recognize the file as being a BPL and not just a generic DLL. If you call LoadPackage, i will call LoadLibrary to load it like a normal DLL, and then it will call all the package''''s units'''' initialization sections and do a fe other housekeeping operations. Calling a package''''s functions generates the same kind of assembler code as is generated when you call a DLL function.
-- Rob
[系统软件]Explanation of UFT-8 and Unicode [系统软件]Using dllimport and dllexport in C++ Classes [常用软件]神奇 我家的照片会唱歌 照片会唱歌 [VB.NET程序]VB.NET and C# 语法比较手册 [Delphi程序]IntraWeb And ActiveForms [网页制作]Classes and Objects in PHP5 [网页制作]Twist and Fade 3.0操作界面介绍 [网页制作]FW - Twist and Fade 3.0 介绍 [网页制作]layer and tables question? [Web开发]Ajax using XMLHttpRequest and Struts
|