1. 程式人生 > >python 呼叫dll 報錯 WindowsError: [Error 126]

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"))