引言 在Python語言中,可以使用ctypes模塊調(diào)用其它如C++語言編寫的動(dòng)態(tài)鏈接庫DLL文件中的函數(shù),在提高軟件運(yùn)行效率的同時(shí),也可以充分利用目前市面上各種第三方的DLL庫函數(shù),以擴(kuò)充Python軟件的功能及應(yīng)用領(lǐng)域,減少重復(fù)編寫代碼、重復(fù)造輪子的工作量,這也充分體現(xiàn)了Python語言作為一種膠水語言所特有的優(yōu)勢(shì)。 上篇已經(jīng)講了傳遞數(shù)值、指針、字符串參數(shù)的例子,詳細(xì)細(xì)節(jié)請(qǐng)參考: 這次講一下在Python中使用ctypes模塊調(diào)用DLL中的庫函數(shù)傳遞結(jié)構(gòu)體參數(shù)的情況。同樣,操作系統(tǒng)環(huán)境是win7 64位,Python使用的版本是python2.7.14,函數(shù)約定的調(diào)用方式為C調(diào)用(cdecl)方式。 例1:簡(jiǎn)單的結(jié)構(gòu)體傳遞參數(shù)示例 這個(gè)例子的功能是打印一個(gè)學(xué)生的信息,并返回一個(gè)指向字符串的指針。其中,學(xué)生信息定義為一個(gè)結(jié)構(gòu)體類型,包括學(xué)生的姓名、年齡及分?jǐn)?shù)信息,該函數(shù)的聲明及結(jié)構(gòu)體定義如下圖所示: ![]() 函數(shù)printStudentInfo的具體C語言實(shí)現(xiàn)代碼如下: ![]() 在Python中的調(diào)用方式如下: ![]() 從上面的代碼中可以看出,對(duì)于結(jié)構(gòu)體參數(shù)的傳遞,在Python中需要使用Structure作為基類定義一個(gè)與之對(duì)應(yīng)的結(jié)構(gòu)體類Student,在類的_fields中定義結(jié)構(gòu)體中每個(gè)成員變量的名稱和數(shù)據(jù)類型。然后定義結(jié)構(gòu)體類的一個(gè)實(shí)例對(duì)象student,對(duì)每個(gè)成員變量逐個(gè)賦值,以byref傳址的方式進(jìn)行調(diào)用就可以了。 例2:復(fù)雜結(jié)構(gòu)體傳遞參數(shù)示例 如果一個(gè)結(jié)構(gòu)體里面包括了另一個(gè)結(jié)構(gòu)體、指針等綜合要素,情況就要復(fù)雜些了。對(duì)上面的例子改進(jìn)一下,定義一個(gè)People類,里面包含了一個(gè)指向Student類型的指針變量和一個(gè)整形變量,在這個(gè)結(jié)構(gòu)體中存儲(chǔ)多個(gè)學(xué)生的信息及學(xué)生的總數(shù)信息。設(shè)計(jì)一個(gè)函數(shù)getPeopleInfo獲取每個(gè)學(xué)生的信息,并返回所有學(xué)生的個(gè)數(shù),該函數(shù)的聲明及結(jié)構(gòu)體定義如下圖所示: ![]() 函數(shù)getPeopleInfo的具體C語言實(shí)現(xiàn)代碼如下: ![]() 在Python中的調(diào)用方式如下: ![]() 在上面的代碼中,第43行定義了一個(gè)指向Student結(jié)構(gòu)體的指針變量。第48行調(diào)用該函數(shù)并打印返回值,第49-50行,分別打印兩個(gè)學(xué)生的具體信息。 完整的測(cè)試代碼 完整的測(cè)試代碼如下圖所示: ![]() 運(yùn)行結(jié)果如下圖所示: ![]() 在上圖中,第1行輸出的是函數(shù)printStudentInfo內(nèi)部的打印信息。 |
|