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

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

2.加载动态连接库
Ctypes可以扩展cdll,windows系统下的windll和oledll对象,用于加载其动态连接库
在windows下的扩展例子:
From ctypes imp ort *
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中搜索该函数,发现该函数签名如下
HMODULE GetModuleHandle( LPCTSTR lpModuleName );
其中参数类型为: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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值