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获取外网ip地址的方法总结
Jul 02 Python
简单总结Python中序列与字典的相同和不同之处
Jan 19 Python
python实现实时监控文件的方法
Aug 26 Python
Python中常用信号signal类型实例
Jan 25 Python
python pandas库中DataFrame对行和列的操作实例讲解
Jun 09 Python
python pytest进阶之xunit fixture详解
Jun 27 Python
python如何读取bin文件并下发串口
Jul 05 Python
对django layer弹窗组件的使用详解
Aug 31 Python
基于python的itchat库实现微信聊天机器人(推荐)
Oct 29 Python
Python3实现建造者模式的示例代码
Jun 28 Python
Python try except finally资源回收的实现
Jan 25 Python
CocosCreator ScrollView优化系列之分帧加载
Apr 14 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生成excel列序号代码实例
2013/12/24 PHP
PHP工程师VIM配置分享
2015/12/15 PHP
php静态成员方法和静态的成员属性的使用方法
2017/10/26 PHP
Laravel5.1 框架Middleware中间件基本用法实例分析
2020/01/04 PHP
javascript 导出数据到Excel(处理table中的元素)
2009/12/18 Javascript
jquery.autocomplete修改实现键盘上下键自动填充示例
2013/11/19 Javascript
js为什么不能正确处理小数运算?
2015/12/29 Javascript
利用JQuery写一个简单的异步分页插件
2016/03/07 Javascript
详谈jQuery Ajax(load,post,get,ajax)的用法
2017/03/02 Javascript
nodejs中使用HTTP分块响应和定时器示例代码
2017/03/19 NodeJs
详解nodejs实现本地上传图片并预览功能(express4.0+)
2017/06/28 NodeJs
从vue基础开始创建一个简单的增删改查的实例代码(推荐)
2018/02/11 Javascript
利用Vue构造器创建Form组件的通用解决方法
2018/12/03 Javascript
Vue+axios+WebApi+NPOI导出Excel文件实例方法
2019/06/05 Javascript
详解小程序如何动态绑定点击的执行方法
2019/11/26 Javascript
JavaScript写个贪吃蛇小游戏(超详细)
2020/03/17 Javascript
[01:51]开启你的城市传奇 完美世界城市挑战赛开始报名
2018/10/09 DOTA
Python返回真假值(True or False)小技巧
2015/04/10 Python
详谈python中冒号与逗号的区别
2018/04/18 Python
Django 忘记管理员或忘记管理员密码 重设登录密码的方法
2018/05/30 Python
pandas实现to_sql将DataFrame保存到数据库中
2019/07/03 Python
Python跳出多重循环的方法示例
2019/07/03 Python
Python 线性回归分析以及评价指标详解
2020/04/02 Python
如何使用python的ctypes调用医保中心的dll动态库下载医保中心的账单
2020/05/24 Python
利用python下载scihub成文献为PDF操作
2020/07/09 Python
以色列的身体护理及家居香薰品牌:Sabon NYC
2018/02/23 全球购物
入党思想汇报
2014/01/05 职场文书
做一个有道德的人活动方案
2014/08/25 职场文书
八项规定对照检查材料
2014/08/31 职场文书
公务员群众路线专题民主生活会发言材料
2014/09/17 职场文书
数学教师个人总结
2015/02/06 职场文书
2015年教师节主持词
2015/07/03 职场文书
大学宣传委员竞选稿
2015/11/19 职场文书
2016年离婚协议书范文
2016/03/18 职场文书
助学金申请书该怎么写?
2019/07/16 职场文书
MSSQL基本语法操作
2022/04/11 SQL Server