亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

Delphi中的包(一):關于exe的編譯、連接和執行

2019-11-18 17:57:23
字體:
來源:轉載
供稿:網友

最近搞Delphi,發現原來的程序中使用了很多包,但是總是處于懵懵懂懂的狀態。索性來好好研究一下這個問題,可能要花一些時間。所以首先把需要分析的問題列出來:
什么是包?什么是exe?它們在組成上有什么不同?包跟dcu是什么關系?dcp是干什么的?這些文件在編譯時是什么關系?又是怎么裝載的?裝載了以后怎么樣操作包?dll可以exports,但是為什么delphi幫助中不提包的exports,但是有些代碼卻又在包中使用exPRots?

首先來看看delphi的編譯過程。delphi的工程中有兩類:包和程序,前者的后綴為dpk,后者為dpr。從簡單的開始,先來搞dpr。根據delphi的幫助文檔,一個典型的dpr文件的結構如下:
 1 program Editor;
 2    
 3     uses
 4       Forms, {change to QForms in linux}
 5       REAbout in 'REAbout.pas' {AboutBox},
 6       REMain in 'REMain.pas' {MainForm};
 7    
 8     {$R *.res}
 9    
10     begin
11       application.Title := 'Text Editor';
12       Application.CreateForm(TMainForm, MainForm);
13       Application.Run;
14     end.
其中10行到14行,begin…end很自然就是程序的執行入口。uses部分指明了程序需要使用的一些Unit,這個就比較含糊了,為什么有的會用in指明源代碼的位置(這部分是自己向工程中添加的),有的如Forms這個部分,卻又不需要?那每個Unit又會uses其它Unit,這個問題似乎越來越復雜了。先看整個源代碼的結構:

我猜測編譯器第一步首先遍歷這張有向圖,對每個Unit,如果有必要就對其進行編譯,生成對應的dcu。而這個“必要”問題,我開始以為是use這個Unit的語句是帶有in的,后來試驗發現不對。因為在上面的情況下,Unit3并沒有在Unit1的Uses子句中指明路徑,但是仍然正確產生了對應的dcu文件。后來使用filemon來監視文件打開情況,發現過程是這樣的:對于圖中的每個節點,編譯器按照當前目錄—project屬性中的search path—IDE環境中的library path,這樣的順序,搜索節點對應的pas文件,沒找到就再來一遍,但是這次搜索的是節點對應的dcu文件。

現在編譯搞定了,每個Unit(即pas文件)已經生成了對于的dcu文件,下面的問題是連接。說到連接,問題就復雜了,連接有兩種:靜態和動態。靜態連接就是說把這些dcu全部合并到一起。這樣,一個Unit對另一個Unit的調用,就成了程序內部的事情了。這樣的好處是快,而且簡單,并發共享之類的問題都容易處理。缺點是目標程序很大,而且如果現在要編寫另一個程序,而Unit3可以重用的話,則在連接時Unit3.dcu被再次拷貝。這樣在兩個程序同時運行時,內存中會有兩個Unit3的副本,比較浪費。動態連接就是說,兩個程序在連接時,僅僅只保留對Unit3的引用,而并不拷貝Unit3的內容。到運行時,把Unit3裝入內存,讓兩個程序公用。Dll和BPL都是動態連接的解決方案。問題在于,delphi中關于連接的選項就只有project|Options|packages菜單中出現,“Build with runtime packages”這句話實在是太模糊了。所以還要再研究一下。
在程序執行的時候,我們可以通過view|debug window|moudles來查看有哪些東西被加載到內存中去了,它們又包含哪些內容。
簡便起見,我們建立如下結構的一個程序:


program ProjectEXE;


uses
  Forms,
  Windows,
  UnitFormMain in 'UnitFormMain.pas' {FormMain};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TFormMain, FormMain);
  Application.Run;
end.


unit UnitFormMain;

interface

uses
  Windows, StdCtrls, Forms, UnitFormAnother,Classes, Controls;

