9

私はしばらくの間、これを機能させようとしてきました...多くの投稿を読みましたが、どれもこの問題を解決できませんでした。

Canon SDK を使用して EOS 550D に接続しています。win7 64bit と Visual Studio c# 2010 を実行しています。

私が段階的に行うことは次のとおりです。

--> 0 初期化 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 登録状態イベントハンドラ

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

--> 8 登録オブジェクト イベント ハンドラ

 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");

        }
    }

多分誰かが私がこれを機能させるために何ができるか考えていますか?

前もって感謝します!

よろしく、 トバイアス

4

4 に答える 4

1

SDKのC++バージョンを数か月間使用しています。

クイックスキャンの後、コードはすべて正常に見えます。この例のC#ガベージコレクション/スコープについてはわかりませんが、ハンドラーを設定した後もハンドラーが「周り」にあることを確認する必要があります。

また、最後のEdsContextパラメーターには、ゼロポインターの代わりに、含まれているクラスへのポインターを使用します。

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

クラスにイベントハンドラーを含める必要がない場合、これは問題ではない可能性がありますが、アプリのマルチスレッド化に悩まされる可能性があります。EDSDKマニュアルから:

コールバック関数を使用して渡されるアプリケーション情報を指定します。アプリケーションに必要なすべてのデータを渡すことができます。マルチスレッド環境では、コールバック関数はイベント専用のスレッドによって実行されます。このポインタをUIスレッドにデータを渡すように指定する場合のように、適切に使用してください。不要な場合は、NULLポインターを指定してください。

ホワイトバランスの変更/ライブビューへの切り替えなどでトリガーするhandlePropertyEventハンドラーを追加することもできます。

于 2012-12-08T09:11:11.610 に答える
0

オブジェクト イベントをサブスクライブする方法は、実際には何もサブスクライブしません。これが私のやり方で、うまくいきます:

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 があります)。

敬具

于 2014-04-10T13:13:55.697 に答える