delphi中採用bpl共享模組的幾點釋疑

2021-05-23 15:35:25 字數 1379 閱讀 1439

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。二 不要直接用三方控制項的安裝包,也要自己建乙個包,把單元檔案中加...