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

作者:weixin_42502300 时间:2022-08-02 13:14:35 

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

来源:https://blog.csdn.net/weixin_42502300/article/details/106298760

标签:python,ctypes,dll,动态库
0
投稿

猜你喜欢

  • jsp下页面跳转的几种方法小结

    2023-07-22 00:38:07
  • Javascript fso操作文件

    2008-07-30 12:51:00
  • asp如何正确显示数据库里同时存在的GB码和BIG5编码?

    2010-06-28 18:26:00
  • Hibernate Oracle sequence的使用技巧

    2023-07-06 05:18:42
  • django连接oracle时setting 配置方法

    2021-08-23 15:20:13
  • OpenCV图像处理GUI功能详解

    2021-01-26 15:55:34
  • Python使用dict.fromkeys()快速生成一个字典示例

    2022-05-10 08:13:23
  • PJBlog3优化——301定向跳转解决重复内容的问题

    2009-05-20 10:40:00
  • 监控 url fragment变化的js代码

    2023-08-25 10:20:58
  • Python 进程操作之进程间通过队列共享数据,队列Queue简单示例

    2023-06-01 12:17:58
  • 几种修复ACCESS数据库的实用方法

    2008-11-20 17:37:00
  • MATLAB中print函数使用示例详解

    2023-11-18 04:18:04
  • Python列表解析操作实例总结

    2022-10-10 09:59:38
  • AJAX的jQuery实现入门(二)

    2008-05-01 13:04:00
  • Python激活Anaconda环境变量的详细步骤

    2023-01-02 18:45:20
  • python3实现用turtle模块画一棵随机樱花树

    2023-11-30 06:04:07
  • 深入理解Python虚拟机中字典(dict)的实现原理及源码剖析

    2022-03-10 20:57:06
  • 用户体验杂谈

    2011-10-21 21:09:08
  • Python基于Google Bard实现交互式聊天机器人

    2022-12-14 22:05:20
  • python读取与写入csv格式文件的示例代码

    2023-08-09 09:07:15
  • asp之家 网络编程 m.aspxhome.com