一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Python使用ctypes模塊調用DLL函數(shù)之傳遞數(shù)值、指針與字符串參數(shù)

 lgk88888 2018-11-21

引言

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

這次以具體的例子講一下在Python中,如何使用ctypes模塊調用DLL中的庫函數(shù)。本文的編程系統(tǒng)環(huán)境是win7 64位,Python使用的版本是python2.7.14。

由于DLL中函數(shù)中傳遞的參數(shù)類型比較多樣化,擬打算分三次講解這部分內容,這次先講傳遞數(shù)值、指針與字符串參數(shù)的情況,后面再分兩次講解傳遞結構體、數(shù)值數(shù)組等類型的情況。

DLL文件的加載

假定已經有了一個DLL文件“MyDll.dll”,其函數(shù)約定的調用方式為C調用(cdecl)方式,則Python中加載該dll文件的代碼如下:

 

  

其中,第1行是引入ctypes模塊,第2行是采用C調用約定加載“MyDll.dll”文件,并將返回值賦給dll變量,后續(xù)調用該DLL文件中的函數(shù)時,會使用該變量定義要使用的具體函數(shù)。

另外,需要說明的是,若DLL函數(shù)的調用約定是標準調用約定(stdcall)方式,則DLL文件的加載代碼改為如下:

dll = WinDLL(''MyDll.dll'')

DLL函數(shù)的調用——函數(shù)參數(shù)為數(shù)值情況

如對于MyDll.dll”文件中的函數(shù)add,其函數(shù)聲明如下:

 

  

該函數(shù)有兩個int類型的輸入?yún)?shù)數(shù)xy,返回的兩個數(shù)的和。其C語言的實現(xiàn)代碼如下:

 

  

Python中的調用方式如下:

 

  

這個函數(shù)應該說是最簡單的一個函數(shù)了,在第17行,直接使用第一步加載DLL后返回的名稱dll,后面跟函數(shù)名字即可返回其值。

DLL函數(shù)的調用——函數(shù)參數(shù)為指針情況

對于上面的函數(shù)改進為add2,其函數(shù)C語言的實現(xiàn)代碼如下:

 

  

此時函數(shù)有三個指向int類型的指針參數(shù)xy、zzxy的和。

Python中的調用方式如下:

 

  

其中,第20-22行定義了3int型的變量x、yz,初始值分別為2,3,0。第23行調用add2函數(shù)時,使用byref指明參數(shù)傳遞時為引用傳遞,對應著C語言的指針傳遞。函數(shù)運行后,使用z.value即可查看z的值。

也可以使用下面的代碼調用:

 

  

上面代碼中,第23-24行,在使用add2函數(shù)時,先將函數(shù)賦給一個變量add2,然后對其輸入輸出參數(shù)進行單獨聲明,使用POINTER聲明為這三個參數(shù)為指向int類型的指針變量。

DLL函數(shù)的調用——函數(shù)參數(shù)為字符串情況

1如對于下面的函數(shù),返回一個輸入字符串的字節(jié)長度,其函數(shù)C語言的實現(xiàn)代碼如下:

 

  

Python中的調用代碼如下: 

 
   

其中,第33行使用c_char_p定義了一個指向char型的指針變量pStr,并賦初值為abcdef,第34行將其傳入GetStringLength函數(shù)返回其長度。

也可以使用下面代碼調用:

 

  

GetStringLength函數(shù)的輸入輸出參數(shù)分別使用argtypesrestype單獨進行聲明。

2如對于下面的函數(shù),輸入輸出皆為字符串指針,函數(shù)的功能是對于輸入pStr1賦值為“StrIn”,對于輸出返回一個指向字符串常量“strOut”的指針,其函數(shù)C語言的實現(xiàn)代碼如下:

 

  

Python中的調用代碼如下:

 

  

在上面代碼中,同樣分別對輸入輸出參數(shù)進行了聲明。對于輸入?yún)?shù)pStr,使用create_string_buffer函數(shù)定義了一個字符串緩沖區(qū)。對于返回值pChar,在打印輸出結果時,將其強制轉換為c_char_p類型,取其value值即可。

完整的測試代碼

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

 

  

運行結果如下圖所示:

 

  

總結

這次的例子基本涵蓋了在Python中通過ctypes模塊調用DLL函數(shù)時,傳遞數(shù)值、指針、字符串類型參數(shù)時的大部分情況。要注意的是,使用ctypes映射C語言中的數(shù)據(jù)類型時,兩者必須完全一致。下面是Pythonctypes模塊中數(shù)據(jù)類型與C語言中數(shù)據(jù)類型對照表:

 

    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    欧美在线观看视频免费不卡| 日韩精品中文字幕在线视频| 欧美成人高清在线播放| 中文字幕久热精品视频在线| 欧美日韩久久精品一区二区| 亚洲天堂精品一区二区| 国产精品福利一二三区| 91人妻人人澡人人人人精品| 国产情侣激情在线对白| 亚洲一区二区亚洲日本 | 黄片免费观看一区二区| 国产精品内射视频免费| 日本午夜精品视频在线观看| 丰满少妇被猛烈撞击在线视频| 日本三区不卡高清更新二区| 亚洲一区二区亚洲日本| 欧美成人免费视频午夜色| 欧美大胆女人的大胆人体| 欧洲一区二区三区自拍天堂| 国产亚洲精品俞拍视频福利区| 日韩中文字幕欧美亚洲| 一区二区福利在线视频| 亚洲国产欧美精品久久| 91精品日本在线视频| 熟女乱一区二区三区丝袜| 久久精品国产亚洲av麻豆尤物| 国产精品人妻熟女毛片av久| 男女激情视频在线免费观看| 国产精品一区二区三区激情| 麻豆亚州无矿码专区视频| 国产精品午夜福利免费阅读| 东京热男人的天堂久久综合| 中文字幕日韩欧美一区| 日本人妻的诱惑在线观看| 中文字幕五月婷婷免费| 日韩人妻毛片中文字幕| 国产免费人成视频尤物| 欧美日韩国产一级91| 99久久精品久久免费| 国产免费成人激情视频| 国产精品久久男人的天堂|