如何使用python的ctypes调用医保中心的dll动态库下载医保中心的账单

 更新时间:2020年05月24日 10:59:34   作者:weixin_42502300  
这篇文章主要介绍了如何使用python的ctypes调用医保中心的dll动态库下载医保中心的账单,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

需求:根据医保中心的文档和提供的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字符串。

总结

到此这篇关于如何使用python的ctypes调用医保中心的dll动态库下载医保中心的账单的文章就介绍到这了,更多相关python ctypes调用dll动态库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python四则运算表达式求值示例详解

    python四则运算表达式求值示例详解

    这篇文章主要为大家介绍了python四则运算表达式求值示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • 在Python的Django框架中获取单个对象数据的简单方法

    在Python的Django框架中获取单个对象数据的简单方法

    这篇文章主要介绍了在Python的Django框架中获取单个对象数据的简单方法,Django为数据的操作提供了诸多方便的功能,需要的朋友可以参考下
    2015-07-07
  • Python如何调用JS文件中的函数

    Python如何调用JS文件中的函数

    这篇文章主要介绍了Python如何调用JS文件中的函数的相关知识点总结,有兴趣的朋友们跟着学习下。
    2019-08-08
  • Python的Flask框架标配模板引擎Jinja2的使用教程

    Python的Flask框架标配模板引擎Jinja2的使用教程

    Jinja2是Python世界的一款高人气template engine,是许多开源Web框架的选择,包括Flask这样的明星级项目,这里我们就来共同学习Python的Flask框架标配模板引擎Jinja2的使用教程
    2016-07-07
  • Python列表切片操作实例探究(提取复制反转)

    Python列表切片操作实例探究(提取复制反转)

    在Python中,列表切片是处理列表数据非常强大且灵活的方法,本文将全面探讨Python中列表切片的多种用法,包括提取子列表、复制列表、反转列表等操作,结合丰富的示例代码进行详细讲解
    2024-01-01
  • Python 元组(Tuple)操作详解

    Python 元组(Tuple)操作详解

    Python的元组与列表类似,不同之处在于元组的元素不能修改,元组使用小括号,列表使用方括号,元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可
    2014-03-03
  • 浅析Python中MySQLdb的事务处理功能

    浅析Python中MySQLdb的事务处理功能

    这篇文章给大家介绍了Python中MySQLdb的事务处理功能,对大家学习python操作数据具有一定参考借鉴价值,有需要的朋友们可以参考借鉴。
    2016-09-09
  • 跟老齐学Python之类的细节

    跟老齐学Python之类的细节

    前面对类的有关内容已经描述不少了,其实话题远远没有结束,不过对于初学者,掌握这些已经算是入门,在以后的实践中,还需要进行体会和感悟。
    2014-10-10
  • Python猫眼电影最近上映的电影票房信息

    Python猫眼电影最近上映的电影票房信息

    这篇文章主要介绍了Python猫眼电影最近上映的电影票房信息,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • 浅谈django不使用restframework自定义接口与使用的区别

    浅谈django不使用restframework自定义接口与使用的区别

    这篇文章主要介绍了浅谈django不使用restframework自定义接口与使用的区别,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07

最新评论