如何使用python的ctypes调用医保中心的dll动态库下载医保中心的账单


Posted in Python onMay 24, 2020

需求:根据医保中心的文档和提供的dll动态库调用相关接口下载医保中心的账单。

文档:对调用dll动态库的描述,调用哪个dll文件,同时了解清楚调用这个dll文件中的哪个函数。

如何使用python的ctypes调用医保中心的dll动态库下载医保中心的账单

 分析:结合文档及相关介绍弄清楚相关接口调用流程,从以上可以看出接口调用的是SiInterface.dll文件,然后先调用INIT函数进行初始化,然后再调用BUSINESS_HANDLE函数在医保局签到,然后在次调用BUSINESS_HANDLE函数下载账单,同时根据文档分析出每次调用函数的出入参。(具体的调用流程及每个函数的出入参一定要根据完整的医保中心的文档来分析)

代码简介:由于签到和下载账单调用的是同一个函数,区别就只是出入参不同,所以代码中只会展示调用INIT函数和BUSINESS_HANDLE函数进行签到,下载的那一部分不写。

代码:

from ctypes import *
import os
os.environ['path'] += ';C:\localDll' #添加dll依赖库目录到系统环境
 
def getBusiness():
 pDll = windll.LoadLibrary("SiInterface.dll")
 str = ''
 # 动态库初始化,成功的结果为0
 res = pDll.INIT(str)
 print(res)
 
 qiandao = '9100^100006^zzjdz^^^0000^^1^'
 yewuzhouqi = create_string_buffer(1024)
 p_qiandao = c_char_p()
 p_qiandao.value=qiandao.encode("utf-8")
 res2 = pDll.BUSINESS_HANDLE(p_qiandao, yewuzhouqi)
 #打印返回结果
 print(res2)
 print(yewuzhouqi.value)
 yu=yewuzhouqi.value.decode()
 print(yu)
 
if __name__=="__main__":
 getBusiness()

代码详细介绍:

1、ctypes是python系统自带的一个库,不需要刻意安装。本代码使用的python版本为3.7.

2、os.environ['path'] += ';C:\localDll'。医保中心提供的动态库不是单个的dll文件,而是一堆的文件,这些dll文件中都有相互引用的关系,如果直接通过绝对路径去加载这个SiInterface.dll文件,程序会直接报错说找不到指定的模块,所以将那一堆的dll文件放在C:\localDll  c盘下的localDll文件夹下,C:\localDll可以替换成你自己的动态库所在的文件夹下,该命令是将动态库的路径添加到系统的环境环境下,下面调用SiInterface.dll文件的时候可以直接从系统环境中找到,不用写绝对路径和相对路径。

3、pDll = windll.LoadLibrary("SiInterface.dll")。加载动态库文件,加载的语法有很多,比如CDLL等,如果该命令不行的话可以尝试其它三种加载动态库的方式。

4、res = pDll.INIT(str)。调用动态库初始化函数进行初始化,初始化没有入参,所以str=""就行。

5、qiandao = '9100^100006^zzjdz^^^0000^^1^'   #入参的字符串
    yewuzhouqi = create_string_buffer(1024)         #给出参分配1024字节的内存空间
    p_qiandao = c_char_p()                                       #声明入参是C语言中的指针 char *p
    p_qiandao.value=qiandao.encode("utf-8")         #将入参转为bytes数组并赋值给入参的地址所指向的内存空间。

    注意:入参和出参都是char *p,为什么不把出参声明成一个c_char_p()?可以,但坑爹的是那个动态库要修改出参指针所指向内存中的值,所以直接声明出参指针,而不申请出参所指向的内存大小的值会发生内存泄漏导致python直接停止运行。create_string_buffer(1024)相当于C语言的malloc函数,C语言声明一个指针类型的结构体的时候要给这个结构体分配内存的大小空间。

6、res2 = pDll.BUSINESS_HANDLE(p_qiandao, yewuzhouqi)。调用BUSINESS_HANDLE函数,函数会有一个返回值res2,同时函数还会改变出参yewuzhouqi这个指针所指向的内存的值。

7、print(res2)
    print(yewuzhouqi.value)

打印函数的返回值和出参的值。

8、yu=yewuzhouqi.value.decode()
    print(yu)

将出参的bytes数组转为str字符串。

