python使用ctypes調(diào)用dll遇到的坑解決記錄
使用ctypes調(diào)用dll遇到的坑
dll調(diào)用
from ctypes import * dll = windll.LoadLibrary('MyDLL.ll') # 方式1 dll = WinDLL('MyDLL.ll') # 方式2 dll = CDLL('MyDLL.dll') # 方式3 dll = cdll.LoadLibrary('MyDLL.dll') # 方式4 # 以上4中調(diào)用方式差不多
問題分析
報錯OSError: [WinError 126] 找不到指定的模塊
2個原因:
1. dll的路徑寫錯了,
2. 缺少相關(guān)依賴庫
我本機裝的 vs2017,但是我拿到的dll是vs2012編譯的,會有問題,我用vs2017重新編譯后就解決了這個問題.
還有可能遇到dll無效的問題,這個是版本的原因,64位的python對應(yīng)64位的dll,32位對應(yīng)32位即可.
dll內(nèi)方法的調(diào)用
出現(xiàn) access violation reading 0x0000000025F0FA60這種異常,出現(xiàn)在函數(shù)需要傳遞指針的時候,解決辦法需要指定argtypes.
dll.CreateProcess.restype = c_void_p # 對應(yīng)c的void* theEnv = dll.CreateProcess() # 指定參數(shù)類型 dll.Initialization.argtypes = [c_void_p,c_char_p,c_char_p,c_char_p] p1 = c_char_p("xxx1.txt".encode('utf-8')) p2 = c_char_p("xxx2.txt".encode('utf-8')) p3 = c_char_p("xxx3.txt".encode('utf-8')) ret = c_int(0) # 此處傳遞過來的參數(shù)也需要是對應(yīng)的類型的參數(shù) ret = dll.Initialization(theEnv, p1, p2 ,p3) # ctypes里沒有c_int的指針類型,這里需要用POINTER自己定義一下 c_int_p = POINTER(c_int*100) faultID = c_int_p() dll.GetFaultList.argtypes = [c_void_p,c_int_p] dll.GetFaultList.restype = c_int # 這里faultID傳參時不要忘了用類型包裝,否則就會出現(xiàn)access violation異常 rtn = dll.GetFaultList(theEnv, c_int_p(faultID))
以上就是python使用ctypes調(diào)用dll遇到的坑解決記錄的詳細(xì)內(nèi)容,更多關(guān)于python ctypes調(diào)用dll坑的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python?Streamlit實現(xiàn)文件的上傳和下載功能
在Web應(yīng)用中,文件的上傳下載是交互中不可缺少的功能,這篇文章主要為大家介紹了如何在Streamlit應(yīng)用中實現(xiàn)文件的上傳和下載功能,感興趣的可以了解下2024-12-12Python中實現(xiàn)傳遞未知數(shù)量的函數(shù)參數(shù)
這篇文章主要介紹了Python中實現(xiàn)傳遞未知數(shù)量的函數(shù)參數(shù)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02Python Pytorch深度學(xué)習(xí)之自動微分
今天小編就為大家分享一篇關(guān)于Pytorch自動微分的文章,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-10-102020新版本pycharm+anaconda+opencv+pyqt環(huán)境配置學(xué)習(xí)筆記,親測可用
這篇文章主要介紹了2020新版本pycharm+anaconda+opencv+pyqt環(huán)境配置學(xué)習(xí)筆記,親測可用,特此分享到腳本之家平臺,需要的朋友可以參考下2020-03-03PHP魔術(shù)方法__ISSET、__UNSET使用實例
這篇文章主要介紹了PHP魔術(shù)方法__ISSET、__UNSET使用實例,本文直接給出代碼示例,需要的朋友可以參考下2014-11-11