如何使用python的ctypes调用医保中心的dll动态库下载医保中心的账单
作者:weixin_42502300 发布时间:2022-08-02 13:14:35
需求:根据医保中心的文档和提供的dll动态库调用相关接口下载医保中心的账单。
文档:对调用dll动态库的描述,调用哪个dll文件,同时了解清楚调用这个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字符串。
来源:https://blog.csdn.net/weixin_42502300/article/details/106298760


猜你喜欢
- 在当今用户的显示器越来越大的今天,之前的1024*768固宽布局有点越来越不合时宜,对大屏幕的用户而言,两侧空空的留白给人第一眼的印象是严重
- Vigenere 加密算法该密码由意大利密码学家 Giovan Battista Bellaso 于 1553 年发明,但几个世纪以来一直归
- mybatis数据库排序今天用到了对数据库按照倒序进行输出。因为刚接触mybatis,所以对这方面还不是太了解,再网上搜了好长时间终于找到了
- 本文实例讲述了django框架中间件原理与用法。分享给大家供大家参考,具体如下:中间件:轻量级,介于 request和response之间的
- Pytest和Unittest测试框架的区别?如何区分这两者,很简单unittest作为官方的测试框架,在测试方面更加基础,并且可以再次基础
- 本文实例为大家分享了python编写决策树源代码,供大家参考,具体内容如下因为最近实习的需要,所以用python里的sklearn包重新写了
- 要求:编写登陆接口输入用户名密码认证成功后显示欢迎信息输错三次后锁定针对此实例写了有二种类型的脚本,略有不同,具体如下:帐号文件accoun
- 磁盘搜索是性能的很大瓶颈。这个问题在数据大量增长以至于无法使用有效的缓存时尤为明显。或多或少随即访问大数据库时,就必然会有至少一次磁盘搜索来
- 一个ASP文件通常包含HTML标签,有时和一个HTML文件非常类似。然而,ASP文件(除了包含HTML标签外),还可以包括服务器的脚本程序,
- 一般写ASP PHP代码的朋友都估计是采用直接操作SQL的吧~ 看以下的代码 <% dim conn,rs&nbs
- 一、前言Hadoop原理架构本人就不在此赘述了,可以自行百度,本文仅介绍Hadoop-3.1.2完全分布式环境搭建(本人使用三个虚拟机搭建)
- itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单。开源地址https://github.com/littleco
- 目录前言线程安全锁的作用Lock() 同步锁基本介绍使用方式死锁现象with语句RLock() 递归锁基本介绍使用方式with语句Condi
- bug1无法正常使用cmd或pycharm正常安装,报错截图如下:解决(1): 这种情况下,我们就不能使用cmd或pycharm进
- python版本: 3.6pandas版本: 0.23.4行索引索引行有三种方法,分别是 loc iloc iximport pandas
- 具体方法:首先打开命令提示符;然后执行【mysql -u root -p】命令进入mysql;最后执行如下命令即可:select SUBST
- 有时候需要一次性将SQL Server中的数据导出给其他部门的也许进行关联或分析,这种需求对于SSIS
- SELECT表名=case when a.colorder=1 then d.name else '' end,表说明=ca
- 线性回归属于监督学习,因此方法和监督学习应该是一样的,先给定一个训练集,根据这个训练集学习出一个线性函数,然后测试这个函数训练的好不好(即此
- # -*- coding: utf-8 -*-import Image,ImageDraw,ImageFontimport randomim