type
  TFormMain = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormMain: TFormMain;

implementation

{$R *.dfm}

procedure TFormMain.Button1Click(Sender: TObject);
var
  LForm:TFormAnother;
begin
  LForm:=TFormAnother.Create(Application);
  LForm.ShowModal;
  LForm.Free;
end;

end.


unit UnitFormAnother;

interface

uses
  Forms;

type
  TFormAnother = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

implementation

{$R *.dfm}

end.


“Build with runtime packages”不打鉤的時候,是靜態連接的。有向圖中出現的所有Unit都包含在目標文件中了,整個exe有356k,而兩個Unit各自只有4k。
現在來動態?!癇uild with runtime packages”打鉤,現在發現運行時ProjectEXE.exe文件只包含四個部分:兩個Form、一個SysInit.pas、一個ProjectEXE.dpr;與此同時進程樹里面多了兩個bpl:rtl60和vcl60,它們的內容就是剛才靜態連接中出現的那些Unit?,F在ProjectEXE.exe只有16k。也就是說,有向圖中的Unit,一部分放在exe中了,另一部分放在bpl中了。但是根據什么來劃分呢?是根據uses子句,還是根據這里“Build with runtime packages”中的列表?繼續測試,發現:如果列表中僅包含vcl60,則加載到內存中的還是兩個bpl加一個exe;如果列表中只包含rtl60,則內存中僅包含rtl60和exe,但是exe的內容發生了變化:里面的Unit增多了,而且基本都是vcl60包里面的。我猜想應該是rtl和vcl包之間存在require關系。這個留到下一步再測試。但是初步估計連接過程中,肯定會利用包列表,將那些已經在包中存在的Unit從exe中排除出去。

在動態連接之后,還存在一個問題:裝入。裝入有兩種策略,靜態也稱為自動,由delphi生成代碼,在裝載exe之前,自動裝入包;另一種是動態,即在程序運行時通過編碼,指定一個包,把它裝入內存。問題在于,我必須搞清楚delphi在什么情況下會自動裝入一個包,什么情況下可以避免delphi自作聰明,這樣才能靈活地使用包。前面的試驗中,只可以看出,在dpr文件執行到begin之前,靜態連接的的包就已經裝入內存了。具體過程我也不清楚,等下一章開始寫自己的包,再來做實驗吧。



上一篇:Delphi中的包(三):bpl和dll

