Python使用ctypes模块调用DLL函数传递结构体参数

引言

在Python语言中,可以使用ctypes模块调用其它如C++语言编写的动态链接库DLL文件中的函数,在提高软件运行效率的同时,也可以充分利用目前市面上各种第三方的DLL库函数,以扩充Python软件的功能及应用领域,减少重复编写代码、重复造轮子的工作量,这也充分体现了Python语言作为一种胶水语言所特有的优势。

上篇已经讲了传递数值、指针、字符串参数的例子,详细细节请参考:Python如何调用DLL函数:传递数值、指针与字符串参数

这次讲一下在Python中使用ctypes模块调用DLL中的库函数传递结构体参数的情况。同样,操作系统环境是win7 64位,Python使用的版本是python2.7.14,函数约定的调用方式为C调用(cdecl)方式。

例1:简单的结构体传递参数示例

这个例子的功能是打印一个学生的信息,并返回一个指向字符串的指针。其中,学生信息定义为一个结构体类型,包括学生的姓名、年龄及分数信息,该函数的声明及结构体定义如下图所示:

函数printStudentInfo的具体C语言实现代码如下:

在Python中的调用方式如下:

从上面的代码中可以看出,对于结构体参数的传递,在Python中需要使用Structure作为基类定义一个与之对应的结构体类Student,在类的_fields中定义结构体中每个成员变量的名称和数据类型。然后定义结构体类的一个实例对象student,对每个成员变量逐个赋值,以byref传址的方式进行调用就可以了。

例2:复杂结构体传递参数示例

如果一个结构体里面包括了另一个结构体、指针等综合要素,情况就要复杂些了。对上面的例子改进一下,定义一个People类,里面包含了一个指向Student类型的指针变量和一个整形变量,在这个结构体中存储多个学生的信息及学生的总数信息。设计一个函数getPeopleInfo获取每个学生的信息,并返回所有学生的个数,该函数的声明及结构体定义如下图所示:

函数getPeopleInfo的具体C语言实现代码如下:

在Python中的调用方式如下:

在上面的代码中,第43行定义了一个指向Student结构体的指针变量。第48行调用该函数并打印返回值,第49-50行,分别打印两个学生的具体信息。

完整的测试代码

完整的测试代码如下图所示:

运行结果如下图所示:

在上图中,第1行输出的是函数printStudentInfo内部的打印信息。

欢迎加关注,共同交流。

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20181026A1D71100?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券