Python 调用DLL文件.docxVIP

  • 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,如

文档评论(0)

1亿VIP精品文档

相关文档