Добрый день! Пишу программу для фотоаппарата Canon EOS 450D, MS VS 2005 C#.
Сделал инициализацию сдк, подключение к камере, делаю снимок, а загрузить его пока не получается...
Возникла проблема с коллбэк функцией ObjectEventCallBack, а именно: она никогда не вызывается у меня
Хотя другие ObjectEventHandler, PropertyEventHandler итд срабатывают нормально.
//объявляем делегат
EDSDK.EdsObjectEventHandler ObjectEventHandle;
//создаём
ObjectEventHandle = new EDSDK.EdsObjectEventHandler(ObjectEventCallBack);
//регистрируем
err = EDSDK.EdsSetObjectEventHandler(camera, EDSDK.ObjectEvent_All, ObjectEventHandle, IntPtr.Zero);
//регистрация успешно... err = 0;
//CALLBACK FUNCTION ... FUCK... NEVER CALLED!!!
public uint ObjectEventCallBack(uint inEvent, IntPtr obj, IntPtr inContext)
{
switch (inEvent)
{
case EDSDK.ObjectEvent_DirItemRequestTransfer:
//Загрузить изображение!
DownloadImage(obj);
break;
default:
//Object without the necessity is released
if (obj != IntPtr.Zero)
{
EDSDK.EdsRelease(obj);
}
break;
}
return EDSDK.EDS_ERR_OK;
}
Может кто уже сталкивался с подобной проблемой
Боролся с этой проблемой на С++. Посмотрел иностранные поисковики. Есть народ который мучается именно с этой проблемой. Все работает, кроме callback'а. Кто-то советовал проверить чтобы запись шла на комп а не на флэшку, проверил, все нормально ...
EdsUInt32 saveTo = kEdsSaveTo_Host;
err = EdsSetPropertyData(m_camera, kEdsPropID_SaveTo, 0, sizeof(saveTo) , &saveTo);
Но ! Мой код был в Console проекте (под Win32), работающее приложение из SDK под MFC. После того как я перенес мой-же код в MFC проект, все заработало ... видимо этот callback каким-то образом использует или очередь сообщений Win32 или еще что-то чего нет в консольном приложении.
Также радует комментарий в примере к SDK:
#ifdef __MACOS__
/*
* Caution!
* About a console application, you need calling Carbon API "RunCurrentEventRoop()"
* after calling "EdsInitializeSDK()".
* If you do not call this API, the program might stop when it execute OpenSession(), but
* we do not understand why it stops.
*/
RunCurrentEventLoop(10 * kEventDurationMillisecond) ;
#endif
Так что, как говорится, заработало и хорошо ... не трогай!