程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi 初始化的順序,Delphi初始化順序

Delphi 初始化的順序,Delphi初始化順序

編輯:Delphi

Delphi 初始化的順序,Delphi初始化順序


一、存儲結構:

初始化單元存儲在一個數組InitContext.InitTable^.UnitInfo中,其中UnitInfo是以數組的方式存儲的,其中InitTable的定義為:

Delphi <wbr>初始化

 

其中InitTable定義為packageInfo的類型,再來看看PackageInfo的定義:

Delphi <wbr>初始化

 

可以看到PackageInfo中的UnitInfo被定義為PUnitEntryTable類型,接下來再看PUnitEntryTable的定義:

Delphi <wbr>初始化

 

可以看到單元例程存儲在一個數組中,最大可以存儲一千萬個單元例程,每個例程函數中有Init和FInit兩個入口函數,其中Init表示Initialization例程的入口地址,FInit為Finalization例程的入口地址;

結論:delphi初始化例程函數是以一個順序列表的方式存儲的;

 

二、初始化例程執行順序:

         初始化例程執行函數在System.pas單元的InitUnits函數中:

Delphi <wbr>初始化

 

結論:初始化執行是一個順序循環執行過程,從0到Count – 1的順序執行;

 

         Finalization例程的執行是在System.pas單元的FinalizeUnits函數中:

Delphi <wbr>初始化

 

結論:Finalization執行是一個逆序循環執行過程,從Count - 1到0的逆序執行;

 

 

三、初始化例程搜索順序:

         單元例程的搜索順序是編譯器完成,無法看到代碼,但是可以寫一些小的Demo來猜測其搜索順序;

         如果在dpr中引用了Unit1,然後又在Unit1中引用了Unit2,接著在Unit2中引用了Unit3,那麼在執行Initialization時先執行Unit3,再是Unit2,最後是Unit1;

         如果在dpr中順序引用Unit1, Unit2, Unit3,但是在Unit1中不引用Unit2,Unit2中不引用Unit3,那麼在執行Initialization時先執行Unit1,再是Unit2,最後是Unit3;

 

結論:首先從dpr文件中加載第一個單元如A,在試圖加載A的Initialization時,先查看A的uses部分,這裡的uses不分Interface部分還是implementation部分,只分先後順序,當發現A有Uses單元時,比如依次引用了單元B和C,則先將A壓入堆棧,然後處理B,如果B引用了其他單元,處理方式同A,如果沒有引用其他單元,則將B的例程保存到UnitEntryTable中(如果UnitEntryTable中已經有了B單元則不保存);接著以相同的方式處理C,當A引用的單元都處理完後將A從堆棧彈出並保存到UnitEntryTable中;其他單元依次處理;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved