Ich habe einen .dll
namens my.dll
, mit 4 Funktionen aufgerufen, in Python 3.5 verwenden:
myDLL = ctypes.cdll.LoadLibrary(Path:\to\my.dll)
Aufruf dll in Python 3 mit LPSTR
Mein Problem eine Funktion aufruft, die LPSTR
hat:
#include "stdafx.h"
#include "newheader.h"
double _stdcall pain_function(double arg1, double arg2, LPSTR arg_string_with_spaces)
die anderen 3 Anrufe zu my.dll
funktionieren gut.
Unten ist der Code, den ich für die pain_function
versucht:
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
kehrt einige unsinnige Zahl. Ich habe versucht, einige Variationen, meist entlang der Linien von:
some_string = ctypes.create_string_buffer(b' ' * 200)
ich hier unter anderem ausgesehen haben:
Was ist das richtige Weise, um die Zeichenfolge von 200 Leerzeichen an die DLL übergeben?
Vielen Dank im Voraus
'LPSTR' ist ein a Lias von 'c_char_p'. Wenn Sie möchten, können Sie 'from ctypes import wintypes; wintypes.LPSTR'. Da es nicht 'LPCSTR' (eine konstante Zeichenkette) ist, sollten wir davon ausgehen, dass die Funktion den Puffer modifiziert, so dass Sie' create_string_buffer' verwenden können. Es besteht keine Notwendigkeit, den Wert zu "codieren". Verwenden Sie einfach ein 'Bytes' Literal, z.B. 'e = create_string_buffer (b '' * 200)'. Wenn Sie den Wert codieren, verwenden Sie die Kodierung "mbcs" anstelle der Kodierung für harte Codes, Codepage 1252. – eryksun
In Bezug auf die unsinnige Nummer wurde der vollständige Prototyp nicht angezeigt. Wenn 'pain_function' einen 'void'-Rückgabewert hat, setze' pain_function.restype = None'. Wenn es einen "doppelten" Rückgabewert hat, setze 'pain_function.restype = c_double'. Und so weiter. – eryksun
@eryksun Danke! ... Ich glaube, es gab zwei Probleme mit dem Code (1) 'restype', den ich (2) diesen 'LPSTR' korrigiert habe. Jetzt sieht mein Argumenttyp so aus:' pain_function = ['ctypes.c_double, ctypes.c_double, wintypes .LPSTR] 'aber - jetzt gibt es nur ein Double, was fehlt noch? –