程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> dll的隱式鏈接

dll的隱式鏈接

編輯:.NET實例教程
在應用程序(或另一個D L L)能夠調用D L L中的函數之前,D L L文件映像必須被映射到調用進程的地址空間中。若要進行這項操作,可以使用兩種方法中的一種,即加載時的隱含鏈接或運行期的顯式鏈接。 這裡主要介紹隱式鏈接。

若要創建D L L模塊,必須執行下列操作步驟:
1) 首先必須創建一個頭文件,它包含你想要從D L L輸出的函數原型、結構和符號。D L L的所有源代碼模塊均包含該頭文件,以幫助創建D L L。後面將會看到,當創建需要使用D L L中包含的函數和變量的可執行模塊(或多個模塊)時,也需要這個頭文件。
2) 要創建一個C / C + +源代碼模塊(或多個模塊),用於實現你想要在D L L模塊中實現的函數和變量。由於這些源代碼模塊在創建可執行模塊時是不必要的,因此創建D L L的公司能夠保護公司的秘密。
3) 創建D L L模塊,將使編譯器對每個源代碼模塊進行處理,產生一個. o b j模塊(每個源代碼模塊有一個. o b j模塊)。
4) 當所有的. o b j模塊創建完成後,鏈接程序將所有. o b j模塊的內容組合在一起,產生一個D L L映象文件。該映像文件(即模塊)包含了用於D L L的所有二進制代碼和全局/靜態數據變量。為了執行這個可執行模塊,該文件是必不可少的。
5) 如果鏈接程序發現D L L的源代碼模塊至少輸出了一個函數或變量,那麼鏈接程序也生成一個. l i b文件。這個. l i b文件很小,因為它不包含任何函數或變量。它只是列出所有已輸出函數和變量的符號名。為了創建可執行模塊,該文件是必不可少的。
一旦創建了D L L模塊,就可以創建可執行模塊。其創建步驟是:
6) 在引用函數、變量、數據、結構或符號的所有源代碼模塊中,必須包含D L L開發人員創建的頭文件。
7) 要創建一個C / C + +源代碼模塊(或多個模塊),用於實現你想要在可執行模塊中實現的函數和變量。當然該代碼可以引用D L L頭文件中定義的函數和變量。
8) 創建可執行模塊,將使編譯器對每個源代碼模塊進行處理,生成一個. o b j模塊(每個源代碼模塊有一個. o b j模塊)。
9) 當所有. o b j模塊創建完成後,鏈接程序便將所有的. o b j模塊的內容組合起來,生成一個可執行的映像文件。該映像文件(或模塊)包含了可執行文件的所有二進制代碼和全局/靜態變量。該可執行模塊還包含一個輸入節,列出可執行文件需要的所有D L L模塊名。此外,對於列出的每個D L L名字,該節指明了可執行模塊的二進制代碼引用了哪些函數和變量符號。下面你會看到操作系統的加載程序將對該輸入節進行分析。一旦D L L和可執行模塊創建完成,一個進程就可以執行。當試圖運行可執行模塊時,操作系統的加載程序將執行下面的操作步驟:

10) 加載程序為新進程創建一個虛擬地址空間。可執行模塊被映射到新進程的地址空間。加載程序對可執行模塊的輸入節進行分析。對於該節中列出的每個D L L名字,加載程序要找出用戶系統上的D L L模塊,再將該D L L映射到進程的地址空間。注意,由於D L L模塊可以從另一個D L L模塊輸入函數和變量,因此D L L模塊可以擁有它自己的輸入節。若要對進程進行全面的初始化,加載程序要分析每個模塊的輸入節,並將所有需要的D L L模塊映射到進程的地址空間。如你所見,對進程進行初始化是很費時間的。

1。輸出的真正含義是什麼

介紹一個真正有意思的東西是_ _ d e c l s p e c ( d l l e x p o r t )修改符。當M i c r o s o f t的C / C + +編譯器看到變量、函數原型或C + +類之前的這個修改符的時候,它就將某些附加信息嵌入產生的. o b j文件中。當鏈接D L L的所有. o b j文件時,鏈接程序將對這些信息進行分析。當D L L被鏈接時,鏈接程序要查找關於輸出變量、函數或C + +類的信息,並自動生成一個. l i b文件。該. l i b文件包含一個D L L輸出的符號列表。當然,如果要鏈接引用該D L L的輸出符號的任何可執行模塊,該. l i b文件是必不可少的。除了創建. l i b文件外,鏈接程序還要將一個輸出符號表嵌入產生的D L L文件。這個輸出節包含一個輸出變量、函數和類符號的列表(按字母順序排列)。該鏈接程序還將能夠指明在何處找到每個符號的相對虛擬地址( RVA)放入D L L模塊。

2。創建可執行模塊

當創建可執行源代碼文件時,必須加上D L L的頭文件。如果沒有頭文件,輸入的符號將不會被定義,而且編譯器將會發出許多警告和錯誤消息。

可執行源代碼文件被編譯時,使用_ _ d e c l s p e c ( d l l i m p o r t )進行定義。當編譯器看到修改變量、函數或C + +類的_ _ d e c l s p e c ( d l l i m p o r t )時,它知道這個符號是從某個D L L模塊輸入的。它不知道是從哪個D L L模塊輸入的,並且它也不關心這個問題。編譯器只想確保你用正確的方法訪問這些輸入的符號。現在你在源代碼中可以引用輸入的符號,一切都將能夠正常工作。

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