在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

Delphi中動態鏈接庫2種調用方式的比較

Delphi中動態鏈接庫2種調用方式的比較

更新時間:2022-05-04 文章作者:未知 信息來源:網絡 閱讀次數:

摘要:本文闡述了Windows環境下動態鏈接庫的概念和特點,對靜態調用和動態調用兩種調用方式作出了比較,并給出了Delphi中應用動態鏈接庫的實例。

  一、動態鏈接庫的概念

  動態鏈接庫(Dynamic Link Library,縮寫為DLL)是一個可以被其它應用程序共享的程序模塊,其中封裝了一些可以被共享的例程和資源。動態鏈接庫文件的擴展名一般是dll,也有可能是drv、sys和fon,它和可執行文件(exe)非常類似,區別在于DLL中雖然包含了可執行代碼卻不能單獨執行,而應由Windows應用程序直接或間接調用。

  動態鏈接是相對于靜態鏈接而言的。所謂靜態鏈接是指把要調用的函數或者過程鏈接到可執行文件中,成為可執行文件的一部分。換句話說,函數和過程的代碼就在程序的exe文件中,該文件包含了運行時所需的全部代碼。當多個程序都調用相同函數時,內存中就會存在這個函數的多個拷貝,這樣就浪費了寶貴的內存資源。而動態鏈接所調用的函數代碼并沒有被拷貝到應用程序的可執行文件中去,而是僅僅在其中加入了所調用函數的描述信息(往往是一些重定位信息)。僅當應用程序被裝入內存開始運行時,在Windows的管理下,才在應用程序與相應的DLL之間建立鏈接關系。當要執行所調用DLL中的函數時,根據鏈接產生的重定位信息,Windows才轉去執行DLL中相應的函數代碼。

  一般情況下,如果一個應用程序使用了動態鏈接庫,Win32系統保證內存中只有DLL的一份復制品,這是通過內存映射文件實現的。DLL首先被調入Win32系統的全局堆棧,然后映射到調用這個DLL的進程地址空間。在Win32系統中,每個進程擁有自己的32位線性地址空間,如果一個DLL被多個進程調用,每個進程都會收到該DLL的一份映像。與16位Windows不同,在Win32中DLL可以看作是每個進程自己的代碼。

  二、動態鏈接庫的優點

  1. 共享代碼、資源和數據

   使用DLL的主要目的就是為了共享代碼,DLL的代碼可以被所有的Windows應用程序共享。

  2. 隱藏實現的細節

   DLL中的例程可以被應用程序訪問,而應用程序并不知道這些例程的細節。

  3. 拓展開發工具如Delphi的功能

  由于DLL是與語言無關的,因此可以創建一個DLL,被C++、VB或任何支持動態鏈接庫的語言調用。這樣如果一種語言存在不足,就可以通過訪問另一種語言創建的DLL來彌補。

  三、動態鏈接庫的實現方法

  1. Load-time Dynamic Linking

  這種用法的前提是在編譯之前已經明確知道要調用DLL中的哪幾個函數,編譯時在目標文件中只保留必要的鏈接信息,而不含DLL函數的代碼;當程序執行時,利用鏈接信息加載DLL函數代碼并在內存中將其鏈接入調用程序的執行空間中,其主要目的是便于代碼共享。

  2. Run-time Dynamic Linking

  這種方式是指在編譯之前并不知道將會調用哪些DLL函數,完全是在運行過程中根據需要決定應調用哪個函數,并用LoadLibrary和GetProcAddress動態獲得DLL函數的入口地址。
四、DLL的兩種調用方式在Delphi中的比較

  編寫DLL的目的是為了輸出例程供其他程序調用,因此在DLL的工程文件中要把輸出的例程用Exports關鍵字引出。在調用DLL的應用程序中,需要聲明用到的DLL中的方法,聲明格式要和DLL中的聲明一樣。訪問DLL中的例程有靜態調用和動態調用兩種方式。靜態調用方式就是在單元的Interface部分用External指示字列出要從DLL中引入的例程;動態調用方式就是通過調用Windows的API包括LoadLibrary函數、GetProcAddress函數以及FreeLibrary函數動態的引入DLL中的例程。

  靜態調用方式所需的代碼較動態調用方式所需的少,但存在著一些不足,一是如果要加載的DLL不存在或者DLL中沒有要引入的例程,這時候程序就自動終止運行;二是DLL一旦加載就一直駐留在應用程序的地址空間,即使DLL已不再需要了。動態調用方式就可解決以上問題,它在需要用到DLL的時候才通過LoadLibrary函數引入,用完后通過FreeLibrary函數從內存中卸載,而且通過調GetProcAddress函數可以指定不同的例程。最重要的是,如果指定的DLL出錯,至多是API調用失敗,不會導致程序終止。以下將通過具體的實例說明說明這調用方式的使用方法。

  1. 靜態調用方式

  示例程序創建了一個DLL,其中僅包含一個求兩個整數的和的函數,在主程序中輸入兩個整數,通過調用該DLL,即可求出兩個整數的和,如圖1所示。


