2019-08-27 来源:编玩边学
做某些项目时,需要调用自己的或者其他dll文件(也包括Linux下的so文件),下面介绍下怎么使用ctypes库来调用dll文件。
首先引入ctypes库
import ctypes as cp
然后假设有个加法函数的add.dll,并且符合cdecl调用约定(因为stdcall和cdecl调用约定声明的导出函数,在Python加载时使用的不同方式)。测试
dll = cp.CDLL(‘add.dll’)
print dll.add(1,2)//结果为3
cdecl是C语言默认的调用方式,支持变长参数,其实windll和cdll分别是WinDLL类和CDll类的对象,调用约定的两种加载方式。
Objdll = ctypes.cdll.LoadLibrary(‘dllpath’)
Objdll = ctypes.CDLL(‘dllpath’)
stdcall是C++语言的调用方式,不支持变长参数,调用约定的两种加载方式
Objdll = ctypes.windll.LoadLibrary("dllpath")
Objdll = ctypes.WinDLL("dllpath")
还有其他调用方式
第一种
libHandle = ctypes.windll.kernel32.LoadLibraryW('add.dll')
print(libHandle)
lib = ctypes.CDLL(None, handle=libHandle)
lib.printf(b"hello world!\n")
打印libHandle,出来是数字地址,比如5233859212,可以把dll文件加上绝对路径再运行一下,打印出来的值为0,通过这个就可以知道dll是不是已经正确导入了。一般来说LoadLibrary能够正确区分DLL的编码类型,或者显示的进行调用,LoadLibraryW用来打开Unicode编码的DLL,LoadLibraryA用来打开ANSI编码的DLL。然后再使用CDLL指定handle加载DLL,就可以使用了
第二种
dll = ctypes.CDLL('add.dll')
lib = ctypes.CDLL(None, handle=dll._handle)
lib.printf(b"hello world!\n")
没有用windos的API加载DLL,而是直接使用CDLL加载,这个返回的对象中的_handle属性才是我们要的handle,再次使用CDLL加载就可以使用了
第三种
ctypes.cdll.add.printf(b'hello world!\n')
另外Python和C及ctypes中的数据类型必须对应
Python type | C type | ctypes type |
bool(1) | _Bool | c_bool |
1-character string | char | c-char |
1-character unicode string | wchar_t | c-wchar |
int/long | char | c-byte |
int/long | unsigned char | c-ubyte |
int/long | short | c-short |
int/long | unsigned short | c-ushort |
int/long | int | c-int |
int/long | unsigned int | c-uint |
int/long | long | c-long |
int/long | unsigned long | c-ulong |
int/long | __int64 or long long | c-longlong |
int/long | unsigned __int64 or unsigned long long | c-ulonglong |
float | float | c-float |
float | double | c-double |
float | long double | c-longdouble |
string or None | char *(NUL terminated) | c-char_p |
unicode or None | wchar_t *(NUL terminated) | c-wchar_p |
int/long or None | void * | c-void_p |
所以如果您想报名少儿编程培训课程,就请点击“少儿编程报名”,填写信息,并领取5G的免费试听课程和学习资料。
关注我们的自媒体
获取更多精彩内容
编玩边学订阅号
编玩边学服务号
编玩边学广东 深圳
1、"编玩边学"上的内容,包括文章、资料、资讯等,本网注明"来源:编玩边学"的,其版权均为"编玩边学"或深圳市编玩边学教育科技有限公司所有,任何公司、媒体、网站或个人未经授权不得转载、链接、转贴或以其他方式使用。已经得到"编玩边学"许可的媒体、网站,在使用时必须注明"来源:编玩边学",违者本网站将依法追究责任。
2、"编玩边学" 未注明"来源:编玩边学"的文章、资料、资讯等均为转载,本网站转载出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如其他媒体、网站或个人从本网站下载使用,必须保留本网站注明的"稿件来源",并自负版权等法律责任。如擅自篡改为" 来源:编玩边学 " ,本网站将依法追究其法律责任。
3、如果本网所转载内容侵犯了您的权益,请与我们联系team@codepku.com,我们将及时处理。
请输入正确的证书编号
学员姓名:孙兴民
课程:Scratch Level 1
发证日期:2019.08.15