2013-08-21 33 views
2

我已經寫了一個簡單的控制檯程序來拍攝Canon EOS 600D上的照片。它工作正常,到目前爲止,但我想事件處理程序沒有回調佳能SDK 2.12

  • 得到一個事件時,拍照
  • ,如果它是一個新的形象造成我想獲得它作爲一個文件對象訪問 事件是屬性如文件名

我的事件處理程序得到初始化,但我沒有得到一個事件/回調時,照片拍攝。

我在其他線程中讀到,如果我正在使用Windows 64Bit,但現在幾乎所有的系統都是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; 
} 

謝謝你一些幫助!

最好的問候, 理查德

回答

0

首先,EDSDK並沒有真正在64位模式下工作,所以使用32位。充其量,64位是實驗性的。其次,EDSDK使用傳統的COM STA線程模型,該模型要求您在主線程中運行Windows消息循環。如果你沒有消息循環,你將不會得到任何回調。

+0

好的,謝謝你, 所以我加了一個: 味精味精; 一段時間(的GetMessage(味精,NULL,NULL,NULL)) { 的TranslateMessage(&msg); 在DispatchMessage(&msg); } 到我的主線程,但無論我做什麼,它堅持的循環。我的程序將不會繼續進行。這個消息如何與我的Eds回調函數一起工作?你能舉個簡單的例子嗎?我找不到任何有用的東西。我想讓我的EDSCALLBACK handleObjectEvent函數在我拍照的時候執行。 – RichardR

1

正如Seth的回答所述,您需要一個Windows消息循環才能使Canon SDK工作。如果您未處理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回調,在recieving的DirItemRequestTransfer,將下載的圖像,然後設置bPhotoTaken=true;,這將打破消息循環並退出您的應用程序。

相關問題