如何使用python的ctypes調用醫(yī)保中心的dll動態(tài)庫下載醫(yī)保中心的賬單
需求:根據(jù)醫(yī)保中心的文檔和提供的dll動態(tài)庫調用相關接口下載醫(yī)保中心的賬單。
文檔:對調用dll動態(tài)庫的描述,調用哪個dll文件,同時了解清楚調用這個dll文件中的哪個函數(shù)。

分析:結合文檔及相關介紹弄清楚相關接口調用流程,從以上可以看出接口調用的是SiInterface.dll文件,然后先調用INIT函數(shù)進行初始化,然后再調用BUSINESS_HANDLE函數(shù)在醫(yī)保局簽到,然后在次調用BUSINESS_HANDLE函數(shù)下載賬單,同時根據(jù)文檔分析出每次調用函數(shù)的出入?yún)?。(具體的調用流程及每個函數(shù)的出入?yún)⒁欢ㄒ鶕?jù)完整的醫(yī)保中心的文檔來分析)
代碼簡介:由于簽到和下載賬單調用的是同一個函數(shù),區(qū)別就只是出入?yún)⒉煌?,所以代碼中只會展示調用INIT函數(shù)和BUSINESS_HANDLE函數(shù)進行簽到,下載的那一部分不寫。
代碼:
from ctypes import *
import os
os.environ['path'] += ';C:\localDll' #添加dll依賴庫目錄到系統(tǒng)環(huán)境
def getBusiness():
pDll = windll.LoadLibrary("SiInterface.dll")
str = ''
# 動態(tài)庫初始化,成功的結果為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系統(tǒng)自帶的一個庫,不需要刻意安裝。本代碼使用的python版本為3.7.
2、os.environ['path'] += ';C:\localDll'。醫(yī)保中心提供的動態(tài)庫不是單個的dll文件,而是一堆的文件,這些dll文件中都有相互引用的關系,如果直接通過絕對路徑去加載這個SiInterface.dll文件,程序會直接報錯說找不到指定的模塊,所以將那一堆的dll文件放在C:\localDll c盤下的localDll文件夾下,C:\localDll可以替換成你自己的動態(tài)庫所在的文件夾下,該命令是將動態(tài)庫的路徑添加到系統(tǒng)的環(huán)境環(huán)境下,下面調用SiInterface.dll文件的時候可以直接從系統(tǒng)環(huán)境中找到,不用寫絕對路徑和相對路徑。
3、pDll = windll.LoadLibrary("SiInterface.dll")。加載動態(tài)庫文件,加載的語法有很多,比如CDLL等,如果該命令不行的話可以嘗試其它三種加載動態(tài)庫的方式。
4、res = pDll.INIT(str)。調用動態(tài)庫初始化函數(shù)進行初始化,初始化沒有入?yún)?,所以str=""就行。
5、qiandao = '9100^100006^zzjdz^^^0000^^1^' #入?yún)⒌淖址?br />
yewuzhouqi = create_string_buffer(1024) #給出參分配1024字節(jié)的內存空間
p_qiandao = c_char_p() #聲明入?yún)⑹荂語言中的指針 char *p
p_qiandao.value=qiandao.encode("utf-8") #將入?yún)⑥D為bytes數(shù)組并賦值給入?yún)⒌牡刂匪赶虻膬却婵臻g。
注意:入?yún)⒑统鰠⒍际莄har *p,為什么不把出參聲明成一個c_char_p()?可以,但坑爹的是那個動態(tài)庫要修改出參指針所指向內存中的值,所以直接聲明出參指針,而不申請出參所指向的內存大小的值會發(fā)生內存泄漏導致python直接停止運行。create_string_buffer(1024)相當于C語言的malloc函數(shù),C語言聲明一個指針類型的結構體的時候要給這個結構體分配內存的大小空間。
6、res2 = pDll.BUSINESS_HANDLE(p_qiandao, yewuzhouqi)。調用BUSINESS_HANDLE函數(shù),函數(shù)會有一個返回值res2,同時函數(shù)還會改變出參yewuzhouqi這個指針所指向的內存的值。
7、print(res2)
print(yewuzhouqi.value)
打印函數(shù)的返回值和出參的值。
8、yu=yewuzhouqi.value.decode()
print(yu)
將出參的bytes數(shù)組轉為str字符串。
總結
到此這篇關于如何使用python的ctypes調用醫(yī)保中心的dll動態(tài)庫下載醫(yī)保中心的賬單的文章就介紹到這了,更多相關python ctypes調用dll動態(tài)庫內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
在Python的Django框架中獲取單個對象數(shù)據(jù)的簡單方法
這篇文章主要介紹了在Python的Django框架中獲取單個對象數(shù)據(jù)的簡單方法,Django為數(shù)據(jù)的操作提供了諸多方便的功能,需要的朋友可以參考下2015-07-07
Python的Flask框架標配模板引擎Jinja2的使用教程
Jinja2是Python世界的一款高人氣template engine,是許多開源Web框架的選擇,包括Flask這樣的明星級項目,這里我們就來共同學習Python的Flask框架標配模板引擎Jinja2的使用教程2016-07-07
淺談django不使用restframework自定義接口與使用的區(qū)別
這篇文章主要介紹了淺談django不使用restframework自定義接口與使用的區(qū)別,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07