下一篇:李維看Delphi2006(DeXter)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产日产欧美a一级在线| 亚洲成色777777在线观看影院| 亚洲美女精品久久| 日韩一区二区三区在线播放| 久久久久久久影视| 7777免费精品视频| 日韩有码在线播放| 国产亚洲精品一区二区| 美日韩丰满少妇在线观看| 日本一区二三区好的精华液| 亚洲va电影大全| www亚洲欧美| 欧美福利视频网站| 欧美三级欧美成人高清www| 日韩在线视频观看| 亚洲国产高清高潮精品美女| 亚洲国产小视频| 一色桃子一区二区| 亚洲国产小视频在线观看| 久久久97精品| 日韩av在线免费看| 亚洲第一页在线| 一本色道久久综合亚洲精品小说| 成人淫片在线看| 俺去了亚洲欧美日韩| 美女国内精品自产拍在线播放| 97久久伊人激情网| 成人av在线亚洲| 色偷偷av一区二区三区| 国产午夜精品美女视频明星a级| 欧美色欧美亚洲高清在线视频| 日韩成人在线免费观看| 国产精品亚洲片夜色在线| 欧美丰满少妇xxxx| 亚洲国产精品悠悠久久琪琪| 欧美成人一区在线| 在线观看国产精品日韩av| 中文字幕一精品亚洲无线一区| 国产一区视频在线| 日韩免费在线播放| 欧美性少妇18aaaa视频| 狠狠躁夜夜躁人人爽超碰91| 日韩中文av在线| 尤物yw午夜国产精品视频| 亚洲精品一区二区三区不| 国产精品中文字幕在线观看| 久久av在线播放| 亚洲大胆人体在线| 国产免费一区视频观看免费| 日韩精品在线观看一区二区| 亚洲男人第一av网站| 欧美色图在线视频| 国产精品视频网| 国产欧美日韩综合精品| 成人网址在线观看| 久久成人精品视频| 欧美在线视频观看| 国产精品美女主播| 中文字幕日韩av| 亚洲国产美女久久久久| 欧洲亚洲在线视频| 欧美一级高清免费| 久久亚洲精品国产亚洲老地址| 热久久这里只有| 国产欧美日韩综合精品| 国产欧美日韩专区发布| 少妇高潮久久77777| 国产脚交av在线一区二区| 亚洲欧洲国产一区| 国产精品免费久久久久久| 日韩欧美在线观看视频| 欧美另类在线观看| 91中文字幕在线观看| 国产偷亚洲偷欧美偷精品| 91久久精品国产| 日本一区二区不卡| 国产色视频一区| 亚洲天堂成人在线视频| 91av在线播放| 亚洲老头老太hd| 久久久在线免费观看| 日韩一区av在线| 亚洲精选在线观看| 久久久最新网址| 精品亚洲一区二区三区四区五区| 国产精品中文字幕在线观看| 欧美精品videos另类日本| 国产视频亚洲视频| 色婷婷**av毛片一区| 91久久夜色精品国产网站| 亚洲色图欧美制服丝袜另类第一页| 日韩精品视频在线观看免费| 欧美成人精品在线| 国产成人综合av| 成人免费观看49www在线观看| 亚洲第一免费网站| 韩国美女主播一区| 国产一区二区丝袜高跟鞋图片| 91丝袜美腿美女视频网站| xxx成人少妇69| 欧美午夜无遮挡| 91九色综合久久| 欧美成人激情图片网| 欧美性一区二区三区| 亚洲free性xxxx护士白浆| 亚洲欧美日韩在线高清直播| 国产精品女视频| 亚洲国产古装精品网站| 亚洲免费av电影| 国产精品国内视频| 欧美性感美女h网站在线观看免费| 欧美制服第一页| 夜色77av精品影院| 欧美日韩国产黄| 欧美日韩亚洲精品内裤| 精品视频在线播放色网色视频| 国产精品色悠悠| 日韩亚洲一区二区| www.欧美视频| 日本aⅴ大伊香蕉精品视频| 26uuu日韩精品一区二区| 欧美猛交ⅹxxx乱大交视频| 91精品国产网站| 欧美理论电影在线播放| 久久成人亚洲精品| 日韩欧美在线视频免费观看| 亚洲一区国产精品| 国产一区私人高清影院| 午夜精品久久久久久久白皮肤| 懂色av中文一区二区三区天美| 久久五月情影视| 宅男66日本亚洲欧美视频| 亚洲精品电影在线| 亚洲激情视频在线| 神马久久久久久| 91欧美精品午夜性色福利在线| 92看片淫黄大片欧美看国产片| 亚洲国产99精品国自产| 成人黄色片在线| 日韩精品高清在线| 96精品久久久久中文字幕| 日韩一区二区精品视频| 国产精品久久久久91| 欧美在线中文字幕| 亚洲人成在线电影| 国产欧美日韩精品丝袜高跟鞋| 国产亚洲精品va在线观看| 国产在线观看91精品一区| 7777kkkk成人观看| 91精品久久久久久| 久久精品在线视频| 国产日韩中文字幕在线| 欧美中文在线免费| 亚洲电影在线看| 亚洲国产成人精品久久久国产成人一区| 视频在线观看99| 91欧美激情另类亚洲| 欧美洲成人男女午夜视频| 国产精品久久久亚洲| 国产精品麻豆va在线播放| 伊人一区二区三区久久精品| 亚洲欧美国产一区二区三区| 午夜精品久久久久久99热软件| 日韩人体视频一二区|