相当于C ++ / WinRT中的Platform :: IBoxArray
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了相当于C ++ / WinRT中的Platform :: IBoxArray相关的知识,希望对你有一定的参考价值。
我目前正在将一个UWP应用程序从C ++ / CX移植到C ++ / WinRT。我遇到了safe_cast<Platform::IBoxArray<byte>^>(data)
,其中data
是Windows::Foundation::IInspectable ^
类型。
我知道safe_cast
用as<T>
方法表示,我知道在WinRT / C ++中有装箱(winrt::box_value
)和拆箱(winrt::unbox_value
)的功能。
但是,为了执行强制转换(QueryInterface),我需要知道Platform::IBoxArray
的等价物。根据https://docs.microsoft.com/de-de/cpp/cppcx/platform-iboxarray-interface?view=vs-2017,IBoxArray
是Windows::Foundation::IReferenceArray
的C ++ / CX等价物,但是没有winrt::Windows::Foundation::IReferenceArray
......
更新nackground:我想要实现的是将HoloLens附加的视图转换检索到其相机中的每个Media Foundation示例。我的代码基于https://github.com/Microsoft/HoloLensForCV,除了最后一步之外我真的做了一切。问题出在这段代码周围:
static const GUID MF_EXTENSION_VIEW_TRANSFORM = {
0x4e251fa4, 0x830f, 0x4770, 0x85, 0x9a, 0x4b, 0x8d, 0x99, 0xaa, 0x80, 0x9b
};
// ...
// In the event handler, which receives const winrt::Windows::Media::Capture::Frames::MediaFrameReader& sender:
auto frame = sender.TryAcquireLatestFrame();
// ...
if (frame.Properties().HasKey(MF_EXTENSION_VIEW_TRANSFORM)) {
auto /* IInspectable */ userData = frame.Properties().Lookup(MF_EXTENSION_VIEW_TRANSFORM);
// Now I would have to do the following:
// auto userBytes = safe_cast<Platform::IBoxArray<Byte> ^>(userData)->Value;
//viewTransform = *reinterpret_cast<float4x4 *>(userBytes.Data);
}
我无法相信实际工作,但使用来自https://docs.microsoft.com/de-de/windows/uwp/cpp-and-winrt-apis/interop-winrt-cx的信息,我提出了以下解决方案:
通过/ ZW启用“消耗Windows运行时扩展”并使用以下转换:
auto abi = reinterpret_cast<Platform::Object ^>(winrt::get_abi(userData));
auto userBytes = safe_cast<Platform::IBoxArray<byte> ^>(abi)->Value;
viewTransform = *reinterpret_cast<float4x4 *>(userBytes->Data);
不幸的是,该解决方案具有产生的缺点
警告C4447:没有线程模型发现'主'签名。考虑使用'int main(Platform :: Array ^ args)'。
但就目前而言,我可以忍受它......
我还在努力将一些代码从HoloLensForCV移植到C ++ / WinRT。我想出了一个非常类似的案例的以下解决方案(但不是你问的完全相同的代码行):
auto user_data = source.Info().Properties().Lookup(c_MF_MT_USER_DATA); // type documented as 'array of bytes'
auto source_name = user_data.as<Windows::Foundation::IReferenceArray<std::uint8_t>>(); // Trial and error to get the right specialization of IReferenceArray
winrt::com_array<std::uint8_t> arr;
source_name.GetUInt8Array(arr);
winrt::hstring source_name_str{ reinterpret_cast<wchar_t*>(arr.data()) };
具体来说,你可以用safe_cast
替换.as<Windows::Foundation::IReferenceArray<std::uint8_t>
作为盒装字节数组。然后,我怀疑与我做同样的演员(除了浮动4x4 *而不是wchar_t *)将适合你。
上面的示例不需要/ ZW标志。
以上是关于相当于C ++ / WinRT中的Platform :: IBoxArray的主要内容,如果未能解决你的问题,请参考以下文章
尝试从 WinJS 读取 C# WinRT 组件中的空字符串时出现异常
如何在“native c ++”环境中使用WinRT IAsyncOperation *对象