調用DLL我有一個.dll
名爲my.dll
,有4個功能,堪稱蟒蛇3.5使用:
myDLL = ctypes.cdll.LoadLibrary(Path:\to\my.dll)
在Python 3 LPSTR
我的問題是調用一些存在LPSTR
功能:
#include "stdafx.h"
#include "newheader.h"
double _stdcall pain_function(double arg1, double arg2, LPSTR arg_string_with_spaces)
其他3個電話my.dll
工作正常。
下面是我試過的pain_function
代碼:
import ctypes
from ctypes import wintypes
# Load dll
myDLL = ctypes.WinDLL(Path:\to\my.dll)
# Call function
pain_function = myDLL.pain_function
# Typecast the arguments
pain_function.argtypes = [ctypes.c_double, ctypes.c_double, wintypes.LPSTR]
# Typecast the return
pain_function.restype = ctypes.c_double
pain_return = pain_function(arg1, arg2, some_string)
pain_return
返回一些荒謬的數字。我嘗試了一些變化,主要是線沿線的:我在這裏看着其他地方
some_string = ctypes.create_string_buffer(b' ' * 200)
:
這是什麼正確的方式將200個空格的字符串傳遞給dll?
預先感謝您
'LPSTR'是一個'c_char_p'的lias。如果你願意,你可以使用'from ctypes import wintypes; wintypes.LPSTR'。既然它不是'LPCSTR'(一個常量字符串),我們應該假設函數修改緩衝區,所以你使用'create_string_buffer'是正確的。沒有必要對這個值進行編碼。只需使用「字節」字面值,例如'e = create_string_buffer(b''* 200)'。如果您對該值進行編碼,請使用「mbcs」編碼,而不是硬編碼代碼頁1252. – eryksun
至於無意義的編號,您沒有顯示完整的原型。如果'pain_function'具有'void'返回值,則設置'pain_function.restype = None'。如果它有一個'double'返回值,則設置'pain_function.restype = c_double'。等等。 – eryksun
@eryksun謝謝! ...我認爲有兩個問題與代碼(1)'restype',我固定(2)這個'LPSTR',所以現在我的argtype看起來像這樣:'pain_function = ['ctypes.c_double,ctypes.c_double,wintypes .LPSTR]'但是 - 現在它只是返回一個double,還缺少了什麼? –