我正在开发一个UWP应用程序,该应用程序使用Javascript作为UI和逻辑代码,在C ++中有一些扩展。 一个扩展是WebP解码器。
目标是将IAsyncOperation中的WebP图像从C ++ / Native代码直接解码为ImageData的数据缓冲区。 我相信我对一个类型为WriteOnlyArray的对象的lambda捕获有一些问题。
C ++部分:
Windows::Foundation::IAsyncOperation<bool>^
WebPDecoder::DecodeRgbaAsyncInto(const Platform::Array<byte>^ input, Platform::WriteOnlyArray<uint8>^ output, int stride) {
return create_async([input, output, stride]() -> bool {
auto data = WebPDecodeRGBAInto(input->Data, input->Length, output->Data, output->Length, stride);
if (data == nullptr) {
return false;
}
return true;
});
}
Javascript部分:
// _this.decoder = Universal.WebP.WebPDecoder();
//
function decode(data, height, width, canvas) {
return new Promise(function (resolve, reject) {
canvas.height = height;
canvas.width = width;
var context = canvas.getContext('2d');
var imageData = context.createImageData(width, height);
var stride = imageData.data.length / height;
_this.decoder.decodeRgbaAsyncInto(data, imageData.data, stride).then(function (success) {
if (success == false) {
reject(Error("Failed to decode WebP Image"));
return;
}
context.putImageData(imageData, 0, 0);
context.drawImage(canvas, 0, 0);
resolve();
});
});
}
使用此代码,我在调用lambda函数并被销毁后崩溃。崩溃发生在__abi_winrt_ptr_dtor()中。 我不知道为什么。
如果我改为使用WriteOnlyArray的引用捕获,如下所示,解码在大多数时间都有效,但偶尔会出现崩溃,因为输出似乎变为无效指针。
return create_async([input, &output, stride]() -> bool {
对于这种情况,我怀疑这是因为lambda捕获不会增加WriteOnlArray对象的引用计数,而是在lambda执行之前/期间释放它。
如何在lambda完成之前强制对象可用?