Я новичок в WinRT C ++. Я пытаюсь передать образ StorageFile из C # и открыть файл и установить его в качестве источника в BitmapImage в WinRT для извлечения высоты и ширины изображения. Я использую следующий код.
auto openOperation = StorageImageFile->OpenAsync(FileAccessMode::Read); // from http://msdn.microsoft.com/en-us/library/windows/desktop/hh780393%28v=vs.85%29.aspx
openOperation->Completed = ref new
AsyncOperationCompletedHandler<IRandomAccessStream^>(
[=](IAsyncOperation<IRandomAccessStream^> ^operation, AsyncStatus status)
{
auto Imagestream = operation->GetResults();
BitmapImage^ bmp = ref new BitmapImage();
auto bmpOp = bmp->SetSourceAsync(Imagestream);
bmpOp->Completed = ref new
AsyncActionCompletedHandler (
[=](IAsyncAction^ action, AsyncStatus status)
{
action->GetResults();
UINT32 imageWidth = (UINT32)bmp->PixelWidth;
UINT32 imageHeight = (UINT32)bmp->PixelHeight;
});
});
Этот код, похоже, не работает. после строки BitmapImage ^ bmp = ref new BitmapImage (); отладчик перестает говорить, что исходный код не найден.
Можете ли вы помочь мне написать правильный код?
Я думаю, что ты хотел написать openOperation->Completed
+=
ref new...
а также bmpOp->Completed
+=
ref new...
, Я не эксперт в C ++, но из того, что я видел, асинхронные операции обычно заключаются в create_task
звонки. Не совсем уверен, почему — может быть, чтобы избежать подписки на события без отписки?
Я думаю, это должно выглядеть примерно так:
auto bmp = ref new BitmapImage();
create_task(storageImageFile->OpenAsync(FileAccessMode::Read)) // get the stream
.then([bmp](IRandomAccessStream^ ^stream) // continuation lambda
{
return create_task(bmp->SetSourceAsync(stream)); // needs to run on ASTA/Dispatcher thread
}, task_continuation_context::use_current()) // run on ASTA/Dispatcher thread
.then([bmp]() // continuation lambda
{
UINT32 imageWidth = (UINT32)bmp->PixelWidth; // needs to run on ASTA/Dispatcher thread
UINT32 imageHeight = (UINT32)bmp->PixelHeight; // needs to run on ASTA/Dispatcher thread
// TODO: use imageWidth and imageHeight
}, task_continuation_context::use_current()); // run on ASTA/Dispatcher thread