Я пишу оболочку Python для C ++ DLL, используя ctypes.Я «сплющил» класс C ++ для обработки основанных на C функций, и большинство из них работают хорошо.Хотя в библиотеке классов есть несколько странных функций, с которыми я не уверен, как справиться.
Вот версия C ++ кода, которую я пытаюсь обернуть:
typedef struct {
short Valid; // magic number
short SizeX,SizeY;
short Fps;
short Shutter1,Shutter2; //Preview 1 and 2 Shutter, in lines (=ShutterTime[sec]*Fps*SizeY)
short PreTrigPages;
short Options;
short BufStart;
short BufEnd;
short SeqLength;
short ShiftCount;
short DBS;
short FN;
short MAXBL;
} CAM_PARMS_V1;
union CAM_PARMS {
CAM_PARMS_V1 p;
BYTE bytes[128];
unsigned long quads[32];
};
//Function prototype
virtual CAM_PARMS *GetCamParms(void);
//Use of function
GetCamParms()->p.SizeX=640;
Теперь, я «сплющил» методы классов к функциям C следующим образом:
typedef CVitCamDLL *CameraHandle;
#define EXPORTCALL __declspec(dllexport) __stdcall
CAM_HW EXPORTCALL GetCamParms(CameraHandle handle)
{
return *handle->GetCamParms();
}
Я не продал себя этому методу упаковки, но компилятор не жаловался, поэтому я взял этокак хороший знак.Моя способность отлаживать C ++ и C в определенной степени основана исключительно на том, о чем на меня кричит компилятор, так что это может быть неправильно?
В любом случае, вот код Python, который я с тех пор сделал, чтобы обернуть его:
import ctypes as ct
from ctypes.util import find_library
dll = find_library('VitCamC')
if dll == None:
raise Exception("VitCamC.dll not found")
cam = ct.WinDLL(dll)
class CAM_PARMS_V1(ct.Structure):
_fields_ = [("Valid", ct.c_short),
("SizeX", ct.c_short),
("SizeY", ct.c_short),
("Fps", ct.c_short),
("Shutter1", ct.c_short),
("Shutter2", ct.c_short),
("PreTrigPages", ct.c_short),
("Options", ct.c_short),
("BufStart", ct.c_short),
("BufEnd", ct.c_short),
("SeqLength", ct.c_short),
("ShiftCount", ct.c_short),
("DBS", ct.c_short),
("FN", ct.c_short),
("MAXBL", ct.c_short)]
class CAM_PARMS(ct.Union):
_fields_ = [("p", CAM_PARMS_V1),
("bytes", ct.c_ubyte * 128),
("quads", ct.c_ulong * 32)]
def get_cam_parms(handle, mode):
cam.GetCamParms.restype = CAM_PARMS #This fixes it!
return cam.GetCamHw(handle, ct.byref(mode))
Итак, я смог исправить нарушение доступа к памяти, и я могу читать данные и все, что является фантастическим.Однако из примера использования C ++ они используют функцию GetCamParms, чтобы также установить данные. Кто-нибудь знает, ссылается ли возвращаемый ctypes на тот же блок памяти и работает ли он одинаково?(Я проверю это, чтобы узнать)