编玩边学

>

资讯中心

>

推荐资讯

> 正文

python怎么调用windows下的dll文件

2019-08-27 来源:编玩边学

做某些项目时,需要调用自己的或者其他dll文件(也包括Linux下的so文件),下面介绍下怎么使用ctypes库来调用dll文件。

首先引入ctypes

import ctypes as cp

然后假设有个加法函数的add.dll,并且符合cdecl调用约定(因为stdcallcdecl调用约定声明的导出函数,在Python加载时使用的不同方式)。测试

dll = cp.CDLL(add.dll)

print dll.add(1,2)//结果为3

cdeclC语言默认的调用方式,支持变长参数,其实windllcdll分别是WinDLL类和CDll类的对象,调用约定的两种加载方式。

Objdll = ctypes.cdll.LoadLibrary(dllpath)

Objdll = ctypes.CDLL(dllpath)

stdcallC++语言的调用方式,不支持变长参数,调用约定两种加载方式

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编码的DLLLoadLibraryA用来打开ANSI编码的DLL然后再使用CDLL指定handle加载DLL,就可以使用了

 

第二种

dll = ctypes.CDLL('add.dll')

lib = ctypes.CDLL(None, handle=dll._handle)

lib.printf(b"hello world!\n")

没有用windosAPI加载DLL,而是直接使用CDLL加载,这个返回的对象中的_handle属性才是我们要的handle,再次使用CDLL加载就可以使用了

 

第三种

ctypes.cdll.add.printf(b'hello world!\n')

 

另外PythonCctypes中的数据类型必须对应

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,我们将及时处理。

证书查询 x
请输入证书编号:

请输入正确的证书编号

学员姓名:孙兴民

课程:Scratch Level 1

发证日期:2019.08.15

证书查询

该证书不存在