日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

python使用ctypes庫調(diào)用DLL動態(tài)鏈接庫

瀏覽:178日期:2022-07-07 14:54:47

最近要使用python調(diào)用C++編譯生成的DLL動態(tài)鏈接庫,因此學習了一下ctypes庫的基本使用。

ctypes是一個用于Python的外部函數(shù)庫,它提供C兼容的數(shù)據(jù)類型,并允許在DLL或共享庫中調(diào)用函數(shù)。

一、Python調(diào)用DLL里面的導出函數(shù)

1.VS生成dll

1.1 新建動態(tài)鏈接庫項目

python使用ctypes庫調(diào)用DLL動態(tài)鏈接庫

1.2 在myTest.cpp中輸入以下內(nèi)容:

// myTest.cpp : 定義 DLL 應用程序的導出函數(shù)。//#include 'stdafx.h'#define DLLEXPORT extern 'C' __declspec(dllexport) //放在 #include 'stdafx.h' 之后//兩數(shù)相加DLLEXPORT int sum(int a, int b) { return a + b;}

注意:導出函數(shù)前面要加 extern 'C' __declspec(dllexport) ,這是因為ctypes只能調(diào)用C函數(shù)。如果不用extern 'C',構(gòu)建后的動態(tài)鏈接庫沒有這些函數(shù)的符號表。采用C++的工程,導出的接口需要extern 'C',這樣python中才能識別導出的函數(shù)。

1.3生成dll動態(tài)鏈接庫

因為我的python3是64位的,所以VS生成的dll要選擇64位的,如下所示:

python使用ctypes庫調(diào)用DLL動態(tài)鏈接庫

點擊標題欄的 生成 -> 生成解決方案

python使用ctypes庫調(diào)用DLL動態(tài)鏈接庫

1.4 查看生成的dll動態(tài)鏈接庫

python使用ctypes庫調(diào)用DLL動態(tài)鏈接庫

2.Python導入dll動態(tài)鏈接庫

用python將動態(tài)鏈接庫導入,然后調(diào)用動態(tài)鏈接庫的函數(shù)。為此,新建main.py文件,輸入如下內(nèi)容:

from ctypes import *#----------以下四種加載DLL方式皆可—————————# pDLL = WinDLL('./myTest.dll')# pDll = windll.LoadLibrary('./myTest.dll')# pDll = cdll.LoadLibrary('./myTest.dll')pDll = CDLL('./myTest.dll')#調(diào)用動態(tài)鏈接庫函數(shù)res = pDll.sum(1,2)#打印返回結(jié)果print(res)

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

python使用ctypes庫調(diào)用DLL動態(tài)鏈接庫

二、Python調(diào)用DLL里面的實例方法更新全局變量值

1.VS生成dll

1.1 添加 mainClass 類,內(nèi)容如下:

mainClass.h:

#pragma onceextern int dta;class mainClass{public: mainClass(); ~mainClass(); void produceData();};

mainClass.cpp:

#include 'stdafx.h'#include 'mainClass.h'int dta = 0;mainClass::mainClass(){}mainClass::~mainClass(){}void mainClass::produceData() { dta = 10;}

1.2 更改 myTest.cpp 內(nèi)容

myTest.cpp:

#include 'stdafx.h'#define DLLEXPORT extern 'C' __declspec(dllexport) //放在 #include 'stdafx.h' 之后#include 'mainClass.h'//返回實例方法里面更新數(shù)據(jù)后的值DLLEXPORT int getRandData() { mainClass dataClass = mainClass(); dataClass.produceData(); return dta;}

1.3 生成64位dll

2.Python導入dll動態(tài)鏈接庫

python使用ctypes庫調(diào)用DLL動態(tài)鏈接庫

明顯可以看出,在C++里設置的全局變量的值已經(jīng)從0變?yōu)?0了,說明python可以通過調(diào)用dll里面的實例方法來更新全局變量值

