- 19
- 0
- 约1.21万字
- 约 12页
- 2016-12-21 发布于北京
- 举报
Python调用windows下DLL详解原文URL是/magictong/archive/2008/10/14/3075478.aspx/magictong/archive/2008/10/14/3075478.aspx貌似原文的网页服务器有问题,总是load不全,所以备个份:Python调用windows下DLL详解在python中某些时候需要C做效率上的补充,在实际应用中,需要做部分数据的交互。使用python中的ctypes模块可以很方便的调用 windows的dll(也包括linux下的so等文件),下面将详细的讲解这个模块(以windows平台为例子),当然我假设你们已经对 windows下怎么写一个DLL是没有问题的。引入ctypes库from ctypes import *假设你有了一个符合cdecl(这里强调调用约定是因为,stdcall调用约定和cdecl调用约定声明的导出函数,在用python加载使用的加载函数是不同的,后面会说明)调用约定的DLL(名字是add.dll),且有一个导出函数Add。建立一个Python文件DllCall.py测试:from ctypes import *dll = CDLL(add.dll)print dll.Add(1, 102)结果:103上面是一个简单的例子。1、加载DLL上面已经说过,加载的时候要根据你将要调用的函数是符合什么调用约定的。stdcall调用约定:两种加载方式Objdll = ctypes.windll.LoadLibrary(dllpath)Objdll = ctypes.WinDLL(dllpath)cdecl调用约定:也有两种加载方式Objdll = ctypes.cdll.LoadLibrary(dllpath)Objdll = ctypes.CDLL(dllpath)其实windll和cdll分别是WinDLL类和CDll类的对象。2、调用dll中的方法在1中加载dll的时候会返回一个DLL对象(假设名字叫Objdll),利用该对象就可以调用dll中的方法。e.g.如果dll中有个方法名字叫Add(注意如果经过stdcall声明的方法,如果不是用def文件声明的导出函数的话,编译器会对函数名进行修改,这个要注意)调用:nRet = Objdll.Add(12, 15) 即完成一次调用。看起来调用似乎很简单,不要只看表象,呵呵,这是因为Add这个函数太简单了,现在假设函数需要你传入一个int类型的指针(int*),可以通过库中的byref关键字来实现,假设现在调用的函数的第三个参数是个int类型的指针。intPara = c_int(9)dll.sub(23, 102, byref(intPara))print intPara.value如果是要传入一个char缓冲区指针,和缓冲区长度,方法至少有四种:# char* -- 1szPara = create_string_buffer(\0*100)dll.PrintInfo(byref(szPara), 100);print szPara.value# char* -- 2sBuf = aaaaaaaaaabbbbbbbbbbbbbbpStr = c_char_p( )pStr.value = sBuf#pVoid = ctypes.cast( pStr, ctypes.c_void_p ).valuedll.PrintInfo(pStr, len(pStr.value))print pStr.value# char* -- 3strMa = \0*20FunPrint = dll.PrintInfoFunPrint.argtypes = [c_char_p, c_int]#FunPrint.restypes = c_void_pnRst = FunPrint(strMa, len(strMa))print strMa,len(strMa)# char* -- 4pStr2 = c_char_p(\0)print pStr2.value#pVoid = ctypes.cast( pStr, ctypes.c_void_p ).valuedll.PrintInfo(pStr2, len(pStr.value))print pStr2.value3、C基本类型和ctypes中实现的类型映射表ctypes数据类型 C数据类型c_char?????????? charc_short????????? shortc_int intc_long longc_ulong unsign longc_float floatc_double doublec_void_p void对应的指针类型是在后面加上_p,如
您可能关注的文档
最近下载
- 重庆市各地方周氏支族源流(1-170支族).doc VIP
- (高清版)B-T 6003.1-2022 试验筛 技术要求和检验 第1部分:金属丝编织网试验筛.pdf VIP
- (已压缩)TUCST007-2020房屋建筑与市政基础设施工程施工安全风险评估技术标准.docx VIP
- 2026年国家公务员考试申论真题及参考答案(考生回忆版).docx VIP
- 部编版语文二年级上册期中常考七大重点题型专项训练.docx VIP
- 机器人操作系统(ROS)及仿真应用 课件全套 第1--9章 Linux Ubuntu入门基础--- 基于ROS的服务机器人应用实例.ppt
- 压疮的预防及护理技术操作考核评分标准编辑.docx VIP
- 高温超导材料在量子计算中的应用前景.docx VIP
- 铺床术操作评分标准.doc VIP
- 2025年陕西高中学业水平合格性考试历史试卷真题(含答案) .pdf VIP
原创力文档

文档评论(0)