cdll和windll的區別

來源:互聯網
上載者:User

標籤:style   blog   http   使用   資料   2014   問題   ar   

Python要想調用C語言寫的動態串連庫,不僅要相容C介面的調用習慣,還需要相容C語言的資料類型。幸運的是ctypes庫已經做了這兩方面的工作,以便調用動態串連庫是非常方便的。在Hello World的程式裡,這行代碼編寫如下:

MessageBox = windll.user32.MessageBoxW

從這行代碼的簡潔程度來看,是非常優美的。這種優美是由於ctypes庫在背後做了非常多的工作,比如windll其實是一個比較複雜的對象。在ctypes庫裡,它提供了三個容易載入動態串連庫的對象:cdll、windll和oledll。通過訪問這三個對象的屬性,就可以調用動態串連庫的函數了。其中cdll主要用來載入C語言調用方式(cdecl),windll主要用來載入WIN32調用方式(stdcall),而oledll使用WIN32調用方式(stdcall)且傳回值是Windows裡返回的HRESULT值。如果你以前沒有學習過編程,肯定沒有辦法區分cdecl和stdcall,就算學習過編程,如果沒有寫過跨不同庫之間的調用,也未必知道。因為在目前IDE的開發環境下,已經全部隱藏這些的細節。但在跨語言方面調用時,就不能忽略這種細節了。那麼你也許問為什麼會出現這兩種調用方式,不是同一個動態串連庫嗎?對於這個問題,問得好。要回答這個問題,得從發明C語言那時候說起。在70年代,美國人丹尼斯·裡奇發明了C語言,並且使用C語言編寫UNIX,由此他就成為了C語言之父和UNIX作業系統之父。由於UNIX作業系統非常高效,修改起來也很方便,是得益於使用了C語言來編寫。隨著UNIX作業系統的推廣,C語言也變成了一個流行的語言。要讓UNIX變得高效率,那麼C語言的設計上,就要著眼於高效的設計。在函數調用這方面的設計,就體現了這一點。在C語言的函數調用時,需要傳送多個參數。這些參數的傳送是可以通過寄存器或者棧來傳送。那你也許問為什麼不只使用寄存器這一種方式呢?由於函數調用的參數比較多,比如達到5個。並且在那時候的CPU的寄存器非常少,也滿足不了這個要求。不像目前ARM或MIPS的CPU,寄存器比較多,多達13個之多。這時全部使用寄存器來傳送參數是基本可以解決問題了。在當時的環境之下,設計的C語言的編譯器都是按棧的方式來傳遞函數調用的參數,這樣不但可以解決寄存器少的問題,也可以解決另外一個問題,就是可以動態地傳遞參數的個數。上面只是解決了個數的問題,那又出現了另外一個問題,就是參數的入棧的順序問題。這個好比像學校裡體育老師叫一班學生來排隊,排頭是從高到矮,還是從矮到高的選擇。在入棧這個問題上,C語言也面臨兩個選擇,一個跟代碼的書寫的順序一樣從左至右,另一個是從右至左。在考慮到動態參數的問題之後,C語言的設計者採用了從右至左的入棧方式,這種方式有兩個優點:一是函數運行時,預設是從左至右,意味著出棧的方嚮應優先為棧頂的元素,這樣可以提高運行效率;二是函數參數不定時,運行時分析字串裡出現需要的參數,每出現一個參數就彈出棧一次,跟運行分析的順序一致。比如下面的函式宣告:

printf(const char *,...);

由上可見入棧的順序不同,調用的方式就不一樣。在C語言裡都是採用從右向左的方式入棧,在PASCAL語言裡是從左向右入棧順序的。在ctypes庫裡cdll、windll和oledll都是支援從右至左入棧的參數順序。

接著下來又引出來了另外一個問題,既然參數是採用入棧的方式來傳遞,那麼就會出現這種情況,當棧的參數沒有使用到時,誰來清除,恢複棧的狀態。在這個問題上,在編譯器的設計者裡又出現了兩種選擇:一種是傾向調用者清除,一種是傾向被調用者清除。這兩種方式在效能上沒有什麼區別,只是安排清除的代碼在不同的位置上。cdll是使用調用者清除的棧的方式,而windll和oledll是使用被調用者清除。這點就是它們之間的區別。因此,Python裡調用動態串連庫時,一定要清楚每個函數使用的調用方式,否則程式就會出問題,重則直接死掉。cdll和windll的區別如:

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.