在线看毛片视频-国产免费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>
  • 国产精品av免费| 亚洲欧美日韩精品一区| 欧美 日韩 国产精品| 黄色成人在线看| 欧美成人乱码一二三四区免费| 霍思燕三级露全乳照| 少妇熟女一区二区| 在线免费看v片| 热久久久久久久久| 免费成年人高清视频| 自拍偷拍视频在线| xxxx一级片| 免费看日本毛片| 欧美 国产 精品| www.av91| 激情文学亚洲色图| 欧美一区二区中文字幕| 日本在线视频www| 97中文字幕在线| 国产女教师bbwbbwbbw| 免费超爽大片黄| 毛片av在线播放| 97在线播放视频| 手机在线视频一区| 免费国产a级片| 亚洲这里只有精品| 欧美久久久久久久久久久久久| 动漫av网站免费观看| theporn国产精品| 国产成人手机视频| www黄色av| 青草视频在线观看视频| 欧美女同在线观看| 美女黄色片视频| 国产欧美日韩小视频| 91九色国产ts另类人妖| 国产v亚洲v天堂无码久久久| 高清无码视频直接看| 人人干人人视频| 一区二区三区入口| 国产精品丝袜久久久久久消防器材| 丝袜老师办公室里做好紧好爽| 一路向西2在线观看| 一起操在线视频| 分分操这里只有精品| 精品国产一二三四区| 黄色一级视频片| 久久国产这里只有精品| 成年人黄色在线观看| 日韩欧美不卡在线| 日韩一区二区三区不卡视频| 色中文字幕在线观看| 日韩小视频网站| 伊人五月天婷婷| 亚洲一区二区福利视频| 国产无套粉嫩白浆内谢的出处| 国语对白做受xxxxx在线中国 | 欧美日韩午夜爽爽| 最新天堂中文在线| 免费黄色一级网站| 欧美激情成人网| 黄色一级片av| www.日本久久| 国产精品v日韩精品v在线观看| 欧美成人精品免费| 国产原创精品在线| 少妇网站在线观看| 欧美日韩福利在线| 国产麻花豆剧传媒精品mv在线| 亚洲黄色网址在线观看| 丰满少妇在线观看| 亚洲a级黄色片| 大陆极品少妇内射aaaaaa| 成人手机视频在线| 国产在线播放观看| 麻豆传传媒久久久爱| 免费高清一区二区三区| 特级丰满少妇一级| 日本免费a视频| 五月六月丁香婷婷| 九九九九九九九九| 国产成人三级视频| 黄色免费福利视频| 成人毛片一区二区| 中文字幕第80页| 黄色小视频大全| 日本黄色播放器| wwww.国产| 成人网站免费观看入口| www.国产在线视频| 免费一级淫片aaa片毛片a级| 欧美乱大交xxxxx潮喷l头像| 色悠悠久久综合网| 性一交一乱一伧国产女士spa| 噜噜噜久久亚洲精品国产品麻豆| 黄色免费网址大全| 日韩av高清在线看片| www.成年人| 国产aaa免费视频| 久久精品在线免费视频| 野外做受又硬又粗又大视频√| 一区二区三区欧美精品| 2022亚洲天堂| 男人添女人荫蒂免费视频| 麻豆传传媒久久久爱| 国产中文字幕二区| 精品无码国产一区二区三区av| 天天操精品视频| 手机看片一级片| 91网站在线观看免费| 不卡中文字幕在线观看| 日韩a级黄色片| 免费激情视频在线观看| 伊人五月天婷婷| www婷婷av久久久影片| 男人靠女人免费视频网站| 欧美日韩dvd| 激情五月亚洲色图| 91av视频免费观看| 国产日韩欧美久久| 免费黄色日本网站| 欧美国产日韩激情| 激情图片qvod| 久久精品免费一区二区| 一级性生活视频| 丰满人妻中伦妇伦精品app| 黑森林福利视频导航| 在线免费看v片| 大陆极品少妇内射aaaaaa| 午夜视频在线观| 日本三区在线观看| 日本久久久久久久久久久久| 免费一级特黄特色毛片久久看| www国产无套内射com| 精品中文字幕av| 国产亚洲天堂网| 99在线免费视频观看| 大香煮伊手机一区| 成人免费xxxxx在线视频| 国产成人在线小视频| 今天免费高清在线观看国语| 久久久久免费看黄a片app| av在线com| 国产高清视频网站| 国产精品88久久久久久妇女| www.射射射| 日本成人性视频| 白白操在线视频| 久久国产乱子伦免费精品| 99精品人妻少妇一区二区| 99久re热视频精品98| 在线视频观看一区二区| 欧美一级在线看| 亚洲自偷自拍熟女另类| 秋霞无码一区二区| 无码人妻丰满熟妇区五十路百度| 精品久久免费观看| 国产资源中文字幕| www亚洲国产| 在线看免费毛片| 一级做a爱视频| 中文字幕网av| 911福利视频| 国内精品国产三级国产aⅴ久| 日本免费一级视频| 91视频 - 88av| 污污视频网站免费观看| 精品一区二区成人免费视频| 欧美激情视频免费看| 欧美成人乱码一二三四区免费| 国产精品videossex国产高清| 国产精品第12页| 亚洲熟妇av日韩熟妇在线| 久久久久久久片| 国产中文字幕乱人伦在线观看| 三级a在线观看| 青青草原av在线播放| 好吊妞无缓冲视频观看| 可以看污的网站| www.com操| 亚洲中文字幕无码av永久| 国产资源第一页| 91精品国产毛片武则天| 污污网站免费观看| 污免费在线观看| 日韩精品视频一二三| 日本久久久精品视频| 天天干天天操天天玩| 欧美在线观看成人| 成人3d动漫一区二区三区| www.国产福利| 天堂av免费看| 三级a在线观看| 熟女少妇在线视频播放| 日本在线观看a| 最新中文字幕2018| 国产精品99久久久久久大便| 国产精品久久久久久久乖乖| 天堂av手机在线| 在线看免费毛片|