打开APP
userphoto
未登录

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

开通VIP
Python使用ctypes模块调用DLL函数之传递数值、指针与字符串参数

引言

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

这次以具体的例子讲一下在Python中,如何使用ctypes模块调用DLL中的库函数。本文的编程系统环境是win7 64位,Python使用的版本是python2.7.14

由于DLL中函数中传递的参数类型比较多样化,拟打算分三次讲解这部分内容,这次先讲传递数值、指针与字符串参数的情况,后面再分两次讲解传递结构体、数值数组等类型的情况。

DLL文件的加载

假定已经有了一个DLL文件“MyDll.dll”,其函数约定的调用方式为C调用(cdecl)方式,则Python中加载该dll文件的代码如下:

 

  

其中,第1行是引入ctypes模块,第2行是采用C调用约定加载“MyDll.dll”文件,并将返回值赋给dll变量,后续调用该DLL文件中的函数时,会使用该变量定义要使用的具体函数。

另外,需要说明的是,若DLL函数的调用约定是标准调用约定(stdcall)方式,则DLL文件的加载代码改为如下:

dll = WinDLL(''MyDll.dll'')

DLL函数的调用——函数参数为数值情况

如对于MyDll.dll”文件中的函数add,其函数声明如下:

 

  

该函数有两个int类型的输入参数数xy,返回的两个数的和。其C语言的实现代码如下:

 

  

Python中的调用方式如下:

 

  

这个函数应该说是最简单的一个函数了,在第17行,直接使用第一步加载DLL后返回的名称dll,后面跟函数名字即可返回其值。

DLL函数的调用——函数参数为指针情况

对于上面的函数改进为add2,其函数C语言的实现代码如下:

 

  

此时函数有三个指向int类型的指针参数xyzzxy的和。

Python中的调用方式如下:

 

  

其中,第20-22行定义了3int型的变量xyz,初始值分别为230。第23行调用add2函数时,使用byref指明参数传递时为引用传递,对应着C语言的指针传递。函数运行后,使用z.value即可查看z的值。

也可以使用下面的代码调用:

 

  

上面代码中,第23-24行,在使用add2函数时,先将函数赋给一个变量add2,然后对其输入输出参数进行单独声明,使用POINTER声明为这三个参数为指向int类型的指针变量。

DLL函数的调用——函数参数为字符串情况

1如对于下面的函数,返回一个输入字符串的字节长度,其函数C语言的实现代码如下:

 

  

Python中的调用代码如下: 

 
   

其中,第33行使用c_char_p定义了一个指向char型的指针变量pStr,并赋初值为abcdef,第34行将其传入GetStringLength函数返回其长度。

也可以使用下面代码调用:

 

  

GetStringLength函数的输入输出参数分别使用argtypesrestype单独进行声明。

2如对于下面的函数,输入输出皆为字符串指针,函数的功能是对于输入pStr1赋值为“StrIn”,对于输出返回一个指向字符串常量“strOut”的指针,其函数C语言的实现代码如下:

 

  

Python中的调用代码如下:

 

  

在上面代码中,同样分别对输入输出参数进行了声明。对于输入参数pStr,使用create_string_buffer函数定义了一个字符串缓冲区。对于返回值pChar,在打印输出结果时,将其强制转换为c_char_p类型,取其value值即可。

完整的测试代码

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

 

  

运行结果如下图所示:

 

  

总结

这次的例子基本涵盖了在Python中通过ctypes模块调用DLL函数时,传递数值、指针、字符串类型参数时的大部分情况。要注意的是,使用ctypes映射C语言中的数据类型时,两者必须完全一致。下面是Pythonctypes模块中数据类型与C语言中数据类型对照表:

 
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
系列:Python扩展模块(2)
生成dll文件以及python对DLL中函数的调用(参数类型以及返回值)
Python调用windows下DLL详解 - ctypes库的使用
python3.7使用ctypes调用dll函数(含指向数组的指针)
Python的学习(三十二)
使用 Python 的 ctypes 调用 C 的动态库
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服