事件处理程序Canon SDK 2.12没有回调
No callback from Event Handler Canon SDK 2.12
我写了一个简单的控制台程序,可以在佳能EOS 600D上拍照。到目前为止效果不错,但我想
- 拍照时获取活动
- 如果是导致事件的新图像,我希望将其作为要访问的文件对象它的属性,如文件名
我的事件处理程序已初始化,但在拍照时没有得到事件/回调。
我在其他线程中读到,如果我在Windows 64位上工作,可能会有问题,但现在几乎所有的系统都是64位的。这真的是个问题吗?
这是我迄今为止的代码:
#include "stdafx.h"
#include <EDSDK.h>
#include <EDSDKErrors.h>
#include <EDSDKTypes.h>
#include <string>
#include <iostream>
using namespace std;
EdsError getFirstCamera(EdsCameraRef *camera);
EdsError EDSCALLBACK handleObjectEvent(EdsObjectEvent event, EdsBaseRef object, EdsVoid * context);
string nmea = "$GPRMC,122030.232,A,4317.2345,N,14025.3423,W,12.2,245.1,230711,002.5,E*6F";
int _tmain(int argc, _TCHAR* argv[])
{
EdsError err=EDS_ERR_OK;
EdsCameraRef camera=NULL;
bool isSDKloaded=false;
// Initialize SDK
err=EdsInitializeSDK();
if(err==EDS_ERR_OK)
{
isSDKloaded=true;
}
// Get first camera
if(err==EDS_ERR_OK)
{
err=getFirstCamera(&camera);
}
// Open session with camera
if(err==EDS_ERR_OK)
{
err=EdsOpenSession(camera);
if(err==EDS_ERR_OK)
{
cout << "session started successfully" << endl;
}
else
{
cout << "session failed" << endl;
}
}
EdsInt32 saveTarget = kEdsSaveTo_Camera;
// Set camera properties
if(err==EDS_ERR_OK)
{
err = EdsSetPropertyData( camera, kEdsPropID_SaveTo, 0, 4, &saveTarget );
if(err==EDS_ERR_OK)
{
cout << "camera properties set!" << endl;
}
else
{
cout << "not able to set camera properties" << endl;
}
}
// Set object event handler
if(err==EDS_ERR_OK)
{
err = EdsSetObjectEventHandler(camera, kEdsObjectEvent_All,
handleObjectEvent,
NULL);
if(err==EDS_ERR_OK)
{
cout << "Event handler initialized!" << endl;
}
else
{
cout << "Not able to initialize event handler" << endl;
}
}
// Take picture
if(err==EDS_ERR_OK)
{
err = EdsSendCommand(camera, kEdsCameraCommand_TakePicture, 0);
if(err==EDS_ERR_OK)
{
cout << "Picture successfully taken!" << endl;
}
else
{
cout << "not able to set camera properties" << endl;
}
}
// End session and release SDK
EdsCloseSession(camera);
EdsTerminateSDK();
if(nmea != "")
{
cout << nmea <<endl;
}
else
{
cout << "das kann eigentlich nicht sein!" << endl;
}
system("Pause");
return 0;
}
EdsError getFirstCamera(EdsCameraRef *camera)
{
EdsError err=EDS_ERR_OK;
EdsCameraListRef cameraList=NULL;
EdsUInt32 count=0;
// Get camera list
err = EdsGetCameraList(&cameraList);
// Get number of cameras
if(err == EDS_ERR_OK)
{
err = EdsGetChildCount(cameraList, &count);
if(count == 0)
{
err = EDS_ERR_DEVICE_NOT_FOUND;
}
}
// Get first camera retrieved
if(err == EDS_ERR_OK)
{
err = EdsGetChildAtIndex(cameraList , 0 , camera);
}
// Release camera list
if(cameraList != NULL)
{
EdsRelease(cameraList);
cameraList = NULL;
}
return err;
}
EdsError EDSCALLBACK handleObjectEvent(EdsObjectEvent event, EdsBaseRef object, EdsVoid * context)
{
EdsDirectoryItemInfo objectInfo;
EdsError err=EDS_ERR_OK;
cout << "Event ausgelöst!" << endl;
switch(event)
{
case kEdsObjectEvent_DirItemCreated:
err = EdsGetDirectoryItemInfo(object, &objectInfo);
if(objectInfo.isFolder == 1)
{
cout << "Der Ordner " << objectInfo.szFileName << " wurde erzeugt" << endl;
}
if(objectInfo.isFolder == 0)
{
cout << "Die Datei " << objectInfo.szFileName << " wurde erzeugt" << endl;
}
break;
default:
cout << "Prüfe den EventHandler!" << endl;
break;
}
//Release object
if(object)
{
EdsRelease(object);
}
return err;
}
谢谢你的帮助!
谨致问候,Richard
正如Seth的回答中所说,Canon SDK需要一个Windows消息循环才能工作。如果您不处理Windows消息,则不会调用回调。
根据您的代码,您可能想要执行类似于以下伪代码的操作:
bool bPhotoTaken = false;
main()
{
// Initialize EDSDK, start session with camera, change SaveTo property
// register ObjectEventHandler
// send kEdsCameraCommand_TakePicture
while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
{
if(bRet == -1 || bPhotoTaken)
{
break;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
// Cleanup EDSDK
}
并且您的ObjectEventHandler回调在收到DirItemRequestTransfer后,将下载映像,然后设置bPhotoTaken=true;
,这将打破消息循环并退出应用程序。
如果使用版本为13.13.0的sdk,则可以调用EdsGetEvent()
从相机获取事件。
3.1.50 EdsGetEvent
Description
This function acquires an event from camera.
In console application, please call this function regularly to acquire the event from a camera.
Syntax
EdsError EdsGetEvent()
首先,EDSDK并不能真正在64位模式下工作,所以使用32位。64位充其量是实验性的。
其次,EDSDK使用传统的COMSTA线程模型,这需要在主线程中运行Windows消息循环。如果没有消息循环,就不会得到任何回调。
相关文章:
- 如何使用从处理程序调度的最终回调将响应异步返回给调用方on_read?
- 调用 java 的回调() 时应用程序崩溃.由于 detatchThread 而获得运行时错误
- 通过实用程序 fn 将捕获的 lambda 传递给 C 样式回调 - 错误
- 如何将从控制台应用程序C++回调设置为C++ COM DLL
- 与Qt同时运行后台循环或回调C++应用程序?
- 安全回调提供程序(SFINAE,std::正向和过载解析)
- lambda回调中Android Cocos2D-X应用程序上的SEG故障
- 如何在 android 中将C++回调作为按钮的点击处理程序传递
- boost::asio::async_read 不会回调我的处理程序函数
- 无法使用挂钩程序获得Windows Focus更改的回调
- 多个回调处理程序
- C++:使用回调函数作为事件通知程序
- 是否可以调用 WriteFile,应用程序将永远等待回调
- 当通知程序/信号超出范围时,在提升绑定中解除分配回调侦听器对象
- Qt 应用程序在从 <QUrl>NetworkAccessManager->get() 回调访问 QList<QLlnkedList* >时冻结
- 事件处理程序Canon SDK 2.12没有回调
- QT中的程序终止回调
- 在Delphi应用程序中使用c++ DLL回调函数
- 从c++ COM DLL回调到c#应用程序
- 如何正确地从c++引擎返回回调到obj-c程序