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

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

python使用ctypes庫調用DLL動態鏈接庫

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

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

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

一、Python調用DLL里面的導出函數

1.VS生成dll

1.1 新建動態鏈接庫項目

python使用ctypes庫調用DLL動態鏈接庫

1.2 在myTest.cpp中輸入以下內容:

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

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

1.3生成dll動態鏈接庫

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

python使用ctypes庫調用DLL動態鏈接庫

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

python使用ctypes庫調用DLL動態鏈接庫

1.4 查看生成的dll動態鏈接庫

python使用ctypes庫調用DLL動態鏈接庫

2.Python導入dll動態鏈接庫

用python將動態鏈接庫導入,然后調用動態鏈接庫的函數。為此,新建main.py文件,輸入如下內容:

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

運行結果如下所示:

python使用ctypes庫調用DLL動態鏈接庫

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

1.VS生成dll

1.1 添加 mainClass 類,內容如下:

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 內容

myTest.cpp:

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

1.3 生成64位dll

2.Python導入dll動態鏈接庫

python使用ctypes庫調用DLL動態鏈接庫

明顯可以看出,在C++里設置的全局變量的值已經從0變為10了,說明python可以通過調用dll里面的實例方法來更新全局變量值

三、Python_ctypes 指定函數參數類型和返回類型

前面兩個例子C++動態鏈接庫導出函數的返回類型都是int型,而Python 默認函數的參數類型和返回類型為 int 型,所以Python 理所當然的 以為 dll導出函數返回了一個 int 類型的值。但是如果C++動態鏈接庫導出的函數返回類型不是int型,而是特定類型,就需要指定ctypes的函數返回類型 restype 。同樣,通過ctypes給函數傳遞參數時,參數類型默認為int型,如果不是int型,而是特定類型,就需要指定ctypes的函數形參類型 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')########## 指定 函數的參數類型 #################pDll.getRandData.argtypes = [c_char_p]#第一個參數arg1 = c_char_p(bytes('hello', ’utf-8’))########## 指定 函數的返回類型 #################pDll.getRandData.restype = c_char_p########### 調用動態鏈接庫函數 ##################res = pDll.getRandData(arg1)#打印返回結果print(res.decode()) #返回的是utf-8編碼的數據,需要解碼

或者如下形式:

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

運行結果:

python使用ctypes庫調用DLL動態鏈接庫

四、Python_ctypes dll返回數組_結構體

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

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 這個結構體占用的字節數 //malloc(sizeof(StructTest))就是申請 struct StructPointerTest 這個結構體占用字節數大小的空間//(StructPointer)malloc(sizeof(StructTest))就是將申請的空間的地址強制轉化為 struct StructPointerTest * 指針類型//StructPointer p = (StructPointer)malloc(sizeof(StructTest))就是將那個強制轉化的地址賦值給 pStructPointer p = (StructPointer)malloc(sizeof(StructTest));//字符串DLLEXPORT StructPointer test() // 返回結構體指針 { 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代碼:

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

運行結果:

python使用ctypes庫調用DLL動態鏈接庫

