------摘自:http://blog.csdn.net/soobey/archive/2005/08/29/467732.aspx
現在我們不得不寫自己的dpk工程,以更改地檢測我們的猜想。我們首先建立乙個project group,包含三個工程:
program projectexe;
uses
forms,
windows,
unitformmain in 'unitformmain.pas' ;
unit unitformmain;
inte***ce
uses
windows, stdctrls, forms, classes, controls;
type
tformmain = class(tform)
button1: tbutton;
procedure button1click(sender: tobject);
private
public
end;
varformmain: tformmain;
implementation
procedure tformmain.button1click(sender: tobject);
varlform:tform2;
end;
end.
package package1;
requires
vcl,
rtl;
contains
unitformanother in 'unitformanother.pas' ,
unitform1 in 'unitform1.pas' ;
end.
unit unitformanother;
inte***ce
uses
forms;
type
tformanother = class(tform)
private
public
end;
implementation
end.
unit unitform1;
inte***ce
uses
unitformanother;
type
tform1 = class(tformanother)
private
public
end;
implementation
end.
package package2;
requires
rtl,
vcl;
contains
unitform2 in 'unitform2.pas' ;
end.
unit unitform2;
inte***ce
uses
unitformanother;
type
tform2 = class(tformanother)
private
public
end;
implementation
end.
小技巧:delphi對project group的編譯是按照列表順序從上到下進行的,因此在有些時候,被require或者use的檔案如果在下面,那麼可能會提示找不到檔案。因此最好用文字編輯器調整一下bpg檔案中的列表順序。
因此,現在基本可以得到結論:
集合b中的unit,如果存在於集合a中,則在連線時不需要對應的dcu檔案,有bpl和bpc就好了。而b-a部分,要麼必須有pas檔案,要麼需要有dcu檔案。
現在,編譯和連線的問題基本解決了,現在來研究載入。載入有兩種,一種是自動的,由delphi控制;一種是手動的,在程式中寫loadpackage。先來搞清楚什麼情況下會自動載入library。
測試是這樣的,projectexe use unitform1, package2 contains unitform2 requires package1,package1 contains unitform1和unitformanother。在projectexe的package list裡面僅有package2。執行結果是:載入的包有rtl、vcl和package1,package2並沒有出現。也就是說,自動裝入記憶體的包是那些存在於a集合中,且跟b集合有交集的包。所有想要完全手工載入包,還必須要注意一些問題,起碼它不能直接和間接地被require,包中的unit也不能在use裡面出現。換句話說,呼叫者完全不知道被呼叫包的情況下才能避免自動裝載。
既然呼叫者完全不知道被呼叫的包的資訊,憑什麼去呼叫呢?delphi裡面似乎沒有標頭檔案之類的東西。怎麼獲取這個包的介面呢?
Delphi中的包(三) bpl和dll
摘 自 http blog.csdn.net soobey archive 2005 08 30 468017.aspx 曾經聽說過 bpl就是一種特殊的dll 但是沒有想到這句話具有這麼大的意義。最近看到有人在屬於某個dpk的unit裡面寫export語句,覺得非常驚奇。但是遍查delphi的he...
Delphi中BPL包的使用,個人經驗
用包可以分模組編寫功能,方便開發階段的組織,同時也便於後期的公升級維護,使公升級的粒度越來越少 也是用了c 的類庫之後的感悟 下面寫幾點經驗 一 不要用delphi本身的bpl,把delphi自身的包中的單元取出來,合併成乙個bpl。二 不要直接用三方控制項的安裝包,也要自己建乙個包,把單元檔案中加...
delphi中採用bpl共享模組的幾點釋疑
1.loadpackage做了哪些事情?loadpackage的程式碼可以從delphi的原始碼 sysutils.pas 中找到 function loadpackage const name string hmodule begin result safeloadlibrary name 這裡使...