python引用DLL文件的方法


Posted in Python onMay 11, 2015

本文实例讲述了python引用DLL文件的方法。分享给大家供大家参考。具体分析如下:

在python中调用dll文件中的接口比较简单,如我们有一个test.dll文件,内部定义如下:

extern "C" 
{ 
int __stdcall test( void* p, int len) 
{  
return len; 
} 
}

在python中我们可以用以下两种方式载入

1.

import ctypes
dll = ctypes.windll.LoadLibrary( 'test.dll' )

2.

import ctypes
dll = ctypes.WinDll( 'test.dll' )

其中ctypes.windll为ctypes.WinDll类的一个对象,已经在ctypes模块中定义好的。在test.dll中有test接口,可直接用dll调用即可

nRst = dll.test( )
print nRst

由于在test这个接口中需要传递两个参数,一个是void类型的指针,它指向一个缓冲区。一个是该缓冲区的长度。因此我们要获取到python中的字符串的指针和长度

#方法一:
sBuf = 'aaaaaaaaaabbbbbbbbbbbbbb'
pStr = ctypes.c_char_p( )
pStr.value = sBuf
pVoid = ctypes.cast( pStr, ctypes.c_void_p ).value
nRst = dll.test( pVoid, len( pStr.value) )
#方法二:
test = dll.test
test.argtypes = [ctypes.c_char_p, ctypes.c_int]
test.restypes = ctypes.c_int
nRst = test(sBuf, len(sBuf))

如果修改test.dll中接口的定义如下:

extern "C" 
{ 
  int __cdecl test( void* p, int len)
  { 
    return len; 
  } 
}

由于接口中定义的是cdecl格式的调用,所以在python中也需要用相应的类型

1.  

import ctypes
dll = ctypes.cdll.LoadLibrary( 'test.dll' )
##注:一般在linux下为test.o文件,同样可以使用如下的方法: 
##dll =ctypes.cdll.LoadLibrary('test.o')

2. 

import ctypes
dll = ctypes.CDll( 'test.dll' )

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
python实现哈希表
Feb 07 Python
跟老齐学Python之模块的加载
Oct 24 Python
python命令行解析之parse_known_args()函数和parse_args()使用区别介绍
Jan 24 Python
Python实现PS图像调整之对比度调整功能示例
Jan 26 Python
python3实现绘制二维点图
Dec 04 Python
解决pycharm同一目录下无法import其他文件
Feb 12 Python
使用python计算三角形的斜边例子
Apr 15 Python
matplotlib jupyter notebook 图像可视化 plt show操作
Apr 24 Python
Python叠加矩形框图层2种方法及效果
Jun 18 Python
pytorch随机采样操作SubsetRandomSampler()
Jul 07 Python
推荐技术人员一款Python开源库(造数据神器)
Jul 08 Python
Pycharm学生免费专业版安装教程的方法步骤
Sep 24 Python
深入解析Python中的WSGI接口
May 11 #Python
详细解析Python中__init__()方法的高级应用
May 11 #Python
从Python的源码来解析Python下的freeblock
May 11 #Python
详解Python的Django框架中的templates设置
May 11 #Python
Python素数检测的方法
May 11 #Python
Python中IPYTHON入门实例
May 11 #Python
Python使用MONGODB入门实例
May 11 #Python
You might like
德劲1102收音机的打理维修案例
2021/03/02 无线电
解决中英文字符串长度问题函数
2007/01/16 PHP
一步一步学习PHP(1) php开发环境配置
2010/02/15 PHP
php生成随机字符串可指定纯数字、纯字母或者混合的
2014/04/18 PHP
php通过淘宝API查询IP地址归属等信息
2015/12/25 PHP
PHP 返回13位时间戳的实现代码
2016/05/13 PHP
PHP错误和异常处理功能模块示例
2016/11/12 PHP
php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)
2016/11/28 PHP
PHP设计模式之注册树模式分析
2018/01/26 PHP
javascript随机之洗牌算法深入分析
2014/06/07 Javascript
如何让你的Lightbox支持滚轮缩放及Base64图片
2014/12/04 Javascript
node.js中的http.request方法使用说明
2014/12/14 Javascript
javascript表单验证大全
2015/08/12 Javascript
JavaScript编程中window的location与history对象详解
2015/10/26 Javascript
jQuery实现下拉框多选 jquery-multiselect 的实例代码
2016/07/14 Javascript
angular ng-click防止重复提交实例
2017/06/16 Javascript
基于 Immutable.js 实现撤销重做功能的实例代码
2018/03/01 Javascript
详解Vue CLI3配置解析之css.extract
2018/09/14 Javascript
vue移动端屏幕适配详解
2019/04/30 Javascript
微信小程序开发摇一摇功能
2019/11/22 Javascript
Node中对非阻塞I/O、事件循环的知识点总结
2020/01/05 Javascript
浅析VUE防抖与节流
2020/11/24 Vue.js
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
2018/11/06 Python
nohup后台启动Python脚本,log不刷新的解决方法
2019/01/14 Python
修改Pandas的行或列的名字(重命名)
2019/12/18 Python
python随机模块random的22种函数(小结)
2020/05/15 Python
Python中socket网络通信是干嘛的
2020/05/27 Python
Python中的整除和取模实例
2020/06/03 Python
手机业务员岗位职责
2013/12/13 职场文书
2014年会演讲稿范文
2014/01/06 职场文书
庆元旦迎新年广播稿
2014/02/18 职场文书
学生请假条格式
2014/04/11 职场文书
批评与自我批评范文
2014/10/15 职场文书
《西门豹》教学反思
2016/02/23 职场文书
Python趣味挑战之给幼儿园弟弟生成1000道算术题
2021/05/28 Python
springcloud整合seata
2022/05/20 Java/Android