总结

到此这篇关于如何使用python的ctypes调用医保中心的dll动态库下载医保中心的账单的文章就介绍到这了,更多相关python ctypes调用dll动态库内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
使用Python编写一个最基础的代码解释器的要点解析
Jul 12 Python
python交互式图形编程实例(一)
Nov 17 Python
Python实现的基于优先等级分配糖果问题算法示例
Apr 25 Python
Python装饰器原理与简单用法实例分析
Apr 29 Python
Python实现聊天机器人的示例代码
Jul 09 Python
python制作抖音代码舞
Apr 07 Python
Python中的pathlib.Path为什么不继承str详解
Jun 23 Python
使用python爬取微博数据打造一颗“心”
Jun 28 Python
python实现从本地摄像头和网络摄像头截取图片功能
Jul 11 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
May 11 Python
虚拟环境及venv和virtualenv的区别说明
Feb 05 Python
python实现腾讯滑块验证码识别
Apr 27 Python
Python+PyQt5实现灭霸响指功能
May 25 #Python
PyQt5实现仿QQ贴边隐藏功能的实例代码
May 24 #Python
通过Python扫描代码关键字并进行预警的实现方法
May 24 #Python
关于keras中keras.layers.merge的用法说明
May 23 #Python
使用keras2.0 将Merge层改为函数式
May 23 #Python
使用keras实现densenet和Xception的模型融合
May 23 #Python
在keras下实现多个模型的融合方式
May 23 #Python
You might like
PHP 调试工具Debug Tools
2011/04/30 PHP
探讨各种PHP字符串函数的总结分析
2013/06/05 PHP
php获取用户浏览器版本的方法
2015/01/03 PHP
PHP实现生成数据字典功能示例
2018/05/24 PHP
Cookie跨域问题解决方案代码示例
2020/11/24 PHP
Javascript 继承机制的实现
2009/08/12 Javascript
对象题目的一个坑 理解Javascript对象
2015/12/22 Javascript
微信小程序 this和that详解及简单实例
2017/02/13 Javascript
Bootstrap免费字体和图标网站(值得收藏)
2017/03/16 Javascript
微信小程序五星评分效果实现代码
2017/04/06 Javascript
websocket+node.js实现实时聊天系统问题咨询
2017/05/17 Javascript
基于jquery日历价格、库存等设置插件
2020/07/05 jQuery
深入理解react 组件类型及使用场景
2019/03/07 Javascript
Vue实战教程之仿肯德基宅急送App
2019/07/19 Javascript
探索node之事件循环的实现
2020/10/30 Javascript
[29:16]完美世界DOTA2联赛决赛日 Inki vs LBZS 第三场 11.08
2020/11/10 DOTA
Python 连连看连接算法
2008/11/22 Python
一个计算身份证号码校验位的Python小程序
2014/08/15 Python
Python实现list反转实例汇总
2014/11/11 Python
利用Python实现简单的相似图片搜索的教程
2015/04/23 Python
python计算牛顿迭代多项式实例分析
2015/05/07 Python
详解Python里使用正则表达式的ASCII模式
2017/11/02 Python
python实现对象列表根据某个属性排序的方法详解
2019/06/11 Python
Python Tkinter模块 GUI 可视化实例
2019/11/20 Python
PyCharm+Pipenv虚拟环境开发和依赖管理的教程详解
2020/04/16 Python
TensorFlow固化模型的实现操作
2020/05/26 Python
python等待10秒执行下一命令的方法
2020/07/19 Python
CSS3 :not()选择器实现最后一行li去除某种css样式
2016/10/19 HTML / CSS
html5 Canvas画图教程(8)—canvas里画曲线之bezierCurveTo方法
2013/01/09 HTML / CSS
马来西亚网上花店:FlowerAdvisor马来西亚
2020/01/03 全球购物
美国价格实惠的在线眼镜网站:Zeelool
2020/12/25 全球购物
Ruby中的保护方法和私有方法与一般面向对象程序设计语言的一样吗
2013/05/01 面试题
外贸采购员求职的自我评价
2013/11/26 职场文书
中式婚礼主持词
2014/03/13 职场文书
导游词之镇江西津古渡
2019/11/06 职场文书
详解Java ES多节点任务的高效分发与收集实现
2021/06/30 Java/Android