Tôi đã cố gắng thực hiện công việc này một thời gian ... đọc rất nhiều bài đăng nhưng không ai trong số họ có thể khắc phục vấn đề này.C# Canon SDK: Không gọi lại sau CameraCommand_TakeẢnh
Tôi đang kết nối với EOS 550D bằng Canon SDK. Tôi đang chạy 64bit win7 và Visual Studio C# 2010.
Những gì tôi làm từng bước là:
-> 0 Init SDK
err = EDSDK.EdsInitializeSDK();
-> 1 Lấy danh sách camera
err = EDSDK.EdsGetCameraList(out cameraList);
-> 2 Bắt con đếm
err = EDSDK.EdsGetChildCount(cameraList, out cameraCount);
-> 3 Nếu có một đứa trẻ, có đứa con đầu lòng
err = EDSDK.EdsGetChildAtIndex(cameraList, 0, out cameraDev);
-> 4 khai mạc một phiên
err = EDSDK.EdsOpenSession(cameraDev);
-> 5 Kể sdk để lưu hình ảnh tại địa phương
IntPtr saveTo = (IntPtr)EDSDK.EdsSaveTo.Host;
err = EDSDK.EdsSetPropertyData(cameraDev, EDSDK.PropID_SaveTo, 0, 4, saveTo);
-> 6 Đặt công suất khả dụng trên máy chủ
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 Nhà nước sự kiện Handler
err = EDSDK.EdsSetCameraStateEventHandler(cameraDev, EDSDK.StateEvent_All, stateEventHandler, new IntPtr(0));
-> 8 Registring Object Event Handler
EDSDK.EdsObjectEventHandler edsObjectEventHandler = new EDSDK.EdsObjectEventHandler(objectEventHandler);
err = EDSDK.EdsSetObjectEventHandler(cameraDev, EDSDK.ObjectEvent_All, edsObjectEventHandler, IntPtr.Zero);
....
Tôi không nhận được bất kỳ lỗi khi làm điều này, tất cả dường như là tốt.
Dưới đây là Handler của tôi
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;
}
...
Vì vậy, bây giờ vấn đề của tôi là không ai trong số các handler được bao giờ gọi. Không biết tại sao, tôi searche các fpr ròng khá nhiều thời gian, cố gắng tiếp cận khác nhau nhưng đã không nhận được cuộc gọi lại ...
Dưới đây là phương pháp của tôi gọi lệnh chụp ảnh:
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");
}
}
Có lẽ ai đó có một ý tưởng những gì tôi có thể cố gắng để làm cho công việc này?
Cảm ơn trước!
Trân trọng, Tobias
này đã làm cho tôi; Tôi đã cắm nó trong hai ngày, vì ứng dụng đang chạy phía sau máy chủ web Nancy tự lưu trữ như một dịch vụ topshelf, các đại biểu được viết bằng F # và xếp hàng các yêu cầu máy ảnh trong một 'MailboxProcessor', vì vậy có một triệu biến, hóa ra đây là những gì đã sửa nó. Cụ thể, tôi đã phải gọi 'InitialzeSDK' và' SetCameraAddedHandler' trong một chuỗi * mới * và gọi 'Application.Run()' ở cuối chuỗi. –
bạn có thể vui lòng cung cấp một số ví dụ về mã không? –
Rất tốt để tìm ra Sam! –