如何使用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 isinstance判断对象类型
Sep 06 Python
python实现用户登陆邮件通知的方法
Jul 09 Python
python中abs&map&reduce简介
Feb 20 Python
利用django-suit模板添加自定义的菜单、页面及设置访问权限
Jul 13 Python
Python中安装easy_install的方法
Nov 18 Python
Django管理员账号和密码忘记的完美解决方法
Dec 06 Python
Python字符串的常见操作实例小结
Apr 08 Python
Python 绘制酷炫的三维图步骤详解
Jul 12 Python
django-crontab 定时执行任务方法的实现
Sep 06 Python
Python爬虫代理池搭建的方法步骤
Sep 28 Python
python 实现mysql自动增删分区的方法
Apr 01 Python
Python爬虫之爬取某文库文档数据
Apr 21 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
openPNE常用方法分享
2011/11/29 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
thinkphp5框架实现的自定义扩展类操作示例
2019/05/16 PHP
thinkphp3.2框架中where条件查询用法总结
2019/08/13 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
PHP开发API接口签名生成及验证操作示例
2020/05/27 PHP
php开发最强大的IDE编辑的phpstorm 2020.2配置Xdebug调试的详细教程
2020/08/17 PHP
javascript 正则替换 replace(regExp, function)用法
2010/05/22 Javascript
JS 实现获取打开一个界面中输入的值
2013/03/19 Javascript
nodejs 提示‘xxx’ 不是内部或外部命令解决方法
2014/11/20 NodeJs
jquery实现点击其他区域时隐藏下拉div和遮罩层的方法
2015/12/23 Javascript
Javascript之Date对象详解
2016/06/07 Javascript
jQuery通过ajax方法获取json数据不执行success的原因及解决方法
2016/10/15 Javascript
angularJS 指令封装回到顶部示例详解
2017/01/22 Javascript
js实现返回顶部效果
2017/03/10 Javascript
详解webpack2+React 实例demo
2017/09/11 Javascript
浅谈Angular 的变化检测的方法
2018/03/01 Javascript
jQuery插件Validation表单验证详解
2018/05/26 jQuery
用webpack4开发小程序的实现方法
2019/06/04 Javascript
vue-i18n实现中英文切换的方法
2020/07/06 Javascript
python类定义的讲解
2013/11/01 Python
Python fileinput模块使用实例
2015/05/28 Python
Python实现扣除个人税后的工资计算器示例
2018/03/26 Python
Python批量合并有合并单元格的Excel文件详解
2018/04/05 Python
python实现文件分片上传的接口自动化
2020/11/19 Python
利用纯CSS3实现tab选项卡切换示例代码
2016/09/21 HTML / CSS
Html5 页面适配iPhoneX(就是那么简单)
2019/09/05 HTML / CSS
如何提高SQL Server的安全性
2016/07/25 面试题
摄影实习自我鉴定
2013/09/20 职场文书
财务工作疏忽检讨书
2014/09/11 职场文书
领导班子遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
2014员工聘用协议书(最新版)
2014/11/24 职场文书
2015毕业设计工作总结
2015/07/24 职场文书
如何使用分区处理MySQL的亿级数据优化
2021/06/18 MySQL
AJAX实现指定部分页面刷新效果
2021/10/16 Javascript
Python捕获、播放和保存摄像头视频并提高视频清晰度和对比度
2022/04/14 Python