我不是理论派,那就从实践中成长吧 微博:http://www.weibo.com/willsfanw

python调用的动态连接库的方法(ctypes)

上一篇 / 下一篇  2009-12-07 17:01:21

学习目的:掌握使用python调用动态连接库的方法
通过阅读python帮助和一些简单源码,得出以下几点:
1.python实现调用函数,主要依赖于ctypes,ctypes是一个python的外函数库,可以提供与c兼容的数据类型,并允许调用dll或共享库中的方法
eg:
fromctypesimport*   (import ctypes)

2.加载动态连接库
Ctypes可以扩展cdll,windows系统下的windll和oledll对象,用于加载其动态连接库
在windows下的扩展例子:
From ctypes import *
windll.kernel32
cdll.msvcrt

3.在linux下,需要明确的指明文件名(包括扩展名)去加载库。只有使用loadLibary()方法或通过创建Cdll的接口来调用结构体,来实现加载
eg:
cdll.LoadLibrary("libc.so.6")
libc = CDLL("libc.so.6")

4.win32系统dlls像kernel32和user32经常有ANSI和UNICODE版本的方法区分,UNICODE版本需要在函数名后加一个W,而ANSI版本则需要加一个A在函数名后

5.有时,dlls扩展方法时,会出现函数名无法被python编译器识别的情况(eg:获取到函数名为??2@YAPAXI@Z),可以使用getattr的方法,来重新获取该方法
>>>getattr(cdll.msvcrt,"??2@YAPAXI@Z")

6.也可以通过按自然序数来调用某些dll中的函数
>>>cdll.kernel32[1]# doctest: +WINDOWS<_FuncPtr object at 0x...>

7.最重要的一块
None,integers,longs,byte strings和unicode strings是python中仅有的可以被直接拿来作为函数调用参数使用None等同于C中的空指针 
byte strings和unicode 
strings等同于指向内存块的指针(char *和Wchar_t *)
Python中的integers和longs等同于平台默认的c中的int型

8.通过查看想调用的函数在msdn中的详细解释,参数和返回值的类型,从而确定python调用时需要转换至什么类型
eg:
尝试调用GetModuleHandle(获取某进程调用的模块的句柄)函数
首先在MSDN中搜索该函数,发现该函数签名如下
HMODULEGetModuleHandle(LPCTSTRlpModuleName);
其中参数类型为:Pointer to a null-terminated string,且可以为空指针
返回值为:If the function succeeds, the return value is a handle to the specified module
故调用该函数的python语句可以如下
from ctypes import *
windll.kernel32.GetModuleHandle(none)




TAG: python入门

 

评分:0

我来说两句

日历

« 2024-05-05  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 18178
  • 日志数: 22
  • 建立时间: 2009-12-07
  • 更新时间: 2011-09-26

RSS订阅

Open Toolbar