EDSDK Проблемы с просмотром в реальном времени на примере канона - PullRequest
1 голос
/ 28 марта 2020

Мне нужно сделать функцию для изображения в реальном времени в камере canon, но когда я пытаюсь использовать пример кода, предоставленного из canon, я получаю некоторые ошибки в переменных. Поэтому я изменил код, чтобы он мог работать. Но функция EDSDK.EdsGetPropertyData возвращает код ошибки 98 (в шестнадцатеричном формате 62), который представляет ошибку EDS_ERR_INVALID_POINTER. Я хотел бы знать, что не так в моем коде, и как я могу это сделать.

IntPtr outData;
    public void startLiveview(IntPtr camera)
    {

        uint err = EDSDK.EDS_ERR_OK;
        EDSDK.EdsDataType device = new EDSDK.EdsDataType();
        int size;
        EDSDK.EdsOpenSession(camera);
        // Get the output device for the live view image EdsUInt32 device; err = EdsGetPropertyData(camera, kEdsPropID_Evf_OutputDevice,  0 ,  , sizeof(device), &device ); 

        // PC live view starts by setting the PC as the output device for the live view image. if(err == EDS_ERR_OK) {  device |= kEdsEvfOutputDevice_PC; 
        err = EDSDK.EdsGetPropertySize(camera, EDSDK.PropID_Evf_OutputDevice, 0,out device, out size);
        MessageBox.Show("Error result:"+err.ToString());
        MessageBox.Show(device.ToString());
        MessageBox.Show(size.ToString());
        err = EDSDK.EdsGetPropertyData(camera, EDSDK.PropID_Evf_OutputDevice, 0, size, outData);
        MessageBox.Show(outData.ToString());
        if (err == EDSDK.EDS_ERR_OK)
        {
            //type2.GetType();
            //device |= EDSDK.PropID_Evf_OutputDevice;

            // err = EDSDK.EdsSetPropertyData(camera, EDSDK.PropID_Evf_OutputDevice, 0, sizeof(device), &device);
        }
        else
        {
            MessageBox.Show("Error result:" + err.ToString());
        }

        EDSDK.EdsCloseSession(camera);
    }

1 Ответ

0 голосов
/ 28 марта 2020

EdsGetPropertyData ожидает, что указатель outData будет иметь значение, но вы передаете нулевой указатель.

Сначала нужно выделить память, а затем вызвать EdsGetPropertyData, то есть что-то вроде этого:

outData = System.Runtime.InteropServices.Marshal.AllocHGlobal(size);
err = EDSDK.EdsGetPropertyData(camera, EDSDK.PropID_Evf_OutputDevice, 0, size, outData);

Как только вы закончите, вы должны освободить выделенную память, или у вас будет утечка памяти:

System.Runtime.InteropServices.Marshal.FreeHGlobal(outData);

В C# примерах В Canon SDK (начиная с версии 13.x, я считаю) вы должны найти методы, которые уже реализуют методы EdsGetPropertyData для нескольких типов данных. Почему бы не использовать их вместо того, чтобы писать самим?

...