龙空技术网

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

编码那些事 239

前言:

当前咱们对“易语言调用python dll”可能比较着重,我们都需要剖析一些“易语言调用python dll”的相关资讯。那么小编同时在网络上网罗了一些有关“易语言调用python dll””的相关内容,希望咱们能喜欢,兄弟们快快来学习一下吧!

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

上篇已经讲了传递数值、指针、字符串参数的例子,详细细节请参考:Python使用ctypes模块调用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内部的打印信息。

欢迎加关注,共同交流。

标签: #易语言调用python dll