python如何使用ctypes库调用DLL动态链接库?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
<强>一、python调用DLL里面的导出函数强>
<强> 1. vs生成DLL 强>
1.1新建动态链接库项目
1.2在myTest。cpp中输入以下内容:
//myTest。cpp:定义DLL应用程序的导出函数。//# include“stdafx.h" #定义DLLEXPORT走读生“C"使用__declspec (dllexport)//放在# include“stdafx.h"之后//两数相加 DLLEXPORT int总和(int, int b) { 返回一个+ b; }
1.3生成dll动态链接库
因为我的python3是64位的,所以VS生成的dll要选择64位的,如下所示:
点击标题栏的生成→生成解决方案,
1.4查看生成的DLL动态链接库
<强> 2. python导入DLL动态链接库强>
用python将动态链接库导入,然后调用动态链接库的函数。为此,新建主要。py文件,输入如下内容:
从ctypes导入* # - - - - - - - - - - -以下四种加载DLL方式皆可- - - - - - - - - - - - # pDLL=WinDLL (“。/myTest.dll") # pDll=windll.LoadLibrary (“。/myTest.dll") # pDll=cdll.LoadLibrary (“。/myTest.dll") pDll=CDLL (“。/myTest.dll") #调用动态链接库函数 res=pDll.sum (1、2) #打印返回结果 打印(res)
运行结果如下所示:
<强>
强>
<强> 1. vs生成DLL 强>
1.1添加mainClass类,内容如下:
mainClass。h:
# pragma> # include“stdafx.h" # include“mainClass.h" int dta=0; mainClass: mainClass () { } mainClass:: ~ mainClass () { } 空白mainClass: produceData () { dta=10; }
1.2更改myTest。cpp内容
myTest。cpp:
# include“stdafx.h" #定义DLLEXPORT走读生“C"使用__declspec (dllexport)//放在# include“stdafx.h"之后 # include“mainClass.h"//返回实例方法里面更新数据后的值 DLLEXPORT int getRandData () { mainClass dataClass=mainClass (); dataClass.produceData (); 返回dta; }
1.3生成64位dll
<强> 2。Python导入dll动态链接库强>
明显可以看的出,在c++里设置的全局变量的值已经从0变为10了,说明Python可以通过调用dll里面的实例方法来更新全局变量值
前面两个例子c++动态链接库导出函数的返回类型都是int型,而Python默认函数的参数类型和返回类型为int型,所以Python 理所当然的以为dll导出函数返回了一个int类型的值。但是如果c++动态链接库导出的函数返回类型不是int型,而是特定类型,就需要指定ctypes的函数返回类型restype。同样,通过ctypes给函数传递参数时,参数类型默认为int型,如果不是int型,而是特定类型,就需要指定ctypes的函数形参类型,argtypes。
接下来,我将举一个简单例子来说明一下
myTest。cpp:
# include“stdafx.h" #定义DLLEXPORT走读生“C"使用__declspec (dllexport)//放在# include“stdafx.h"之后 # include & lt; string>//使用字符串类型需要包含头文件& lt; string> 使用名称空间性病;//字符串类是一个模板类,位于名字空间性病中//字符串 DLLEXPORT char * getRandData (char * arg) { 返回参数; }
python代码:
从ctypes导入* pDll=CDLL (“。/myTest.dll") # # # # # # # # # #指定函数的参数类型# # # # # # # # # # # # # # # # # pDll.getRandData。argtypes=[c_char_p] 第号一个参数 __arg1=c_char_p(字节(“hello" & # 39; utf - 8 # 39;)) # # # # # # # # # #指定函数的返回类型# # # # # # # # # # # # # # # # # pDll.getRandData。restype=c_char_p # # # # # # # # # # #调用动态链接库函数# # # # # # # # # # # # # # # # # # res=pDll.getRandData (__arg1) #打印返回结果 print (res.decode()) #返回的是utf - 8编码的数据,需要解码python如何使用ctypes库调用DLL动态链接库