Я использую Canon EDSDK_64 v2.15. Я могу получать события, отправленные Canon SDK, используя простой цикл сообщений под Windows7. Например, когда я хочу сделать снимок и в ожидании данных изображения, которые я использую:
xCanonError = EdsSendCommand(xCanonEOS, kEdsCameraCommand_TakePicture, 0);
if(xCanonError != EDS_ERR_OK)
{
AddLogText(L"sending command TakePicture - error - "+SmartCanon::GetCanonSDKError(xCanonError));
return false;
}
MSG msg;
while(eState == detector_state_busy)
{
if (::GetMessage(&msg, NULL, NULL, NULL) == -1)
{
AddLogText(L" - capture image - waiting for an image - GetMessage() error - " + std::to_wstring(HRESULT_FROM_WIN32(GetLastError())));
break;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Sleep(2);
};
Вот как я регистрирую свой обработчик объекта:
xCanonError = EdsSetObjectEventHandler(xCanonEOS, kEdsObjectEvent_All, CSDKHandleObjectEvent, this);
if (xCanonError != EDS_ERR_OK)
{
AddLogText(L"EdsSetObjectEventHandler() - error - "+GetCanonSDKError(xCanonError));
EdsRelease(xCanonEOS);
xCanonEOS = NULL;
EdsTerminateSDK();
return;
}
куда xCanonEOS
является EdsCameraRef
; this
это указатель на класс, который я использую для выполнения всей работы с моей камерой Canon. А вот моя функция обработчика событий объекта:
EdsError EDSCALLBACK CSDKHandleObjectEvent(EdsObjectEvent p_sCSDKEvent, EdsBaseRef p_sCSDKObject, EdsVoid* p_pCSDKData)
{
// my class for working with Canon camera
SmartCanon::TDetectorCANON* v_psDetectorCanonEOS = reinterpret_cast<SmartCanon::TDetectorCANON*>(p_pCSDKData);
// a lot of irrelevant code...
v_psDetectorCanonEOS->SetState(detector_state_idle);
return EDS_ERR_OK;
}
Моя проблема в том, что тот же код не работают под Windows 8.1. Программа просто зайти в while
цикл и зарегистрированная функция обратного вызова никогда не вызывается.
Я использую VS2013 x64 компилятор. Моя камера Canon EOS 60D. Мое приложение использует библиотеку MFC.
Может кто-то может указать, что я делаю неправильно или предоставить решение, как решить эту проблему?
У меня была та же проблема, и с 32-битной версией была решена функция обратного вызова.