python使用ctypes库调用外部dll

上传人:xiao****1972 文档编号:84979976 上传时间:2019-03-06 格式:DOC 页数:6 大小:168KB
返回 下载 相关 举报
python使用ctypes库调用外部dll_第1页
第1页 / 共6页
python使用ctypes库调用外部dll_第2页
第2页 / 共6页
python使用ctypes库调用外部dll_第3页
第3页 / 共6页
python使用ctypes库调用外部dll_第4页
第4页 / 共6页
python使用ctypes库调用外部dll_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《python使用ctypes库调用外部dll》由会员分享,可在线阅读,更多相关《python使用ctypes库调用外部dll(6页珍藏版)》请在金锄头文库上搜索。

1、Python:使用ctypes库调用外部DLL前言朋友的公司是做GPS的,上周联系到我要帮做个程序把他们平台的车辆定位跟踪数据和省里的平台对接。看一下官方提供的三个文档,洋洋洒洒共一百多页,一大堆协议的定义甚是齐全,好在官方的文件中也带有个封装好通信功能的DLL和一个调用此接口的c+ DEMO程序,既然有现成的可用,那就不必去看他的协议了。说实话,参加工作之后就基本没用过c+,生疏了。特别是要用c+操作数据库,对我来说比割几刀还要痛苦。官方的API中已经很详尽,要做的就是从现有平台的数据库中获取车辆定位信息,通过官方的API发送到省中心平台。本想用C#给官方API做个包装,省得再去动用C+,可

2、是看到此API中定义有几个Struct,而且下行数据都是通过回调函数方式提供,google了一下,似乎C#对调用有回调函数的C DLL不是很顺畅,于是放弃了,想到了Python。一、Python之ctypesctypes是Python的一个外部库,提供和C语言兼容的数据类型,可以很方便地调用C DLL中的函数。在Python2.5官方安装包都带有ctypes1.1版。ctypes的官方文档在这里。ctypes的使用非常简明,如调用cdecl方式的DLL只需这样:123fromctypesimport*;h=CDLL(msvcrt.dll)h.printf(a=%d,b=%d,a+b=%d,1,

3、2,1+2);以上代码运行后输出 a=1,b=2,a+b=3。二、加载库和普通函数的调用官方API提供的库中有几个主要的函数:1234567891011121314/初始化intDCSPCLIENTDLL InitInterface(constchar*pCenterIP,constunsignedshortnUpLinkSvrPort,constunsignedshortnDownLinkSvrPort );/释放资源intDCSPCLIENTDLL FiniInterface(void);/登录intDCSPCLIENTDLL Login(constunsignedintuiBranchP

4、latformID,constunsignedintnUserID,constchar*pPassword );/注销intDCSPCLIENTDLL Logout(constunsignedintuiBranchPlatformID,constunsignedintnUserID,constchar*pPassword );/发车辆实时定位数据intDCSPCLIENTDLL SendUPRealLocation(constchar*constpDeviceId,constcharcDeviceColor,constunsignedshortnMsgCode,const_stBPDynami

5、cData *constpStGpsData );在Python中加载使用:1234567891011121314fromctypesimport*#加载API库api=CDLL(DCSPClientDLL.dll);#初始化函数的参数类型api.InitInterface.argtypes=c_char_p,c_ushort,c_ushortapi.Login.argtypes=c_uint,c_uint,c_char_papi.Logout.argtypes=c_uint,c_uint,c_char_p#初始化并登录api.InitInterface(u中心服务器地址, u上行服务端端口,

6、 u下行客户端端口)api.Login(platformID,userID,password);#.其它操作api.Logout(platformID,userID,password);#注销参数类型可以像上面的代码一样预先设定好,或者在调用函数时再把参数转成相应的c_*类型。ctypes的类型对应如下:如此,完成了简单的第一步。三、C语言中的Struct数据结构在发送实时定位数据的函数SendUPRealLocation中有一个参数是结构体类型 _stBPDynamicData。python中没有struct这种数据结构,ctypes很周全,对C的struct和union这二种数据类型都提供

7、很好的支持。stBPDynamicData结构的定义如下:123456789101112131415161718192021222324/ 车辆动态数据结构体struct_stBPDynamicData/ 加密状态unsignedcharencrypt;/ GPS 时间_StructTime gpsTime;/ 经度unsignedintlongitude;/ 纬度unsignedintlatitude;/ GPS速度unsignedshortunGpsSpeed;/ 行驶记录仪速度unsignedshortunTachographSpeed;/ 车辆当前总里程数unsignedintuiMi

8、leageTotal;/ 角度unsignedshortangle;/ 车辆状态unsignedshortstate;/ 报警状态unsignedshortalarm;在python中,需要定义一个与这兼容的类,继承于ctypes.Structure,其中还用到一个_StructTime结构,这里一并贴出代码:123456789101112131415161718192021222324252627282930313233class_StructTime(Structure):_fields_=(day,c_ubyte),(month,c_ubyte),(year,c_ushort),(hou

9、r,c_ubyte),(minute,c_ubyte),(second,c_ubyte);def_str_(self):return0-1-2 3:4:5.format(self.year,self.month,self.day,self.hour,self.minute,self.second);class_stBPDynamicData(Structure):_fields_=(encrypt,c_ubyte),(gpsTime,_StructTime),(longitude,c_uint),(latitude,c_uint),(unGpsSpeed,c_ushort),(unTachog

10、raphSpeed,c_ushort),(uiMileageTotal,c_uint),(angle,c_ushort),(state,c_ushort),(alarm,c_ushort);def_str_(self):returnu(0,1),6,sp:2,angle:3,st:4,al:5.format(self.longitude,self.latitude,self.unGpsSpeed,self.angle ,self.state,self.alarm,self.gpsTime );classgpsData(Structure):_fields_=(strDeviceID,c_cha

11、r_p),(cDeviceColor,c_char),(nMsgCode,c_ushort),(stBPD,_stBPDynamicData);def_str_(self):returnu0,1.format(self.strDeviceID,self.stBPD );gpsData是我自己加的一个类,用于记录每辆车的信息。现在就可以使用SendUPRealLocation函数发送车辆实时数据了:123456789tm=_StructTime();tm.year=2010;tm.month=4;tm.day=3;tm.hour=11;tm.minute=2;tm.second=11;bpd=_

12、stBPDynamicData();bpd.gpsTime=tm;bpd.longitude=1234567;bpd.latitude=246898;#.其它参数data=gpsData();data.strDeviceID=u桂Coo007;data.stBPD=bpd;#调用 API发送数据api.SendUPRealLocation( data.strDeviceID, data.cDeviceColor ,data.nMsgCode, addressof( data.stBPD ) );注意SendUPRealLocation第三个参数是_stBPDynamicData * 指针类型,所以要用ctypes.addressof()取参数的地址。四、回调函数写到这里就忍不住唠叨几句,这个系统的协议设计的太有 “个性”了。这个系统的功能说起来也不复杂,就是要GPS运营商把指定的车辆位置信息发送到中心平台,同时中心平台可以向各GPS终端发送一些数据和指令,比如传送文字信息到终端,或者要求终端拍张照片反馈到中心。这个协议流程是这样,运营商端主动连接到中心服务器,然后此连接只用于传输向中心平台主动

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号