1. loadpackage做了哪些事情?
loadpackage的程式碼可以從delphi的原始碼(sysutils.pas)中找到
function loadpackage(const name: string): hmodule;
begin
result := safeloadlibrary(name); //這裡使用windows api loadlibrarya來以載入乙個標準的dll的方式來載入(bpl本身也是乙個動態鏈結庫)
if result = 0 then
begin
raise epackageerror.createresfmt(@serrorloadingpackage,
[name,
syserrormessage(getlasterror)
end;
tryinitializepackage(result); //這裡使用winton api getprocessaddress來取得單元的initialization部分的位址,並執行他
except
freelibrary(result);
raise;
end;
end;
procedure unloadpackage(module: hmodule);
begin
finalizepackage(module); //這裡執行單元的finalization部分的程式碼
freelibrary(module); //採用windows api freelibaray來從記憶體解除安裝動態鏈結庫
end;
2. 在同乙個應用程式(exe)中多次loadpackage,會導致載入多個bpl的例項到記憶體嗎?
答案是不會,bpl採用與windows動態鏈結庫一樣的方式來處理,同乙個應用程式exe多次load乙個相同的bpl,返回的是同乙個hmodule值。程序的位址空間中只會有乙份該bpl的程式碼
3. 在不同的應用程式中load同乙個bpl,會導致載入多個bpl的例項到程序的記憶體中嗎?
答案是:邏輯上每個應用程式載入到的是乙份獨立的bpl例項。實際上windows採用相應的動態鏈結庫記憶體對映技術來處理,記憶體中只有乙份bpl的程式碼,但是邏輯上他們被很好的分隔,程式設計師可以當成他們是獨立的來使用。
4.假設在bpl中定義了全域性變數f: integer = 100,那如果多個應用程式都載入了這個bpl並且修改f的值,那麼f的值會怎樣?
答案是,對於多個不同的應用程式a,b,c...他們所擁有的f是獨立的,互不影響的,比如
應用程式a把 f := f+1
b把f := f + 1
c把f := f + 1
此時並沒有乙個公共的f = 103,而是各個應用程式中都有乙個全域性變數f,他們的值分別為101,101,101
Delphi中的包(二) 關於bpl
摘自 http blog.csdn.net soobey archive 2005 08 29 467732.aspx 現在我們不得不寫自己的dpk工程,以更改地檢測我們的猜想。我們首先建立乙個project group,包含三個工程 program projectexe uses forms,wi...
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。二 不要直接用三方控制項的安裝包,也要自己建乙個包,把單元檔案中加...