如何使用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
猜你喜欢
- 今天终于可以用wxPython开发GUI程序了,非常高兴。把其中的一些注意点写下来以供参考。在windows XP平台下,首先需要做以下环境
- 前言我们实战经常会遇到以下几个问题:1、遇到一个利用步骤十分繁琐的漏洞,中间错一步就无法利用2、挖到一个通用漏洞,想要批量刷洞小赚一波,但手
- Array(数组)内部机制在 Go 语言中数组是固定长度的数据类型,它包含相同类型的连续的元素,这些元素可以是内建类型,像数字和字符串,也可
- Dump ALL MySQL Databasesmysqldump --user=XXXXXXXX --password=XXXXXXX -
- MySQL数据库中文问题的解决方法:1.my.ini MySQL配置文件设置[client]default-character-set=gb
- 本文主要给大家介绍了关于Python中getpass模块的相关内容,分享出来供大家参考学习,话不多说了,来一起看看详细的介绍:getpass
- 在使用ASP来进行后端的数据合法性校验的时候,有些人为满足不同环境下面的数据校验,编写了很多的函数来实现,比如,我们想要校验用户输入的URL
- 可以查看mysql文件目录my.ini文件,可以找到类似于 datadir="D:/beeagle/Program Files/M
- <% '#######以下是一个类文件,下面的注解是调用类的方法####################
- 有的时候取出全部数据库记录也许正好满足你的要求,不过,在大多数情况下我们通常只需得到部分记录。这样一来该如何设计查询呢?当然会更费点脑筋了,
- python一行输入n个数据有时会碰到一行输入多个数据,这是可以先用str类型存一组数据,然后再迭代的将每个数据追加到新的列表中。方法一先输
- 一、问题引发思考前阵子与同事探讨一个小需求时又遇到了按钮表示“动作”和表示“状态”间矛盾问题。想想这个问题多年前已经开始讨论了,所以在此整理
- 前言近几年,制造业作为国民经济主体,是国家创造力、竞争力和综合国力的重要体现。作为制造强国建设的主攻方向,可以说,智能制造发展水平关乎我国未
- 本文实例讲述了Python设计模式之组合模式原理与用法。分享给大家供大家参考,具体如下:组合模式(Composite Pattern):将对
- python序列类型包括哪三种python序列类型包括:列表、元组、字典列表:有序可变序列创建:userlist = [1,2,3,4,5,
- 前言Python的异常处理能力非常强大,但是用不好也会带来负面的影响。我平时写程序的过程中也喜欢使用异常,虽然采取防御性的方式编码会更好,但
- PHP getNamespaces() 函数实例返回 XML 文档中使用的命名空间:<?php $xml=<<<XM
- 一、hook在PyTorch中,提供了一个专用的接口使得网络在前向传播过程中能够获取到特征图,这个接口的名称非常形象,叫做hook。可以想象
- 1. python三维图表绘制方法简介python三维图表的绘制算是二维图表的一个进阶版本,本质上和二维图表的绘制并无差别,唯一的区别在于使
- 近几天闲着没事开始学了些python,看了看之前写过的代码,把写过的基础的几个程序写进博客,今天是第一个。一个可以说简单的不能再简单的小程序