I have been trying to make this work for some time ... I read a lot of messages, but none of them could fix this problem.
I am connecting to the EOS 550D using the Canon SDK. I am running win7 64bit and Visual Studio C # 2010.
What I do step by step:
-> 0 Init SDK
err = EDSDK.EdsInitializeSDK();
-> 1 Get a list of cameras
err = EDSDK.EdsGetCameraList(out cameraList);
-> 2 Getting the number of children
err = EDSDK.EdsGetChildCount(cameraList, out cameraCount);
-> 3 If there is a child, take the first child
err = EDSDK.EdsGetChildAtIndex(cameraList, 0, out cameraDev);
-> 4 Opening a session
err = EDSDK.EdsOpenSession(cameraDev);
-> 5 Specifying sdk to save images locally
IntPtr saveTo = (IntPtr)EDSDK.EdsSaveTo.Host; err = EDSDK.EdsSetPropertyData(cameraDev, EDSDK.PropID_SaveTo, 0, 4, saveTo);
-> 6 Setting the available capacity on the host machine
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 Processing the registration status recorder
err = EDSDK.EdsSetCameraStateEventHandler(cameraDev, EDSDK.StateEvent_All, stateEventHandler, new IntPtr(0));
-> 8 Register an object's event handler
EDSDK.EdsObjectEventHandler edsObjectEventHandler = new EDSDK.EdsObjectEventHandler(objectEventHandler); err = EDSDK.EdsSetObjectEventHandler(cameraDev, EDSDK.ObjectEvent_All, edsObjectEventHandler, IntPtr.Zero);
....
I get no errors when doing this, everything seems to be all right.
Here is my handler
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; }
...
So now my problem is that none of the handlers are ever called. I donβt know why, I searched for pure fpr for a long time, tried different approaches, but did not receive a callback ...
Here is my method invoking the take picture command:
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"); } }
Perhaps someone has an idea that I could try to make this work?
Thanks in advance!
Regards, Tobias