三、Python_ctypes 指定函數(shù)參數(shù)類型和返回類型

前面兩個例子C++動態(tài)鏈接庫導出函數(shù)的返回類型都是int型,而Python 默認函數(shù)的參數(shù)類型和返回類型為 int 型,所以Python 理所當然的 以為 dll導出函數(shù)返回了一個 int 類型的值。但是如果C++動態(tài)鏈接庫導出的函數(shù)返回類型不是int型,而是特定類型,就需要指定ctypes的函數(shù)返回類型 restype 。同樣,通過ctypes給函數(shù)傳遞參數(shù)時,參數(shù)類型默認為int型,如果不是int型,而是特定類型,就需要指定ctypes的函數(shù)形參類型 argtypes 。

接下來,我將舉一個簡單例子來說明一下

myTest.cpp:

#include 'stdafx.h'#define DLLEXPORT extern 'C' __declspec(dllexport) //放在 #include 'stdafx.h' 之后#include <string> //使用string類型 需要包含頭文件 <string>using namespace std; //string類是一個模板類,位于名字空間std中//字符串DLLEXPORT char *getRandData(char *arg) { return arg;}

python代碼:

from ctypes import *pDll = CDLL('./myTest.dll')########## 指定 函數(shù)的參數(shù)類型 #################pDll.getRandData.argtypes = [c_char_p]#第一個參數(shù)arg1 = c_char_p(bytes('hello', ’utf-8’))########## 指定 函數(shù)的返回類型 #################pDll.getRandData.restype = c_char_p########### 調(diào)用動態(tài)鏈接庫函數(shù) ##################res = pDll.getRandData(arg1)#打印返回結(jié)果print(res.decode()) #返回的是utf-8編碼的數(shù)據(jù),需要解碼

或者如下形式:

from ctypes import *pDll = CDLL('./myTest.dll')########## 指定 函數(shù)的返回類型 #################pDll.getRandData.restype = c_char_p########### 調(diào)用動態(tài)鏈接庫函數(shù) ##################res = pDll.getRandData(b’hello’) # 或者變量.encode()#打印返回結(jié)果print(res.decode()) #返回的是utf-8編碼的數(shù)據(jù),需要解碼

運行結(jié)果:

python使用ctypes庫調(diào)用DLL動態(tài)鏈接庫

四、Python_ctypes dll返回數(shù)組_結(jié)構(gòu)體

在ctypes里,可以把數(shù)組指針傳遞給dll,但是我們無法通過dll獲取到c++返回的數(shù)組指針。由于python中沒有對應的數(shù)組指針類型,因此,要獲取dll返回的數(shù)組,我們需要借助結(jié)構(gòu)體。

myTest.cpp:

#include 'stdafx.h'#define DLLEXPORT extern 'C' __declspec(dllexport) //放在 #include 'stdafx.h' 之后#include <string> //使用string類型 需要包含頭文件 <string>using namespace std; //string類是一個模板類,位于名字空間std中typedef struct StructPointerTest{ char name[20]; int age; int arr[3]; int arrTwo[2][3];}StructTest, *StructPointer;//sizeof(StructTest)就是求 struct StructPointerTest 這個結(jié)構(gòu)體占用的字節(jié)數(shù) //malloc(sizeof(StructTest))就是申請 struct StructPointerTest 這個結(jié)構(gòu)體占用字節(jié)數(shù)大小的空間//(StructPointer)malloc(sizeof(StructTest))就是將申請的空間的地址強制轉(zhuǎn)化為 struct StructPointerTest * 指針類型//StructPointer p = (StructPointer)malloc(sizeof(StructTest))就是將那個強制轉(zhuǎn)化的地址賦值給 pStructPointer p = (StructPointer)malloc(sizeof(StructTest));//字符串DLLEXPORT StructPointer test() // 返回結(jié)構(gòu)體指針 { strcpy_s(p->name, 'Lakers'); p->age = 20; p->arr[0] = 3; p->arr[1] = 5; p->arr[2] = 10; for (int i = 0; i < 2; i++) for (int j = 0; j < 3; j++) p->arrTwo[i][j] = i*10+j; return p;}

