簡體   English   中英

c#Canon SDK:CameraCommand_TakePicture之后沒有回調

[英]c# Canon SDK: No callback after CameraCommand_TakePicture

我一直試圖讓這項工作有一段時間了......閱讀了很多帖子,但沒有一個能解決這個問題。

我使用Canon SDK連接到EOS 550D。 我正在運行win7 64bit和Visual Studio c#2010。

我一步一步做的是:

- > 0 Init SDK

 err = EDSDK.EdsInitializeSDK();

- > 1獲取相機列表

 err = EDSDK.EdsGetCameraList(out cameraList);

- > 2讓孩子數

 err = EDSDK.EdsGetChildCount(cameraList, out cameraCount);

- > 3如果有孩子,請先生孩子

  err = EDSDK.EdsGetChildAtIndex(cameraList, 0, out cameraDev);

- > 4開會

err = EDSDK.EdsOpenSession(cameraDev);

- > 5告訴sdk在本地保存圖像

IntPtr saveTo = (IntPtr)EDSDK.EdsSaveTo.Host;
err = EDSDK.EdsSetPropertyData(cameraDev, EDSDK.PropID_SaveTo, 0, 4, saveTo);

- > 6設置主機上的可用容量

 EDSDK.EdsCapacity capacity = new EDSDK.EdsCapacity();

 if (err == EDSDK.EDS_ERR_OK)
 {
     capacity.NumberOfFreeClusters = 0x7FFFFFFF;
     capacity.BytesPerSector = 0x1000;
     capacity.Reset = 1;
     err = EDSDK.EdsSetCapacity(cameraDev, capacity);
 }

- > 7 Registring State事件處理程序

err = EDSDK.EdsSetCameraStateEventHandler(cameraDev, EDSDK.StateEvent_All, stateEventHandler,   new IntPtr(0));

- > 8 Registring對象事件處理程序

 EDSDK.EdsObjectEventHandler edsObjectEventHandler = new EDSDK.EdsObjectEventHandler(objectEventHandler);
               err = EDSDK.EdsSetObjectEventHandler(cameraDev, EDSDK.ObjectEvent_All, edsObjectEventHandler, IntPtr.Zero);

....

這樣做時我沒有收到任何錯誤,一切似乎都很好。

這是我的處理程序

 private uint objectEventHandler(uint inEvent, IntPtr inRef, IntPtr inContext)
    {
        Console.WriteLine("HALLLOOOOOOOOOO");
        switch (inEvent)
        {
            case EDSDK.ObjectEvent_DirItemCreated:
                //this.invokeNewItemCreatedEvent(new NewItemCreatedEventArgs(getCapturedItem(inRef)));
                Console.WriteLine("Directory Item Created");
                break;
            case EDSDK.ObjectEvent_DirItemRequestTransfer:
                Console.WriteLine("Directory Item Requested Transfer");
                break;
            default:
                Console.WriteLine(String.Format("ObjectEventHandler: event {0}, ref {1}", inEvent.ToString("X"), inRef.ToString()));
                break;
        }

        return 0x0;
    }








    public uint stateEventHandler(uint inEvent, uint inParameter, IntPtr inContext)
    {
        Console.WriteLine("stateEventHandler " + inEvent);
        switch (inEvent)
        {
            case EDSDK.StateEvent_JobStatusChanged:
                Console.WriteLine(String.Format("There are objects waiting to be transferred.  Job status {0}", inParameter));
                break;

            case EDSDK.StateEvent_ShutDownTimerUpdate:
                if (inParameter != 0)
                    Console.WriteLine(String.Format("shutdown timer update: {0}", inParameter));
                break;

            case EDSDK.ObjectEvent_DirItemRequestTransfer:
                //WHAT I NEED!!!
                Console.WriteLine("Hallo DirItemRequestTransfer");
                //DownloadImage(obj);
                break;


            default:
                Console.WriteLine(String.Format("StateEventHandler: event {0}, parameter {1}", inEvent, inParameter));
                break;
        }
        return 0;
    }

...

所以現在我的問題是沒有調用任何處理程序。 不知道為什么,我搜索網絡fpr相當一段時間,嘗試了不同的方法,但沒有得到回調...

這是調用拍照命令的方法:

 public void takePic()
    {
        if (cameraOpened)
        {
           Console.WriteLine( "taking a shot");

            err = EDSDK.EdsSendCommand(cameraDev, EDSDK.CameraCommand_TakePicture, 0);
            if (err != EDSDK.EDS_ERR_OK)
                Console.WriteLine("TakeCommand Error: " + err.ToString());

            Console.WriteLine("Finished taking a shot");

        }
    }

也許有人知道我可以嘗試使這項工作?

提前致謝!

最好的問候,托比亞斯

我知道SDK文檔說回調函數將在另一個線程中執行,但對我來說,在Windows下使用SDK 2.11,回調總是發生在主線程上,似乎是通過Windows消息發送的。 這意味着如果您沒有消息泵,則無法獲得回調。 如果你的應用程序是一個C#GUI應用程序,你應該有一個消息泵,但如果它是一個控制台應用程序你可能沒有,所以嘗試在發送TakePicture命令后手動泵送消息。 您可以使用Application.Run但是您需要在某處調用Application.Exit,否則您的消息循環將永遠不會退出(例如,您可以在從相機下載圖片后調用它)。

我正在使用SDK的C ++版本幾個月了。

快速掃描后,代碼中的一切似乎都很好。 我不確定這個例子中的C#垃圾收集/范圍,但是你想確保你的處理程序在你設置之后仍然“在”周圍。

另外,對於最終的EdsContext參數,我使用指向包含類而不是零指針的指針。

err = EDSDK.EdsSetObjectEventHandler(cameraDev, EDSDK.ObjectEvent_All, edsObjectEventHandler, IntPtr.Zero);

如果您不需要在類中包含事件處理程序,這可能不是問題,但您的應用程序中的多線程可能會讓您感到困惑。 從EDSDK手冊:

通過回調函數指定要傳遞的應用程序信息。 您的應用程序所需的任何數據都可以傳遞。 多線程環境中,回調函數由專用於該事件的線程執行 正確使用它,就像指定this指針將數據傳遞給UI線程一樣。 如果不需要,則指定NULL指針。

您還可以嘗試添加一個handlePropertyEvent處理程序,該處理程序應該觸發白平衡的變化/切換到實時視圖等。

我使用Canon SDK連接到EOS 550D。 我正在運行win7 64bit和Visual Studio c#2010。

你的問題是:Canon SDK是為X86編譯的。 別再看了! 您必須更改目標體系結構。

訂閱對象事件的方式並不真正訂閱任何內容。 我就是這樣做的,它運行正常:

event EDSDK.EdsObjectEventHandler SDKObjectEvent;

void Init(IntPtr cameraDev)
{
    SDKObjectEvent += new EDSDK.EdsObjectEventHandler(objectEventHandler);
    EDSDK.EdsSetObjectEventHandler(cameraDev, EDSDK.ObjectEvent_All, SDKObjectEvent, IntPtr.Zero);
}

EdsStateEventHandler,EdsPropertyEventHandler和EdsCameraAddedHandler的原理相同(有點不同但仍然帶有事件EdsProgressCallback)

親切的問候

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM