ctypes — A foreign function library for Python

本文详细介绍了如何在Python中使用ctypes库加载和调用不同操作系统(Windows,Linux)的动态链接库,涉及stdcall/cdecl调用约定,以及处理ANSI/UNICODE版本的函数和特殊函数名称的访问方法。
摘要由CSDN通过智能技术生成

本文翻译自:ctypes — A foreign function library for Python

由于一些代码示例在Linux、Windows或macOS下的行为不同,因此它们在注释中包含doctest指令。

注意,c_long和c_int本质上是同一个类型。

1.加载动态链接库
ctypes导出cdll,在Windows上导出windll和oledll对象,用于加载动态链接库。通过将库作为这些对象的属性访问来加载库。

cdll所调用的库,通过标准的cdecl调用规约导出函数。然而windll使用stdcall调用规约调用函数。oledll也使用stdcall调用规约.

在函数调用失败时,会产生WindowsError或OSError。

请注意,msvcrt是包含大多数标准C函数的MS标准C库,并使用cdecl调用约定:
在这里插入图片描述

通过cdll.msvcrt访问标准的C库,将用到这个库的一个过时版本,这个版本可能与Python中使用的那个是不兼容的。在可能的情况下,使用原生Python功能,或者导入并使用msvcrt模块。

在Linux上,需要指定包含加载库扩展名的文件名,因此不能使用属性访问来加载库。应该使用dll加载器的LoadLibrary()方法,或者通过调用构造函数创建一个CDLL实例来加载库:
在这里插入图片描述

2.从加载的DLL中访问函数
函数作为dll对象的属性被访问:
在这里插入图片描述
注意win32系统的DLL,就像kernel32和user32,经常输出一个函数的ANSI和UNICODE版本。UNICODE版本导出时在名称后添加W,而ANSI版本导出时在名称后添加A。win32的GetModuleHandle函数,win32 GetModuleHandle函数返回给定模块名的模块句柄,具有以下C原型,并且根据是否定义了UNICODE,使用宏将其中一个暴露为GetModuleHandle:
在这里插入图片描述
你必须通过显式指定GetModuleHandleA或GetModuleHandleW来访问你需要的版本,然后分别用字节或字符串对象调用它。
有时,dll导出的函数的名称不是有效的Python标识符,就像"??2@YAPAXI@Z",在这种情况下你必须使用getattr()去找回函数:
在这里插入图片描述
在Windows中,一些DLL输出函数不是通过名字,而是通过顺序。这些函数可以通过用序数索引dll对象来访问:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值