dll可以包含全域性資料及區域性資料
變數範圍
dll變數的預設範圍與應用程式所宣告的變數作用域相同,dll原始檔中的全域性變數對於使用dll的每個程序是全部可見的。靜態變數受限於宣告所在塊範疇。預設情況下,每個程序具有自己的dll全域性變數及靜態變數例項。
動態記憶體分配
當dll用記憶體分配函式(globalalloc、localalloc、heapalloc及virtualalloc)分配記憶體時,被分配的記憶體處於呼叫程序的虛位址空間中,並且僅能被該程序的執行緒訪問。
dll可以使用檔案映像來分配可在程序間共享的記憶體。關於如何利用檔案映像建立共享命名儲存空間的全面論述,可參照「檔案映像」。檢視應用dllmain函式設立檔案映像的共享記憶體,參照「在動態鏈結庫中使用共享記憶體」。
執行緒區域性儲存
乙個多執行緒程序中的每個執行緒利用執行緒區域性儲存(tls)函式,可以讓dll通過為多執行緒程序中每個執行緒分配儲存及檢索不同值的索引。例如,乙個電子**程式中每當使用者開啟乙個新的電子**時,就在同一執行緒中建立乙個新的例項。為各種電子**操作提供函式的dll可以通過tls儲存每個電子**的當前狀態(行、列等等)。關於tls更為全面的論述,可參照「執行緒區域性儲存」。關於通過dllmain函式建立執行緒區域性儲存的示例,可參照「在動態鏈結庫中使用執行緒區域性儲存」。
警告:visual c++ 編譯器中可以利用_declspec(thread)來宣告執行緒區域性變數,如果應用該語法,就不能通過loadlibrary或loadlibraryex函式明確載入dll了。如果需要通過函式明確載入dll的話,就必須通過執行緒區域性儲存函式來實現,而不是_declspec(thread)。
當應用程式載入乙個與已裝載版本不同的dll時,問題就會產生。如果是在windows 2000中執行的話,你可以通過建立乙個重定向檔案以使用正確版本的dll。重定向檔案的內容會被忽略,但如果它存在的話,(系統)就會強制從應用程式所在目錄載入所有dll。
重定向檔案必須按如下格式命名:
例如,如果應用程式的名字為editor.exe,重定向檔案的名稱應該為editor.exe.local。你必須把editor.exe.local安裝到editor.exe所在的同一目錄下,也必須把dll安裝到同一目錄下。
如果重定向檔案存在的話,loadlibrary及loadlibraryex函式就會改變搜尋次序。如果指定了路徑,而且重定向檔案也指定,這些函式會在應用程式的目錄中搜尋dll。如果dll在應用程式目錄中,這些函式會忽略指定的路徑,並引導程式目錄下的dll。如果不在程式目錄下,函式將按指定目錄載入dll。
c:/program files/***mon files/system/mydll.dll.注意:要養成把所需的dll安裝到應用程式相同目錄中的好習慣,即便不需要使用重定向也是如此。這樣就會保障你的程式不會覆蓋其他dll拷貝,當然也就不會導致其他應用程式錯誤產生。另外,其他應用程式也就不會覆蓋你的dll拷貝而導致你的應用程式執行失敗。
動態鏈結庫 靜態鏈結庫
包含標頭檔案和庫 idir 指定編譯查詢標頭檔案的目錄,常用於查詢第三方的庫的標頭檔案,例 gcc test.c i.inc o test。ldir 指定鏈結時查詢lib的目錄,常用於查詢第三方庫。llibrary 指定額外鏈結的lib庫 巨集定義 dmacro 以字串 1 預設值 定義 macro...
靜態鏈結庫 動態鏈結庫
庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll windows上對應的是.lib dll ...
靜態鏈結庫,動態鏈結庫
關於靜態鏈結庫,參考如下博文 當你完成了 開發,想把這個 給別人用,但是又不希望別人看到原始碼,就要給別人乙個庫和標頭檔案,庫和標頭檔案是配合的,缺一不可。或者過程相反,你從別人那裡拿到乙個庫和標頭檔案來使用。那麼如何編譯生成乙個庫給他人,如何使用從他人那裡拿到的庫呢?範例1 我們想把linuxfr...