以上就是python使用ctypes庫調用DLL動態鏈接庫的詳細內容,更多關于python 調用DLL動態鏈接庫的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲伊人影院| 日本一区福利在线| 久久婷婷国产| 精品99久久| 日韩免费久久| 99综合视频| 老鸭窝毛片一区二区三区| 免费日韩av片| 亚洲最大av| 97精品资源在线观看| 国产高清精品二区| 成人污污视频| 欧美丝袜一区| 亚洲毛片在线| 久久午夜影院| 成人av二区| 日韩av三区| 桃色av一区二区| 免费看黄色91| 精品国产一级| 欧美jjzz| 国产日韩中文在线中文字幕| 伊伊综合在线| 丝袜美腿亚洲一区二区图片| 国产视频一区二| 韩国久久久久久| 免费观看在线色综合| 欧美激情一区| 欧美精选一区二区三区| 国产视频一区二| 欧美日韩国产免费观看| 国产欧美一区二区三区国产幕精品 | 日本强好片久久久久久aaa| 国产精品s色| 亚洲成av人片一区二区密柚| 亚洲18在线| 久久久人人人| 国产免费久久| 丝瓜av网站精品一区二区 | 亚洲丝袜啪啪| 成人影视亚洲图片在线| 亚洲视频二区| 久久久久久久欧美精品| 日韩精品一区第一页| 你懂的国产精品| 激情久久久久久久| 久久精品国产久精国产| 久久亚洲欧美| 日韩av免费| 国产精品国码视频| 蜜桃av一区二区在线观看| 伊伊综合在线| 免费一级欧美片在线观看网站 | av亚洲免费| 精品亚洲成人| 亚洲国产一区二区在线观看| 精品视频高潮| 久久激情综合网| 久久大逼视频| 久久三级视频| 美国三级日本三级久久99| 亚洲精品在线影院| 久久av影视| 91精品日本| 日本亚洲最大的色成网站www| 好吊日精品视频| 久久蜜桃资源一区二区老牛| 日韩av在线播放网址| 国产欧美大片| 日本三级亚洲精品| 日韩精品视频在线看| 综合色一区二区| 综合国产在线| 亚洲精品综合| 免费在线视频一区| 美国欧美日韩国产在线播放| 中文久久精品| 在线亚洲欧美| 亚洲一区日韩在线| 日韩精品一二三| 日韩在线a电影| 三级亚洲高清视频| 亚洲人成网站在线在线观看| 中文字幕一区二区精品区| 亚洲精品1区| 老色鬼久久亚洲一区二区| 午夜在线精品| 亚洲深深色噜噜狠狠爱网站 | 国产精品久久久久久久久久妞妞| 日韩三级视频| 7777精品| 国产麻豆一区| 麻豆精品国产91久久久久久| 欧美日韩亚洲国产精品| 欧美一级全黄| 欧美a级一区二区| 久久久国产精品网站| 精品午夜视频| 日韩国产欧美| 伊人成人在线视频| 亚洲日本免费电影| 欧美日一区二区在线观看| 国产午夜久久av| 国产一区二区三区四区五区| 日韩精品91| 伊人精品视频| 日本亚洲视频| 国产精品一区亚洲| 精品视频在线一区二区在线| 日韩欧美精品一区| 精品中文一区| 亚洲欧美网站在线观看| 国产精品欧美一区二区三区不卡| 精品三级国产| 不卡在线一区| 日本成人精品| 激情久久99| 91精品观看| 欧美一区激情| 激情综合自拍| 日韩欧美2区| 色综合狠狠操| 亚洲一区二区免费看| 亚洲ab电影| 国产中文欧美日韩在线| 欧美+亚洲+精品+三区| 亚洲久久视频| 国产一区二区三区四区大秀| jiujiure精品视频播放| 日韩午夜视频在线| 国产精品精品| 亚洲欧美不卡| 精品99在线| 免费一级片91| av资源新版天堂在线| 伊人久久一区| 日韩视频网站在线观看| 日韩国产在线观看| 黄毛片在线观看| 免费在线观看日韩欧美| 激情不卡一区二区三区视频在线| 99在线观看免费视频精品观看| 国产精品丝袜在线播放| 美女网站一区| 免费在线观看一区| 亚洲黄页一区| 精品91福利视频| 亚洲免费观看高清完整版在线观| 久久久久久自在自线| 亚洲免费一区三区| 久久国产直播| 麻豆国产精品| 日韩精品视频网站| 欧美综合另类| 国产精品1区在线| 国产亚洲激情| 黄在线观看免费网站ktv| 日韩国产在线一| 影音先锋久久| 裤袜国产欧美精品一区| 日本三级亚洲精品| 宅男噜噜噜66国产日韩在线观看| 成人精品国产亚洲| 蜜臀av性久久久久蜜臀aⅴ四虎| 久久久久久一区二区| 日韩av黄色在线| 亚洲一卡久久| 久久精品不卡| 久久精品国产999大香线蕉 | av不卡在线看| 91tv亚洲精品香蕉国产一区| 国产精品成人自拍| 蜜桃视频在线观看一区二区| 欧美91福利在线观看| 亚洲欧洲高清| 精品视频黄色| 欧美经典一区| 国产精品一区亚洲| 欧美一区免费| 日本一区免费网站| 噜噜噜躁狠狠躁狠狠精品视频| 中文字幕在线看片| 国产精选久久| 日韩黄色免费网站| 日本亚州欧洲精品不卡| 亚洲影院天堂中文av色| 国产美女一区| 亚洲制服少妇| 在线视频免费在线观看一区二区| 成人久久一区| 日韩不卡视频在线观看| 樱桃视频成人在线观看| 福利精品在线| 日本不卡免费高清视频在线| 国产精品国产三级国产在线观看| 91成人在线| 国产日韩亚洲| 欧美色综合网| 国产精一区二区| 国产精品白丝一区二区三区|