圖1 DLL的靜態調用



  該DLL的程序代碼如下:

library AddNum;
uses
SysUtils,
Classes;

{$R *.res}

function AddNumber(Num1,Num2:integer):integer;stdcall; //定義求和函數
 begin
  result:=Num1+Num2;
 end;
  exports
  AddNumber; //引出求和函數
 begin
end.

  主程序在調用該DLL時,首先在interface部分聲明要調用的函數:

function AddNum(Num1,Num2:integer):integer;stdcall;external 'AddNum.dll'
name 'AddNumber';

  然后在按鈕控件的事件中寫入如下代碼:

procedure TForm1.Button1Click(Sender: TObject);
var
 Number1,Number2:integer;
 Sum:integer;
begin
 Number1:=strtoint(Edit1.Text);
 Number2:=strtoint(Edit2.Text);
 Sum:=AddNum(Number1,Number2); //調用求和函數計算結果
 Edit3.Text:=inttostr(Sum);
end;
2.動態調用方式

  這個示例程序創建了一個顯示日期的DLL,其中包含一個窗體,如圖2所示。


圖2 DLL的動態調用



  程序中定義了一個ShowCalendar函數,返回在這個窗體中設定的日期。函數定義如下:

function ShowCalendar(AHandle: THandle; ACaption: String): TDateTime;
var
 DLLForm: TDLLForm;
begin
 Application.Handle := AHandle;
 DLLForm := TDLLForm.Create(Application); //創建并顯示窗體
 try
  DLLForm.Caption := ACaption;
  DLLForm.ShowModal; //顯示方式為模式化
  Result := DLLForm.calDLLCalendar.CalendarDate; //返回設定日期
 finally
  DLLForm.Free; //用完后卸載該窗體
 end;
end;

  在DLL的工程文件中用exports ShowCalendar; 語句引出該函數。下面通過一個簡單的應用程序測試一下該DLL文件。新建一個工程文件,在窗體中放置一個Label控件和一個按鈕控件,在按鈕控件的OnClick事件中編寫如下代碼:

procedure TMainForm.Button1Click(Sender: TObject);
var
 OneHandle : THandle; //定義一個句柄變量
begin
 OneHandle := LoadLibrary('Clendar.dll'); //動態載入DLL,并返回其句柄
 try
  if OneHandle <> 0 then //如果載入成功則獲取ShowCalendar函數的地址
   @ShowCalendar := GetProcAddress(OneHandle, 'ShowCalendar');
   if not (@ShowCalendar = nil) then
    //如果找到該函數則在主窗體的Label1中顯示DLL窗體中設定的日期
    Label1.Caption := DateToStr(ShowCalendar(Application.Handle, Caption))
   else
    RaiseLastWin32Error;
 finally
  FreeLibrary(OneHandle); //調用完畢收回DLL占用的資源
 end;
