跳至内容
Python 俱乐部
用户工具
登录
站点工具
搜索
工具
显示页面
修订记录
反向链接
最近更改
媒体管理器
网站地图
登录
>
最近更改
媒体管理器
网站地图
您的足迹:
python-files:call-dll-functions
本页面只读。您可以查看源文件,但不能更改它。如果您觉得这是系统错误,请联系管理员。
====== Python使用ctypes调用DLL中的函数 ====== 在python中调用dll文件中的接口比较简单,实例代码如下。 ===== __stdcall 模式 DLL ===== 如我们有一个test.dll文件,内部定义如下: <code c> extern "C" { int __stdcall test( void* p, int len) { return len; } } </code> 在python中我们可以用以下两种方式载入 方法一: <code python> import ctypes dll = ctypes.windll.LoadLibrary( 'test.dll' ) </code> 方法二: <code python> import ctypes dll = ctypes.WinDll( 'test.dll' ) </code> 其中ctypes.windll为ctypes.WinDll类的一个对象,已经在ctypes模块中定义好的。在test.dll中有test接口,可直接用dll调用即可 <code python> nRst = dll.test( ) print nRst </code> 由于在test这个接口中需要传递两个参数,一个是void类型的指针,它指向一个缓冲区。一个是该缓冲区的长度。因此我们要获取到python中的字符串的指针和长度 #方法一: <code 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) ) </code> #方法二: <code python> test = dll.test test.argtypes = [ctypes.c_char_p, ctypes.c_int] test.restypes = ctypes.c_int nRst = test(sBuf, len(sBuf)) </code> ===== __cdecl 模式 DLL ===== 如果修改test.dll中接口的定义如下: <code c> extern "C" { int __cdecl test( void* p, int len) { return len; } } </code> 由于接口中定义的是cdecl格式的调用,所以在python中也需要用相应的类型 #方法一: <code python> import ctypes dll = ctypes.cdll.LoadLibrary( 'test.dll' ) ##注:一般在linux下为test.o文件,同样可以使用如下的方法: ## dll = ctypes.cdll.LoadLibrary('test.o') </code> #方法二: <code python> import ctypes dll = ctypes.CDll( 'test.dll' ) </code> ===== 参考 ===== * http://blog.csdn.net/lf8289/article/details/2322550
python-files/call-dll-functions.txt
· 最后更改: 2011/07/27 05:35 (外部编辑)
页面工具
显示页面
修订记录
反向链接
回到顶部