Python:使用ctypes库调用外部DLL(转)
2013-03-29 18:33
225 查看
前言
朋友的公司是做GPS的,上周联系到我要帮做个程序把他们平台的车辆定位跟踪数据和省里的平台对接。看一下官方提供的三个文档,洋洋洒洒共一百多页,一大堆协议的定义甚是齐全,好在官方的文件中也带有个封装好通信功能的DLL和一个调用此接口的c++ DEMO程序,既然有现成的可用,那就不必去看他的协议了。说实话,参加工作之后就基本没用过c++,生疏了。特别是要用c++操作数据库,对我来说比割几刀还要痛苦。官方的API中已经很详尽,要做的就是从现有平台的数据库中获取车辆定位信息,通过官方的API发送到省中心平台。
本想用C#给官方API做个包装,省得再去动用C++,可是看到此API中定义有几个Struct,而且下行数据都是通过回调函数方式提供,google了一下,似乎C#对调用有回调函数的C DLL不是很顺畅,于是放弃了,想到了Python。
一、Python之ctypes
ctypes是Python的一个外部库,提供和C语言兼容的数据类型,可以很方便地调用C DLL中的函数。在Python2.5官方安装包都带有ctypes 1.1版。ctypes的官方文档在这里。ctypes的使用非常简明,如调用cdecl方式的DLL只需这样:
?
二、加载库和普通函数的调用
官方API提供的库中有几个主要的函数:?
?
如此,完成了简单的第一步。
三、C语言中的Struct数据结构
在发送实时定位数据的函数SendUPRealLocation中有一个参数是结构体类型 _stBPDynamicData。python中没有struct这种数据结构,ctypes很周全,对C的struct和union这二种数据类型都提供很好的支持。stBPDynamicData结构的定义如下:?
?
现在就可以使用SendUPRealLocation函数发送车辆实时数据了:
?
四、回调函数
写到这里就忍不住唠叨几句,这个系统的协议设计的太有 “个性”了。这个系统的功能说起来也不复杂,就是要GPS运营商把指定的车辆位置信息发送到中心平台,同时中心平台可以向各GPS终端发送一些数据和指令,比如传送文字信息到终端,或者要求终端拍张照片反馈到中心。这个协议流程是这样,运营商端主动连接到中心服务器,然后此连接只用于传输向中心平台主动发送的数据。登录成功了之后呢,中心平台再向运营商的IP建立一个连接,用于中心下发的数据和指令。官方称为“双链路”。
于是,就要求运营商必须要有固定的公网IP(这个不是问题,据了解GPS运营商服务器都有固定IP),而且这个程序必须运行在有公网IP的电脑上或采用端口映射之类的方法。可是俺开发设计时是在大教育局域网中的,搞个端口映射都不可能更别谈公网IP了。于是,在调试下行数据部分功能时就只能远程到运营商服务器上去调试了。
回归正题。
要使用回调函数,需要先用 CFUNCTYPE 定义回调函数的类型,官方API中有十多个回调函数注册,定义摘抄:
?
?
其余的回调函数用相同的方法处理。
结尾
调试完API对接部分功能后,在想用哪个py库操作数据库比较方便呢,找了一下之后才想到为何不用ironPython而可以直接使用ado.net访问数据库,岂不是更爽。于是把代码搬到ironPython2.6中试试,让我十分惊喜的是不用做任何个性代码直接运行成功!ironPython 2.6中的ctypes和Python2.6的一样都是1.1.0版。
相关文章推荐
- Python:使用ctypes库调用外部DLL
- Python:使用ctypes库调用外部DLL(附带ctypes c 类型转换图)
- Python:使用ctypes库调用外部DLL(转)
- Python:使用ctypes库调用外部DLL
- Python:使用ctypes库调用外部DLL
- Python:使用ctypes库调用外部DLL 数据类型对应
- python中使用ctypes调用MinGW生成的动态链接库(dll)
- python中使用ctypes调用MinGW生成的动态链接库(dll)
- 使用python2.7中ctypes库调用windows下的dll
- ## 人生苦短我用python[0x08] 使用ctypes调用c语言接口 ##
- Python使用ctypes调用C函数传参处理
- Python 使用 subprocess 调用外部命令
- python使用ctypes模块调用windowsapi获取系统版本示例
- Python 使用ctypes调用 C 函数
- 使用python的内置ctypes模块与c、c++写的dll进行交互
- 使用Python 3.0a1 调用外部应用程序
- Python调用windows下DLL详解 - ctypes库的使用
- python通过ctypes调用dll
- Python调用windows下DLL详解 - ctypes库的使用
- Python调用windows下DLL详解 - ctypes库的使用