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中argparse模块用法实例详解
Jun 03 Python
python使用clear方法清除字典内全部数据实例
Jul 11 Python
详解Python中表达式i += x与i = i + x是否等价
Feb 08 Python
PyCharm设置SSH远程调试的方法
Jul 17 Python
python pyheatmap包绘制热力图
Nov 09 Python
Python 实现取矩阵的部分列,保存为一个新的矩阵方法
Nov 14 Python
详解Python安装tesserocr遇到的各种问题及解决办法
Mar 07 Python
详解python实现交叉验证法与留出法
Jul 11 Python
Flask模板引擎Jinja2使用实例
Apr 23 Python
Python+Kepler.gl轻松制作酷炫路径动画的实现示例
Jun 02 Python
Python celery原理及运行流程解析
Jun 13 Python
Python2与Python3关于字符串编码处理的差别总结
Sep 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
使用GROUP BY的时候如何统计记录条数 COUNT(*) DISTINCT
2011/04/23 PHP
php对关联数组循环遍历的实现方法
2015/03/13 PHP
php使用指定编码导出mysql数据到csv文件的方法
2015/03/31 PHP
分享PHP源码批量抓取远程网页图片并保存到本地的实现方法
2015/12/01 PHP
Zend Framework框架Smarty扩展实现方法
2016/03/22 PHP
Zend Framework教程之Zend_Db_Table表关联实例详解
2016/03/23 PHP
验证坐标在某坐标区域内php代码
2016/10/08 PHP
静态页面下用javascript操作ACCESS数据库(读增改删)的代码
2007/05/14 Javascript
javascript StringBuilder类实现
2008/12/22 Javascript
jQuery html() in Firefox (uses .innerHTML) ignores DOM changes
2010/03/05 Javascript
JavaScript知识点整理
2015/12/09 Javascript
JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题如何解决
2016/11/11 Javascript
JavaScript实现图片懒加载(Lazyload)
2016/11/28 Javascript
vue router demo详解
2017/10/13 Javascript
Node 自动化部署的方法
2017/10/17 Javascript
bootstrap Table服务端处理分页(后台是.net)
2017/10/19 Javascript
vue cli3.0 引入eslint 结合vscode使用
2019/05/27 Javascript
Python Matplotlib库入门指南
2015/05/18 Python
理解Python中的With语句
2016/03/18 Python
Python绘制3D图形
2018/05/03 Python
使用pandas read_table读取csv文件的方法
2018/07/04 Python
Python for循环及基础用法详解
2019/11/08 Python
Python通过2种方法输出带颜色字体
2020/03/02 Python
基于Python模拟浏览器发送http请求
2020/11/06 Python
机电一体化自荐信
2013/12/10 职场文书
商业活动邀请函
2014/02/04 职场文书
企业文明单位申报材料
2014/05/16 职场文书
社会稳定风险评估方案
2014/06/02 职场文书
无房产证房屋转让协议书合同样本
2014/10/18 职场文书
开展党的群众路线教育实践活动个人对照检查材料
2014/11/05 职场文书
有限责任公司股东合作协议书
2014/12/02 职场文书
党员争先创优承诺书
2015/01/20 职场文书
完美处理python与anaconda环境变量的冲突问题
2021/04/07 Python
Python中seaborn库之countplot的数据可视化使用
2021/06/11 Python
CSS3中Animation实现简单的手指点击动画的示例
2021/07/15 HTML / CSS
Win11 25163.1010更新补丁KB5016904推送,测试服务验证管道(附更新修复汇总)
2022/07/23 数码科技