小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Python使用ctypes模塊調(diào)用DLL函數(shù)之傳遞結(jié)構(gòu)體參數(shù)

 lgk88888 2018-11-21

引言

Python語言中,可以使用ctypes模塊調(diào)用其它如C++語言編寫的動態(tài)鏈接庫DLL文件中的函數(shù),在提高軟件運行效率的同時,也可以充分利用目前市面上各種第三方的DLL庫函數(shù),以擴充Python軟件的功能及應(yīng)用領(lǐng)域,減少重復(fù)編寫代碼、重復(fù)造輪子的工作量,這也充分體現(xiàn)了Python語言作為一種膠水語言所特有的優(yōu)勢。

上篇已經(jīng)講了傳遞數(shù)值、指針、字符串參數(shù)的例子,詳細(xì)細(xì)節(jié)請參考:

這次講一下在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é)構(gòu)體傳遞參數(shù)示例

這個例子的功能是打印一個學(xué)生的信息,并返回一個指向字符串的指針。其中,學(xué)生信息定義為一個結(jié)構(gòu)體類型,包括學(xué)生的姓名、年齡及分?jǐn)?shù)信息,該函數(shù)的聲明及結(jié)構(gòu)體定義如下圖所示:

 

  

函數(shù)printStudentInfo的具體C語言實現(xiàn)代碼如下:

 

  

Python中的調(diào)用方式如下:

 

  

從上面的代碼中可以看出,對于結(jié)構(gòu)體參數(shù)的傳遞,在Python中需要使用Structure作為基類定義一個與之對應(yīng)的結(jié)構(gòu)體類Student,在類的_fields中定義結(jié)構(gòu)體中每個成員變量的名稱和數(shù)據(jù)類型。然后定義結(jié)構(gòu)體類的一個實例對象student,對每個成員變量逐個賦值,以byref傳址的方式進(jìn)行調(diào)用就可以了。

2:復(fù)雜結(jié)構(gòu)體傳遞參數(shù)示例

如果一個結(jié)構(gòu)體里面包括了另一個結(jié)構(gòu)體、指針等綜合要素,情況就要復(fù)雜些了。對上面的例子改進(jìn)一下,定義一個People類,里面包含了一個指向Student類型的指針變量和一個整形變量,在這個結(jié)構(gòu)體中存儲多個學(xué)生的信息及學(xué)生的總數(shù)信息。設(shè)計一個函數(shù)getPeopleInfo獲取每個學(xué)生的信息,并返回所有學(xué)生的個數(shù),該函數(shù)的聲明及結(jié)構(gòu)體定義如下圖所示:

 

  

函數(shù)getPeopleInfo的具體C語言實現(xiàn)代碼如下:

 

  

Python中的調(diào)用方式如下:

 

  

在上面的代碼中,第43行定義了一個指向Student結(jié)構(gòu)體的指針變量。第48行調(diào)用該函數(shù)并打印返回值,第49-50行,分別打印兩個學(xué)生的具體信息。

完整的測試代碼

完整的測試代碼如下圖所示:

 

  

運行結(jié)果如下圖所示:

 

  

在上圖中,第1行輸出的是函數(shù)printStudentInfo內(nèi)部的打印信息。

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多