python代碼:

# 返回結(jié)構(gòu)體import ctypespath = r’./myTest.dll’dll = ctypes.WinDLL(path)#定義結(jié)構(gòu)體class StructPointer(ctypes.Structure): #Structure在ctypes中是基于類的結(jié)構(gòu)體 _fields_ = [('name', ctypes.c_char * 20), #定義一維數(shù)組('age', ctypes.c_int),('arr', ctypes.c_int * 3), #定義一維數(shù)組('arrTwo', (ctypes.c_int * 3) * 2)] #定義二維數(shù)組#設置導出函數(shù)返回類型dll.test.restype = ctypes.POINTER(StructPointer) # POINTER(StructPointer)表示一個結(jié)構(gòu)體指針#調(diào)用導出函數(shù)p = dll.test()print(p.contents.name.decode()) #p.contents返回要指向點的對象 #返回的字符串是utf-8編碼的數(shù)據(jù),需要解碼print(p.contents.age)print(p.contents.arr[0]) #返回一維數(shù)組第一個元素print(p.contents.arr[:]) #返回一維數(shù)組所有元素print(p.contents.arrTwo[0][:]) #返回二維數(shù)組第一行所有元素print(p.contents.arrTwo[1][:]) #返回二維數(shù)組第二行所有元素

運行結(jié)果:

python使用ctypes庫調(diào)用DLL動態(tài)鏈接庫

