Python呼叫動態庫,獲取BSTR字串
阿新 • • 發佈:2022-05-24
今天客戶在用Python呼叫我們的動態庫的時候,遇到一個問題,呼叫動態庫中的函式,函式返回的是BSTR字串,但是客戶接收到的是一個8位長度的數字。
動態庫函式原型:EXTERN_C BSTR ELOAMAPI EloamGlobal_GetIdCardData(LONG flag)
解決這個問題可以從兩個方面思考: 方法一:瞭解本質,百度百科BSTR:https://baike.baidu.com/item/BSTR/9858730?fr=aladdin 方法二:推理
這裡記錄下方法二: 1. 接收到的是個8位長度的數字。數字,還是8位長度,這玩意應該是一個地址。 2. 既然是一個地址,那隻要我們去這個地址,然後就知道正確的字串了。 3. 我們是使用的 ctypes 來呼叫動態庫的,所以我們使用 ctypes 這個交通工具去這個地址就可以了 4. 檢視 ctypes 庫文件,我們可以發現有兩種方法可以去這個地址【c_char_p, c_wchar_p】 5. 看函式原型,返回的是BSTR,這裡可以看出我們應該使用 c_wchar_p 6. 通過除錯,我們就可以看見有個value屬性,對應的就是我們需要的字串了
完整程式碼:
動態庫函式原型:EXTERN_C BSTR ELOAMAPI EloamGlobal_GetIdCardData(LONG flag)
解決這個問題可以從兩個方面思考: 方法一:瞭解本質,百度百科BSTR:https://baike.baidu.com/item/BSTR/9858730?fr=aladdin 方法二:推理
這裡記錄下方法二: 1. 接收到的是個8位長度的數字。數字,還是8位長度,這玩意應該是一個地址。 2. 既然是一個地址,那隻要我們去這個地址,然後就知道正確的字串了。 3. 我們是使用的 ctypes 來呼叫動態庫的,所以我們使用 ctypes 這個交通工具去這個地址就可以了 4. 檢視 ctypes 庫文件,我們可以發現有兩種方法可以去這個地址【c_char_p, c_wchar_p】 5. 看函式原型,返回的是BSTR,這裡可以看出我們應該使用 c_wchar_p 6. 通過除錯,我們就可以看見有個value屬性,對應的就是我們需要的字串了
完整程式碼:
fromctypes import windll import ctypes # EXTERN_C BSTR ELOAMAPI EloamGlobal_GetIdCardData(LONG flag) res_p = dll.EloamGlobal_GetIdCardData(1) res_str = ctypes.c_wchar_p(res_p).value print(res_str)