end;

  從以上程序中可以看到DLL的動態調用方式比靜態調用方式的優越之處。DLL例程在用到時才被調入,用完后就被卸載,大大減少了系統資源的占用。在調用LoadLibrary函數時可以明確指定DLL的完整路徑,如果沒有指定路徑,運行時首先查找應用程序載入的目錄,然后是Windows系統的System目錄和環境變量Path設定的路徑。

  五、結束語

  由于動態鏈接庫可以實現代碼和資源的共享,大大減少系統資源的占用,因此在當今的應用程序開發中起著非常重要的作用。Delphi是現今流行的應用軟件開發工具,本文就如何在Delphi中使用動態鏈接庫給出了一定程度上的闡述。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 免费观看成人在线视频| 欧美午夜性生活| 日韩视频在线观看一区二区三区| 波多野结衣综合网| 黄色三级中文字幕| 国产片侵犯亲女视频播放| 亚洲成年人专区| 中国黄色录像片| 99亚洲国产精品| 中文字幕人妻熟女人妻洋洋| 欧美极品少妇无套实战| 大陆av在线播放| 亚洲国产精品久久久久婷蜜芽| 男女啪啪免费视频网站| 欧美日韩亚洲一| 欧美成人黄色网址| 天堂在线一区二区三区| 懂色av一区二区三区四区五区| 日本一二三区在线| 国产一级爱c视频| 精品久久久久久久免费人妻| 91蝌蚪视频在线观看| 亚洲天堂网站在线| 福利视频一区二区三区四区| 欧美a v在线播放| 国产探花在线看| 国产青草视频在线观看| 精品www久久久久奶水| 国产一伦一伦一伦| 国产一区 在线播放| 亚洲免费一级视频| 青青草国产免费| 三上悠亚在线一区二区| 欧美在线观看黄| 中文字幕第21页| 日本一区二区三区四区五区六区| 国产九九九九九| 99国产精品久久久久久| 欧美一区二区三区爽大粗免费| 日本熟妇人妻中出| 国产成a人亚洲精v品在线观看| 黄色av免费在线播放| 成人av在线播放观看| 国产精品久久久毛片| 国产精品无码一区二区在线| 在线观看免费黄色片| 免费黄色一级网站| 国产免费黄色av| 精品久久久无码人妻字幂| 九九热99视频| 日韩毛片在线免费看| 国产精品无码人妻一区二区在线| 污污的视频免费观看| 人妻无码视频一区二区三区| 国产不卡一区二区视频| 国产成人精品免费看在线播放| 成年人视频在线免费| 欧美黄色免费影院| 精品少妇人妻av免费久久洗澡| 国产成人精品免费看在线播放 | 91香蕉视频免费看| 在线观看国产一级片| 欧美黄色一级片视频| 黄色一级在线视频| 波多野结衣乳巨码无在线| 日本一本中文字幕| 日韩伦理在线免费观看| 大陆极品少妇内射aaaaaa| 国产91av视频在线观看| 日本三级福利片| 警花观音坐莲激情销魂小说| 26uuu成人| dy888午夜| 国产aaa免费视频| 毛片在线视频播放| 九九九九免费视频| 男女av免费观看| 亚洲欧美日韩一级| 亚洲综合20p| 色婷婷777777仙踪林| 国产一区 在线播放| 91丨porny丨探花| 国产视频一区二区三区在线播放 | 三级黄色片免费观看| 精产国品一二三区| 美女黄色免费看| 日韩欧美xxxx| 91pony九色| 97久久国产亚洲精品超碰热| 黄网站欧美内射| 中文字幕国内自拍| 免费成人深夜夜行网站视频| 国产真人做爰毛片视频直播| 日韩网址在线观看| а 天堂 在线| 青青艹视频在线| 国产福利精品一区二区三区| 99久久久精品视频| 亚洲77777| 国产美女永久无遮挡| 不要播放器的av网站| 异国色恋浪漫潭| 99精品免费在线观看| 超薄肉色丝袜足j调教99| 国产三区在线视频| 超薄肉色丝袜足j调教99| 日韩手机在线观看视频| 青青草视频在线视频| 色乱码一区二区三区在线| 中文字幕超清在线免费观看| 成人一区二区三| 91传媒免费视频| 久久久久久久久久久久久久久国产| www.成人黄色| 日韩免费高清在线| 成人网站免费观看入口| 亚洲五月激情网| 久草福利视频在线| 精品欧美一区免费观看α√| 国产精品中文久久久久久| 国产又大又黄又粗的视频| 成年人看的毛片| 91传媒免费视频| 色撸撸在线观看| www午夜视频| 国产精品一区二区羞羞答答| 午夜精品久久久久久久无码| 国产青草视频在线观看| 久久av喷吹av高潮av| 国产农村妇女精品久久| 天天看片天天操| 亚洲小视频网站| 三级视频中文字幕| www.日本一区| 中文字幕av不卡在线| 久久久久久久片| 欧美成人黄色网址| 国产aaaaa毛片| 白嫩少妇丰满一区二区| 四虎永久在线精品无码视频| 18禁免费无码无遮挡不卡网站| www.av毛片| 999香蕉视频| 免费观看成人网| 高清av免费看| 波多野结衣免费观看| 一级黄色片播放| 少妇人妻无码专区视频| 国产a级片网站| 日本新janpanese乱熟| 亚洲免费黄色网| 伊人五月天婷婷| www.av91| 亚洲成人福利在线| 看一级黄色录像| 国产又黄又大又粗视频| 国产精品69页| 久久久久久久久久毛片| 轻点好疼好大好爽视频| 免费毛片小视频| 中文字幕亚洲影院| 国产v片免费观看| 国产三级生活片| 国产免费黄色小视频| 亚洲另类第一页| 欧洲精品一区二区三区久久| 久久精品影视大全| 久久亚洲a v| 最新天堂在线视频| 日韩精品综合在线| 日本高清久久久| 蜜臀av无码一区二区三区| 亚洲激情在线观看视频| 男人天堂av片| 亚洲自拍第三页| 妞干网在线免费视频| 欧美日韩午夜爽爽| 一本久道综合色婷婷五月| 97免费视频观看| 四虎1515hh.com| 午夜dv内射一区二区| 少妇人妻大乳在线视频| 四虎影院一区二区| 亚洲色图38p| 国产最新免费视频| 波多野结衣av一区二区全免费观看| 欧美日韩亚洲一二三| av免费观看网| 异国色恋浪漫潭| 91香蕉视频免费看| 热久久久久久久久| 国产喷水theporn| 久久久久久久久久久久久久国产| www.av91| 日韩 欧美 视频| 久久久无码中文字幕久...| 伊人色在线观看| 女人另类性混交zo| 九九视频精品在线观看| wwwwww.色|