Использование Python ctypes для переноса плоского метода класса C ++, возвращающего указатель объединения - PullRequest
3 голосов
/ 25 мая 2011

Я пишу оболочку 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 на тот же блок памяти и работает ли он одинаково?(Я проверю это, чтобы узнать)

...