python如何使用ctypes库调用DLL动态链接库

  

python如何使用ctypes库调用DLL动态链接库?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

<强>一、python调用DLL里面的导出函数

<强> 1. vs生成DLL

1.1新建动态链接库项目

 python如何使用ctypes库调用DLL动态链接库

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位的,如下所示:

 python如何使用ctypes库调用dll动态链接库

点击标题栏的生成→生成解决方案,

 python如何使用ctypes库调用DLL动态链接库

1.4查看生成的DLL动态链接库

 python如何使用ctypes库调用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) 

运行结果如下所示:

 python如何使用ctypes库调用DLL动态链接库

<强>

<强> 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动态链接库

 Python如何使用ctypes库调用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动态链接库