使用python的内置ctypes模块与c、c++写的dll进行交互

本文介绍如何使用Python调用C语言编写的动态链接库(DLL),包括处理指针、结构体等复杂类型参数的方法,并展示了调用Windows API的具体示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址:http://www.2cto.com/kf/201112/113910.html

调用C编写的动态链接库
代码示例

from ctypes import * 
dll = CDLL("add.dll")#加载cdecl的dll。另外加载stdcall的dll的方式是WinDLL("dllpath") 
sum=dll.Add(1, 102) 

若参数为指针

p=1 
sum=dll.sub(2, byref(p))#通过库中的byref关键字来实现 

若参数为结构体
C代码如下:

typedef struct 

    char words[10]; 
}keywords; 
 
typedef struct 

    keywords *kws; 
    unsigned int len; 
}outStruct; 
 
extern "C"int __declspec(dllexport) test(outStruct *o); 
 
int test(outStruct *o) 

    unsigned int i = 4; 
    o->kws = (keywords *)malloc(sizeof(unsigned char) * 10 * i); 
    strcpy(o->kws[0].words, "The First Data"); 
    strcpy(o->kws[1].words, "The Second Data"); 
    o->len = i; 
    return 1; 


Python代码如下:

class keywords(Structure): 
    _fields_ = [('words', c_char *10),] 
 
class outStruct(Structure): 
    _fields_ = [('kws', POINTER(keywords)),('len', c_int),] 
 
o = outStruct() 
dll.test(byref(o)) 
 
print (o.kws[0].words) 
print (o.kws[1].words) 
print (o.len) 

 

 

调用Windows API

#导入ctypes模块 
from ctypes import * 
windll.user32.MessageBoxW(0, '内容!', '标题', 0) 
 
#也可以用以下方式为API函数建立个别名后再进行调用 
MessageBox = windll.user32.MessageBoxW 
MessageBox(0, '内容!', '标题', 0) 

 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值