python 呼叫dll 報錯 WindowsError: [Error 126]
呼叫程式碼
注意:C++檔案(cpp):(在函式宣告上加上extern "C" 的修飾)否則方法名不會被python識別
載入的時候要根據你將要呼叫的函式是符合什麼呼叫約定的。 windll和cdll分別是WinDLL類和CDll類的物件
stdcall呼叫約定:
Objdll = ctypes.windll.LoadLibrary("dllpath")
Objdll = ctypes.WinDLL("dllpath")
cdecl呼叫約定:
Objdll = ctypes.cdll.LoadLibrary("dllpath")
Objdll = ctypes.CDLL("dllpath")
呼叫後就可以使用dll中的函數了
print Objdll.Add(1, 102)
例項程式碼:
Objdll = ctypes.cdll.LoadLibrary("D:\\dll\\PosterDetector.dll")
報錯
使用python呼叫C++的dll報錯
錯誤如下:
Traceback (most recent call last):
File "E:/work/proc/video_web/application.py", line 157, in <module>
Objdll = ctypes.cdll.LoadLibrary(os.path.join(APP_ROOT,"dll","PosterDetector.dll"))
File "d:\python27\Lib\ctypes\__init__.py", line 444, in LoadLibrary
return self._dlltype(name)
File "d:\python27\Lib\ctypes\__init__.py", line 366, in __init__
self._handle = _dlopen(self._name, mode)
WindowsError: [Error 126]
解決
原因是PosterDetector.dll還依賴其他的dll,
單純將這兩個dll檔案放在同一目錄下是沒有作用的,因為Python程序起始路徑並不是 PosterDetector.dll的目錄;
解決:
將其他的dll和當前的PosterDetector.dll放在一個資料夾,並加上程式碼:
os.chdir(D:\\dll"))