Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ EDSDK消息循环在Windows 8.1下不工作_C++_Windows 8.1_Edsdk_Canon Sdk - Fatal编程技术网

C++ EDSDK消息循环在Windows 8.1下不工作

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 -

我使用的是佳能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;这是一个指向一个类的指针,我用它来完成我的佳能相机的所有工作。下面是我的对象事件处理程序函数:

    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