C++ EDSDK消息循环在Windows 8.1下不工作
我使用的是佳能EDSDK_64 v2.15。我能够在Windows7下使用简单的消息循环接收佳能SDK发送的事件。例如,当我想拍照并等待图像数据时,我使用:C++ EDSDK消息循环在Windows 8.1下不工作,c++,windows-8.1,edsdk,canon-sdk,C++,Windows 8.1,Edsdk,Canon Sdk,我使用的是佳能EDSDK_64 v2.15。我能够在Windows7下使用简单的消息循环接收佳能SDK发送的事件。例如,当我想拍照并等待图像数据时,我使用: xCanonError = EdsSendCommand(xCanonEOS, kEdsCameraCommand_TakePicture, 0); if(xCanonError != EDS_ERR_OK) { AddLogText(L"sending command TakePicture - error -
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;这是一个指向一个类的指针,我用它来完成我的佳能相机的所有工作。下面是我的对象事件处理程序函数:
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;
}
我的问题是,同样的代码在Windows8.1下不起作用。程序只是进入while循环,注册的回调函数永远不会被调用
我正在使用VS2013 x64编译器。我的相机是佳能EOS 60D。我的应用程序正在使用MFC库
有人能指出我做错了什么,或者提供解决方案来解决这个问题吗?我也有同样的问题,用32位版本解决了回调函数。我也有同样的问题,用32位版本解决了回调函数。为什么要循环一个事件?我对事件的理解是,你不必循环。但不管怎样,你也尝试过使用32位版本吗?64位版本目前是测试版。如果你必须循环。为了测试的目的,你试过延长睡眠时间吗?@JohannesB通常我不必这样做,但EDSKD至少在Windows平台上是这样工作的——关于这一点,堆栈上有很多问题。我知道64位是测试版,但出于基本原因,我不能使用32位版本。我试着把睡眠时间延长到200毫秒,但没有效果。你确定吗?虽然我使用C语言,但我使用EDSDK事件是完全正常的。仅在控制台应用程序中,您必须使用EdsGetEvent方法来触发事件。用一个工作示例看看我的教程:在我认为你是对的之后,我应该能够通过我的程序主消息循环接收EDSDK消息。但这也应该发生在本地消息循环中。我还记得一些最初对我来说很奇怪的情况,但现在它们有了意义:我用Win8在计算机上运行我的应用程序-拍照-不调用回调-我用Win7将计算机切换到一台计算机-不要关闭摄像头我运行我的应用程序-注册EDSDK对象回调并进入空闲状态后的第一件事-调用正确的回调!!!。所以设置了一个事件,但我无法接收它…那么你是说win8应用程序中的事件会一直存储到你在win7机器上注册,然后在你不做任何其他操作的情况下被触发?那太奇怪了。你有没有试着把问题降到最低限度?你能在不同的应用程序上重现这个问题吗?我想试试,但我没有Win8为什么要循环一个事件?我对事件的理解是,你不必循环。但不管怎样,你也尝试过使用32位版本吗?64位版本目前是测试版。如果你必须循环。为了测试的目的,你试过延长睡眠时间吗?@JohannesB通常我不必这样做,但EDSKD至少在Windows平台上是这样工作的——关于这一点,堆栈上有很多问题。我知道64位是测试版,但出于基本原因,我不能使用32位版本。我试着把睡眠时间延长到200毫秒,但没有效果。你确定吗?虽然我使用C语言,但我使用EDSDK事件是完全正常的。仅在控制台应用程序中,您必须使用EdsGetEvent方法来触发事件。用一个工作示例看看我的教程:在我认为你是对的之后,我应该能够通过我的程序主消息循环接收EDSDK消息。但这也应该发生在本地消息循环中。我还记得一些最初对我来说很奇怪的情况,但现在它们有了意义:我用Win8在计算机上运行我的应用程序-拍照-不调用回调-我用Win7将计算机切换到一台计算机-不要关闭摄像头我运行我的应用程序-注册EDSDK对象回调并进入空闲状态后的第一件事-调用正确的回调!!!。所以设置了一个事件,但我无法接收它…那么你是说win8应用程序中的事件会一直存储到你在win7机器上注册,然后在你不做任何其他操作的情况下被触发?那太奇怪了。你有没有试着把问题降到最低限度?你能在不同的应用程序上重现这个问题吗?我想试试,但我没有win8