如何使用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优化技巧之利用ctypes提高执行速度
Sep 11 Python
python爬虫headers设置后无效的解决方法
Oct 21 Python
python 借助numpy保存数据为csv格式的实现方法
Jul 04 Python
windows7 32、64位下python爬虫框架scrapy环境的搭建方法
Nov 29 Python
Python3.5装饰器典型案例分析
Apr 30 Python
python的time模块和datetime模块实例解析
Nov 29 Python
Python如何获取Win7,Win10系统缩放大小
Jan 10 Python
利用Tensorflow的队列多线程读取数据方式
Feb 05 Python
如何清空python的变量
Jul 05 Python
Visual Studio Code搭建django项目的方法步骤
Sep 17 Python
python代码实现图书管理系统
Nov 30 Python
python爬虫中的url下载器用法详解
Nov 30 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来自动调用不同服务器上的flash
2006/10/09 PHP
PHP实现MVC开发得最简单的方法――模型
2007/04/10 PHP
PHP文章采集URL补全函数(FormatUrl)
2012/08/02 PHP
destoon设置自定义搜索的方法
2014/06/21 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
2014/11/19 PHP
解决laravel-admin 自己新建页面里 js 需要刷新一次的问题
2019/10/03 PHP
Alliance vs Liquid BO3 第三场2.13
2021/03/10 DOTA
gameboy网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点
2016/02/21 Javascript
Angular中使用ui router实现系统权限控制及开发遇到问题
2016/09/23 Javascript
vue 做移动端微信公众号采坑经验记录
2018/04/26 Javascript
微信小程序页面间值传递的两种方法
2018/11/26 Javascript
jQuery实现数字自动增加或者减少的动画效果示例
2018/12/11 jQuery
vue动态子组件的两种实现方式
2019/09/01 Javascript
vue中input的v-model清空操作
2019/09/06 Javascript
详解vue-router的导航钩子(导航守卫)
2020/11/02 Javascript
Javascript实现打鼓效果
2021/01/29 Javascript
[01:20]DOTA2更新全新英雄 天涯墨客现已加入游戏
2018/08/25 DOTA
Python3实现购物车功能
2018/04/18 Python
pygame游戏之旅 添加游戏界面按键图形
2018/11/20 Python
python异步存储数据详解
2019/03/19 Python
django 捕获异常和日志系统过程详解
2019/07/18 Python
django 数据库连接模块解析及简单长连接改造方法
2019/08/29 Python
Python完全识别验证码自动登录实例详解
2019/11/24 Python
css3的@media属性实现页面响应式布局示例代码
2014/02/10 HTML / CSS
香港钟表珠宝首饰商城:OneMallTime网摩间
2016/10/14 全球购物
梅西酒窖:Macy’s Wine Cellar
2018/01/07 全球购物
一道SQL存储过程面试题
2016/10/07 面试题
abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗?
2012/10/15 面试题
毕业生在校学习的自我评价分享
2013/10/08 职场文书
小学体育教学反思
2014/01/31 职场文书
英文自荐信常用句子
2014/03/26 职场文书
反四风对照检查材料思想汇报
2014/09/16 职场文书
入党积极分子十八届四中全会思想汇报
2014/10/23 职场文书
秋菊打官司观后感
2015/06/03 职场文书
2016年万圣节活动总结
2016/04/05 职场文书
Go遍历struct,map,slice的实现
2021/06/13 Golang