【问题标题】:EDSDK message loop not working under Windows 8.1EDSDK 消息循环在 Windows 8.1 下不起作用
【发布时间】: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;
    }

其中xCanonEOSEdsCameraRefthis 是一个指向我用来完成佳能相机所有工作的类的指针。这是我的对象事件处理函数:

    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


【解决方案1】:

我遇到了同样的问题,32位版本解决了回调函数。

【讨论】:

    猜你喜欢
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 2011-07-06
    相关资源
    最近更新 更多