以上就是python使用ctypes庫調(diào)用DLL動態(tài)鏈接庫的詳細內(nèi)容,更多關于python 調(diào)用DLL動態(tài)鏈接庫的資料請關注好吧啦網(wǎng)其它相關文章!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品欧美日韩精品| 伊人久久亚洲热| 福利一区和二区| 日韩精品水蜜桃| 在线亚洲免费| 国产日韩一区二区三免费高清| 精品免费在线| 伊人久久亚洲美女图片| 日韩免费精品| 欧美xxxx中国| 日韩午夜精品| 国产毛片久久久| 视频福利一区| 亚洲精品欧洲| 中文在线а√在线8| 欧美一区二区三区激情视频| 综合激情一区| 中文字幕色婷婷在线视频| 伊人久久婷婷| 国产精品欧美三级在线观看| 久久要要av| 国产日本亚洲| 婷婷色综合网| 久久午夜影院| 亚洲香蕉久久| 久久久噜噜噜| 国产精品一区三区在线观看| 99精品一区| 国产精品调教视频| 亚洲欧洲一区二区天堂久久| 国产精品一区二区av交换| 亚洲欧美综合| 国产日韩欧美一区在线| 亚洲婷婷在线| 国产精品激情| 国产模特精品视频久久久久| 国产极品久久久久久久久波多结野| 激情综合自拍| 欧美a在线观看| 亚洲一区二区日韩| 久久亚洲国产| 国产suv精品一区二区四区视频 | 亚洲综合不卡| 日本一区二区高清不卡| 日韩国产高清在线| 国产中文一区| 久久精品国产福利| 一区二区三区四区在线观看国产日韩 | 首页国产精品| 久久先锋影音| 久久久久国产| 麻豆免费精品视频| 日本在线视频一区二区| 三上悠亚国产精品一区二区三区| 国产欧美一区二区色老头| 最新日韩av| 精品国产第一福利网站| 国产亚洲一区| 综合激情一区| 亚洲在线一区| 久久人人99| 中文字幕一区久| 久久久久亚洲精品中文字幕| 日韩高清不卡一区| 亚洲丝袜啪啪| 老鸭窝毛片一区二区三区| 在线日韩一区| 日韩欧美字幕| 久久精品国产亚洲一区二区三区| 日本在线成人| 亚洲免费成人av在线| 一区在线免费| 亚洲高清不卡| 久久久夜精品| 播放一区二区| 92国产精品| 国产一区二区三区黄网站| 国产精品激情| 国产精品一线天粉嫩av| 日韩精品一页| 视频精品一区| 亚洲精品在线二区| 亚洲欧美久久精品| 麻豆91精品| 久久电影一区| 六月婷婷一区| 亚洲精品乱码日韩| 日本亚洲欧美天堂免费| 日韩亚洲精品在线观看| 日韩精品免费一区二区夜夜嗨 | 欧美精品1区| 国产精品xxxav免费视频| 国产精品一线天粉嫩av| 国产精品啊v在线| 美女久久精品| 国产精久久一区二区| 久久不卡国产精品一区二区| 国产精品theporn| 国产精成人品2018| 麻豆一区二区三| 国产一区二区三区久久 | 久久精品毛片| 精品高清久久| 日韩av首页| 免费av一区二区三区四区| 亚洲女同中文字幕| 久久亚洲欧洲| 亚洲青青久久| 久久激情五月激情| 久久a爱视频| 水蜜桃精品av一区二区| 日本免费一区二区三区四区| 日韩网站中文字幕| 一本一道久久a久久精品蜜桃| 日韩视频久久| 亚洲精品影视| 欧美激情视频一区二区三区免费| 老色鬼精品视频在线观看播放| 日韩综合一区| 欧美在线资源| 日韩精品五月天| 久久亚州av| 香蕉成人av| 亚洲欧美日韩国产一区二区| 天堂av一区| 久久精品国产亚洲一区二区三区| 日韩欧美三级| 麻豆亚洲精品| 国产精品v亚洲精品v日韩精品| 国产传媒av在线| 国产亚洲精品v| 欧美欧美黄在线二区| 色综合五月天| 午夜在线一区二区| 国产精品地址| 91精品啪在线观看国产18| 久久99伊人| 国产精品主播| 日本少妇一区| 亚洲三级精品| 色婷婷亚洲mv天堂mv在影片| 亚洲一区二区网站| 免费亚洲婷婷| 亚洲视频www| 麻豆国产欧美日韩综合精品二区| 欧美日韩在线观看视频小说| 日韩精品成人| 三上悠亚国产精品一区二区三区| 亚洲一区av| 国产白浆在线免费观看| 日av在线不卡| 国产成人精品一区二区三区免费| 黄色欧美日韩| 国产精品免费不| 成人av二区| 国产日产一区| 免费国产自久久久久三四区久久 | 国产精品久久久久久久久久齐齐| 秋霞影院一区二区三区| 日韩在线网址| 日韩欧美精品一区| 天堂av一区| 91精品国产成人观看| 日韩高清电影免费| 在线视频观看日韩| 国产精品一区二区三区四区在线观看 | 欧美日韩视频| 久久精品系列| 天堂va在线高清一区| 日韩在线免费| 7777精品| 黄色精品网站| 国产福利91精品一区二区| 日韩在线卡一卡二| 9999国产精品| 欧美亚洲三级| 99视频一区| 日韩免费久久| 国产精品**亚洲精品| 男人的天堂亚洲一区| 久久91导航| 国产精品美女久久久久久不卡| 久久一二三区| 影视先锋久久| 国产精品久久观看| 国产精品视频一区视频二区| 玖玖玖国产精品| 天堂资源在线亚洲| 欧美好骚综合网| 国产情侣久久| 免费不卡在线观看| 欧美美女一区| 日韩啪啪电影网| 欧美极品中文字幕| 日本视频中文字幕一区二区三区| 欧美特黄一区| 香蕉久久99| 中文字幕在线看片| 你懂的亚洲视频| 久久精品xxxxx|