日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2025/3/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 delphi中採用bpl共享模塊的幾點釋疑 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

1. LoadPackage做了哪些事情?

LoadPackage的代碼可以從delphi的源碼(sysutils.pas)中找到

{ LoadPackage }

function LoadPackage(const Name: string): HMODULE;
begin
{$IFDEF MSWINDOWS}
? Result := SafeLoadLibrary(Name); //這裡使用windows api LoadLibraryA來以加載一個標(biāo)準(zhǔn)的dll的方式來加載(bpl本身也是一個動態(tài)鏈接庫)
{$ENDIF}
? if Result = 0 then
? begin
??? raise EPackageError.CreateResFmt(@sErrorLoadingPackage,
????? [Name,
?????? {$IFDEF MSWINDOWS}SysErrorMessage(GetLastError){$ENDIF}

? end;
? try
??? InitializePackage(Result); //這裡使用winton api GetProcessAddress來取得單元的initialization部分的地址,並執(zhí)行他
? except
{$IFDEF MSWINDOWS}
??? FreeLibrary(Result);
{$ENDIF}
??? raise;
? end;
end;

{ UnloadPackage }

procedure UnloadPackage(Module: HMODULE);
begin
? FinalizePackage(Module); //這裡執(zhí)行單元的finalization部分的代碼
{$IFDEF MSWINDOWS}
? FreeLibrary(Module); //採用windows api FreeLibaray來從內(nèi)存卸載動態(tài)鏈接庫
{$ENDIF}
end;

2. 在同一個應(yīng)用程序(exe)中多次loadpackage,會導(dǎo)致加載多個bpl的實例到內(nèi)存嗎?

答案是不會,bpl採用與windows動態(tài)鏈接庫一樣的方式來處理,同一個應(yīng)用程序exe多次load一個相同的bpl,返回的是同一個hmodule值。進程的地址空間中只會有一份該bpl的代碼

3. 在不同的應(yīng)用程序中l(wèi)oad同一個bpl,會導(dǎo)致加載多個bpl的實例到進程的內(nèi)存中嗎?

答案是:邏輯上每個應(yīng)用程序加載到的是一份獨立的bpl實例。實際上windows採用相應(yīng)的動態(tài)鏈接庫內(nèi)存映射技術(shù)來處理,內(nèi)存中只有一份bpl的代碼,但是邏輯上他們被很好的分隔,程序員可以當(dāng)成他們是獨立的來使用。

4.假設(shè)在bpl中定義了全局變量F: integer = 100,那如果多個應(yīng)用程序都加載了這個bpl並且修改F的值,那麼F的值會怎樣?

答案是,對於多個不同的應(yīng)用程序a,b,c...他們所擁有的F是獨立的,互不影響的,比如

應(yīng)用程序a把 F := F+1

b把F := F + 1

c把F := F + 1

此時並沒有一個公共的F = 103,而是各個應(yīng)用程序中都有一個全局變量F,他們的值分別為101,101,101

總結(jié)

以上是生活随笔為你收集整理的delphi中採用bpl共享模塊的幾點釋疑的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。