python引用DLL文件的方法
本文實(shí)例講述了python引用DLL文件的方法。分享給大家供大家參考。具體分析如下:
在python中調(diào)用dll文件中的接口比較簡(jiǎn)單,如我們有一個(gè)test.dll文件,內(nèi)部定義如下:
extern "C" { int __stdcall test( void* p, int len) { return len; } }
在python中我們可以用以下兩種方式載入
1.
import ctypes dll = ctypes.windll.LoadLibrary( 'test.dll' )
2.
import ctypes dll = ctypes.WinDll( 'test.dll' )
其中ctypes.windll為ctypes.WinDll類的一個(gè)對(duì)象,已經(jīng)在ctypes模塊中定義好的。在test.dll中有test接口,可直接用dll調(diào)用即可
nRst = dll.test( ) print nRst
由于在test這個(gè)接口中需要傳遞兩個(gè)參數(shù),一個(gè)是void類型的指針,它指向一個(gè)緩沖區(qū)。一個(gè)是該緩沖區(qū)的長(zhǎng)度。因此我們要獲取到python中的字符串的指針和長(zhǎng)度
#方法一: sBuf = 'aaaaaaaaaabbbbbbbbbbbbbb' pStr = ctypes.c_char_p( ) pStr.value = sBuf pVoid = ctypes.cast( pStr, ctypes.c_void_p ).value nRst = dll.test( pVoid, len( pStr.value) )
#方法二: test = dll.test test.argtypes = [ctypes.c_char_p, ctypes.c_int] test.restypes = ctypes.c_int nRst = test(sBuf, len(sBuf))
如果修改test.dll中接口的定義如下:
extern "C" { int __cdecl test( void* p, int len) { return len; } }
由于接口中定義的是cdecl格式的調(diào)用,所以在python中也需要用相應(yīng)的類型
1.
import ctypes dll = ctypes.cdll.LoadLibrary( 'test.dll' ) ##注:一般在linux下為test.o文件,同樣可以使用如下的方法: ##dll =ctypes.cdll.LoadLibrary('test.o')
2.
import ctypes dll = ctypes.CDll( 'test.dll' )
希望本文所述對(duì)大家的Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
在Python 中同一個(gè)類兩個(gè)函數(shù)間變量的調(diào)用方法
今天小編就為大家分享一篇在Python 中同一個(gè)類兩個(gè)函數(shù)間變量的調(diào)用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01Python中關(guān)于面向?qū)ο笏接袑傩苑椒ǖ脑敿?xì)講解
在實(shí)際開發(fā)中,對(duì)象的某些屬性或方法可能只希望在對(duì)象的內(nèi)部被使用,而不希望在外部被訪問(wèn)到,私有屬性就是對(duì)象不希望公開的屬性,私有方法就是對(duì)象不希望公開的方法2021-10-10Python 批量驗(yàn)證和添加手機(jī)號(hào)碼為企業(yè)微信聯(lián)系人
你是否也有過(guò)需要添加很多微信好友的時(shí)候,一個(gè)個(gè)輸入添加太麻煩了,本篇文章手把手教你用Python替我們完成這繁瑣的操作,大家可以在過(guò)程中查缺補(bǔ)漏,看看自己掌握程度怎么樣2021-10-10python實(shí)現(xiàn)順時(shí)針打印矩陣
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)順時(shí)針打印矩陣,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03python實(shí)現(xiàn)去掉字符串中的\xa0、\t、\n
這篇文章主要介紹了python實(shí)現(xiàn)去掉字符串中的\xa0、\t、\n方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08