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 字符串中的字符倒转
Sep 06 Python
python简单实现计算过期时间的方法
Jun 09 Python
python使用Tesseract库识别验证
Mar 21 Python
matplotlib调整子图间距,调整整体空白的方法
Aug 03 Python
使用memory_profiler监测python代码运行时内存消耗方法
Dec 03 Python
在Python运行时动态查看进程内部信息的方法
Feb 22 Python
pyQt5实时刷新界面的示例
Jun 25 Python
Python实现 PS 图像调整中的亮度调整
Jun 28 Python
opencv python如何实现图像二值化
Feb 03 Python
详解Python IO口多路复用
Jun 17 Python
在pycharm中使用pipenv创建虚拟环境和安装django的详细教程
Nov 30 Python
python3 sqlite3限制条件查询的操作
Apr 07 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
PHP读MYSQL中文乱码的解决方法
2006/12/17 PHP
php笔记之:文章中图片处理的使用
2013/04/26 PHP
PHP的Laravel框架中使用AdminLTE模板来编写网站后台界面
2016/03/21 PHP
浅谈PHP正则中的捕获组与非捕获组
2016/07/18 PHP
PHP标准类(stdclass)用法示例
2016/09/28 PHP
javascript笔试题目附答案@20081025_jb51.net
2008/10/26 Javascript
flash javascript之间的通讯方法小结
2008/12/20 Javascript
Javascript 面向对象(一)(共有方法,私有方法,特权方法)
2012/05/23 Javascript
有关于eclipse配置spket需要注意的一些地方
2013/04/07 Javascript
你必须知道的Javascript知识点之"深入理解作用域链"的介绍
2013/04/23 Javascript
Javascript合并表格中具有相同内容单元格示例
2013/08/11 Javascript
javascript中attribute和property的区别详解
2014/06/05 Javascript
jQuery中appendTo()方法用法实例
2015/01/08 Javascript
JavaScript实现的圆形浮动标签云效果实例
2015/08/06 Javascript
jQuery实现带有动画效果的回到顶部和底部代码
2015/11/04 Javascript
Vue.js绑定HTML class数组语法错误的原因分析
2016/10/19 Javascript
vue2的todolist入门小项目的详细解析
2017/05/11 Javascript
通过构造函数实例化对象的方法
2017/06/28 Javascript
在vue里面设置全局变量或数据的方法
2018/03/09 Javascript
详解使用 Node.js 开发简单的脚手架工具
2018/06/08 Javascript
Node.js从字符串生成文件流的实现方法
2019/08/18 Javascript
详解Vue 换肤方案验证
2019/08/28 Javascript
layui的layedit富文本赋值方法
2019/09/18 Javascript
javascript设计模式 ? 解释器模式原理与用法实例分析
2020/04/17 Javascript
Python 数据结构之队列的实现
2017/01/22 Python
Python基于生成器迭代实现的八皇后问题示例
2018/05/23 Python
对pandas数据判断是否为NaN值的方法详解
2018/11/06 Python
Python Django 实现简单注册功能过程详解
2019/07/29 Python
python读取yaml文件后修改写入本地实例
2020/04/27 Python
美国中西部家用医疗设备商店:Med Mart(轮椅、踏板车、升降机等)
2019/04/26 全球购物
英国领先的在线礼品店:Getting Personal
2019/09/24 全球购物
经典c++面试题五
2014/12/17 面试题
软件售后服务方案
2014/05/29 职场文书
2015年教师学期工作总结
2015/04/30 职场文书
三八节活动主持词
2015/07/04 职场文书
文艺节目主持词
2015/07/06 职场文书