這章是介紹基本dll
,我就記錄一些簡單應用,
dll的坑點以及擴充套件後面兩章會說,到時候在總結。
自從m i c r o s o f t
公司推出第乙個版本的
wi n d o w s
作業系統以來,動態鏈結庫(
d l l
)一直是這個作業系統的基礎。
windows api
中的所有函式都包含在
d l l中。3
個最重要的
d l l
是k e r n e l 3 2 . d l l
,它包含用於管理記憶體、程序和執行緒的各個函式;
u s e r 3 2 . d l l
,它包含用於執行使用者介面任務(如視窗的建立和訊息的傳送)的各個函式;
g d i 3 2 . d l l
,它包含用於畫圖和顯示文字的各個函式。
本章將要介紹如何為應用程式建立d l l
。下面是為什麼要使用
d l l
的一些原因:
• 它們擴充套件了應用程式的特性。
• 它們可以用許多種程式語言來編寫。
• 它們簡化了軟體專案的管理。
• 它們有助於節省記憶體。
• 它們有助於資源的共享。
• 它們有助於應用程式的本地化。
• 它們有助於解決平台差異。
• 它們可以用於一些特殊的目的。
在應用程式(或另乙個d l l
)能夠呼叫
d l l
中的函式之前,
d l l
檔案映像必須被對映到呼叫程序的位址空間中。若要進行這項操作,可以使用兩種方法中的一種,即載入時的隱含鏈結或執行期的顯式鏈結。隱含鏈結將在本章的後面部分介紹,顯式鏈結將在第
2 0章中介紹。
一旦d l l
的檔案映像被對映到呼叫程序的位址空間中,
d l l
的函式就可以供程序中執行的所有執行緒使用。實際上,
d l l
幾乎將失去它作為
d l l
的全部特徵。對於程序中的執行緒來說,
d l l
的**和資料看上去就像恰巧是在程序的位址空間中的額外**和資料一樣。當乙個執行緒呼叫
d l l
函式時,該
d l l
函式要檢視執行緒的堆疊,以便檢索它傳遞的引數,並將執行緒的堆疊用於它需要的任何區域性變數。此外,
d l l
中函式的**建立的任何物件均由呼叫執行緒所擁有,而
d l l
本身從來不擁有任何東西。
可執行檔案的全域性變數和靜態變數不能被同乙個可執行檔案的多個執行例項共享。windows 98
能夠確保這一點,方法是在可執行檔案被對映到程序的位址空間時為可執行檔案的全域性變數和靜態變數分配相應的儲存器。
windows 2000
確保這一點的方法是使用第
1 3章介紹的寫入時拷貝(
c o p y - o n - w r i t e
)機制。
d l l
中的全域性變數和靜態變數的處理方法是完全相同的。當乙個程序將
d l l
的映像檔案對映到它的位址空間中去時,系統將同時建立全域性資料變數和靜態資料變數的例項。
注意:許多開發人員經常會犯乙個常見的錯誤,因為他們忘記了若干個c / c + +
d l l函式分配的記憶體塊是由
e x e
的函式釋放的嗎?答案是可能的。上面顯示的**並沒有為你提供足夠的資訊。如果
e x e
和d l l
都鏈結到
d l l
的c / c + +
執行期庫,那麼上面的**將能夠很好地執行。但是,如果兩個模組中的乙個或者兩個都鏈結到靜態
c / c + +
執行期庫,那麼對
free
函式的呼叫就會失敗。
正確的姿勢:
後面是一些基本的dll開發和呼叫細節,就不說了,還有就是建議不要通過函式編號來呼叫函式,這個不太靠譜,可能會發生變動,但是如果是對速度要求極高的程式,可以考慮編號呼叫(前提是呼叫自己開發的
dll,這樣就不會有變動了)。其他細節下一章說。
第十九章 事務
redis的事務是指將多個命令請求打包,一次性地,按順序執行的機制。通過multi exec watch等命令實現事務功能。19.1.1 事務的開始 multi命令的執行代表了乙個事務的開始,會將執行該命令的客戶端由非事務狀態切換成事務狀態 在客戶端狀態的flags屬性中開啟redis multi標...
第十九章 19 1 1節練習
練習19.1 使用malloc編寫你自己的operator new size t 函式,使用free編寫operator delete void 函式。解答 這個也就參考書中實現吧。不過這裡我更傾向於使用模板來實現,不把new的引數寫死。練習19.2 預設情況下,allocator類使用operat...
第十九章 19 2 1節練習
練習19.3 已知存在如下的類繼承體系,其中每個類分別定義了乙個公有的預設建構函式和乙個虛析構函式 class a class b public a class c public b class d public b,public a 下面的哪個dynamic cast將失敗?a a pa new ...