【发布时间】:2015-11-20 20:28:30
【问题描述】:
我使用的是佳能 EDSDK_64 v2.15。我能够在 Windows7 下使用简单的消息循环接收佳能 SDK 发送的事件。例如当我想拍照并等待我使用的图像数据时:
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 是一个指向我用来完成佳能相机所有工作的类的指针。这是我的对象事件处理函数:
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 编译器。我的相机是佳能 EOS 60D。我的应用正在使用 MFC 库。
有人可以指出我做错了什么或提供如何解决此问题的解决方案吗?
【问题讨论】:
-
为什么要循环一个事件?我对事件的理解是你不必循环。但是无论如何,您是否也尝试使用 32 位版本? 64 位版本目前是测试版。如果必须循环。您是否尝试延长睡眠时间以进行测试?
-
@JohannesB 通常我不必这样做,但 EDSKD 以这种方式工作(至少在 Windows 平台上) - 堆栈上有很多关于此的问题。我知道 64 位是测试版,但出于根本原因,我不能使用 32 位版本。我尝试将睡眠时间延长至 200 毫秒,但没有任何效果。
-
你确定吗?我使用 EDSDK 事件完全正常(尽管我使用 C#)。只有在控制台应用程序中,您必须使用 EdsGetEvent 方法来触发事件。通过一个工作示例查看我的教程:codeproject.com/Articles/688276/Canon-EDSDK-Tutorial-in-Csharp
-
在我认为你是对的之后 - 我应该能够通过我的程序主消息循环接收 EDSDK 消息。但这也应该发生在这个本地消息循环中。我还记得一些最初对我来说很奇怪但现在它们有意义的情况:我在使用 Win8 的计算机上运行我的应用程序 - 拍照 - 没有调用回调 - 我将计算机切换到使用 Win7 的计算机(不要关闭相机!) - 我运行我的应用程序 - 注册 EDSDK 对象回调并进入空闲状态后的第一件事 - 调用正确的回调(!!!)。所以设置了一个事件,但我无法收到它......
-
所以你是说来自win8应用程序的事件被存储,直到你在win7机器上注册,然后在你不做任何其他事情的情况下被触发?那真的很奇怪。您是否尝试将问题简化到最低限度?你能在不同的应用程序上重现这个问题吗?我会试试,但我没有win8
标签: c++ windows-8.1 edsdk canon-sdk