如何使用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实现通过shelve修改对象实例
Sep 26 Python
Python实现HTTP协议下的文件下载方法总结
Apr 20 Python
Python3实战之爬虫抓取网易云音乐的热门评论
Oct 09 Python
详解python中asyncio模块
Mar 03 Python
python进行TCP端口扫描的实现
Dec 21 Python
python实现简单flappy bird
Dec 24 Python
解决django中ModelForm多表单组合的问题
Jul 18 Python
python实现树的深度优先遍历与广度优先遍历详解
Oct 26 Python
使用python的pyplot绘制函数实例
Feb 13 Python
Python动态导入模块和反射机制详解
Feb 18 Python
opencv 图像腐蚀和图像膨胀的实现
Jul 07 Python
python中sys模块是做什么用的
Aug 16 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开发文件系统实例讲解
2006/10/09 PHP
使ecshop模板中可引用常量的实现方法
2011/06/02 PHP
Function eregi is deprecated (解决方法)
2013/06/21 PHP
Symfony2框架创建项目与模板设置实例详解
2016/03/17 PHP
jquery不支持toggle()高(新)版本的问题解决
2016/09/24 PHP
PHP调用API接口实现天气查询功能的示例
2017/09/21 PHP
javascript实现二分查找法实现代码
2007/11/12 Javascript
js tab效果的实现代码
2009/12/26 Javascript
jquery CSS选择器笔记
2010/03/29 Javascript
关于div自适应高度/左右高度自适应一致的js代码
2013/03/22 Javascript
window.showModalDialog参数传递中含有特殊字符的处理方法
2013/06/06 Javascript
jQuery实现新消息闪烁标题提示的方法
2015/03/11 Javascript
详解AngularJS中的表格使用
2015/06/16 Javascript
基于jquery实现全屏滚动效果
2015/11/26 Javascript
详解JS中Array对象扩展与String对象扩展
2016/01/07 Javascript
jQuery隐藏和显示效果实现
2016/04/06 Javascript
jQuery实现的仿百度,仿谷歌搜索下拉框效果示例
2016/12/30 Javascript
js学习总结_轮播图之渐隐渐现版(实例讲解)
2017/07/17 Javascript
11行JS代码制作二维码生成功能
2018/03/09 Javascript
element-ui组件table实现自定义筛选功能的示例代码
2019/03/15 Javascript
JavaScript实现移动小精灵的案例代码
2020/12/12 Javascript
[02:05]2014DOTA2西雅图邀请赛 老队长全明星大猜想谁不服就按进显示器
2014/07/08 DOTA
[01:34]DOTA2 7.22版本新增神杖效果一览(敏捷英雄篇)
2019/05/28 DOTA
有关wxpython pyqt内存占用问题分析
2014/06/09 Python
朴素贝叶斯分类算法原理与Python实现与使用方法案例
2018/06/26 Python
PyQt5实现从主窗口打开子窗口的方法
2019/06/19 Python
Python实现 PS 图像调整中的亮度调整
2019/06/28 Python
python变量命名的7条建议
2019/07/04 Python
用python写测试数据文件过程解析
2019/09/25 Python
python随机生成大小写字母数字混合密码(仅20行代码)
2020/02/01 Python
基于Python的身份证验证识别和数据处理详解
2020/11/14 Python
Python 远程开关机的方法
2020/11/18 Python
利用纯CSS3实现文字向右循环闪过效果实例(可用于移动端)
2017/06/15 HTML / CSS
Theory美国官网:后现代都市风时装品牌
2018/05/09 全球购物
2015年先进个人自荐书
2015/03/24 职场文书
十大动画制作软件,Adobe产品上榜两款,第一是行业标准软件
2022/03/18 杂记