打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

引言

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

上篇已经讲了传递数值、指针、字符串参数的例子,详细细节请参考:

这次讲一下在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内部的打印信息。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Python系统调用——运行其他程序
Python中四种运行其他程序的方式
系列:Python扩展模块(2)
生成dll文件以及python对DLL中函数的调用(参数类型以及返回值)
python使用ctypes调用扩展模块的实例方法楔子
Python量化接口源码分享
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服