相当于C ++ / WinRT中的Platform :: IBoxArray

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了相当于C ++ / WinRT中的Platform :: IBoxArray相关的知识,希望对你有一定的参考价值。

我目前正在将一个UWP应用程序从C ++ / CX移植到C ++ / WinRT。我遇到了safe_cast<Platform::IBoxArray<byte>^>(data),其中dataWindows::Foundation::IInspectable ^类型。

我知道safe_castas<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-2017IBoxArrayWindows::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的主要内容,如果未能解决你的问题,请参考以下文章

linux platform i2c 驱动理解

尝试从 WinJS 读取 C# WinRT 组件中的空字符串时出现异常

如何在“native c ++”环境中使用WinRT IAsyncOperation *对象

带有WinRT C ++构建问题的Qt

C++/CX 能否简化我的(非 WinRT)WPF 应用程序?

WinRT,C#,画布和子级惯性滚动