【问题标题】:Native C++ passing IIterable to WinRT本机 C++ 将 IIterable 传递给 WinRT
【发布时间】:2017-01-06 02:58:25
【问题描述】:

我有一个使用 WRL(Windows 运行时模板库)访问 WinRT API 的 Win32 应用。

如何调用从原生 C++ 获取 IIterable 的函数?我的问题是获得实现IIterableIVector 的东西。

作为一个具体的例子,假设我想在 Include\10.0.14393.0\winrt\windows.ui.input.h 中调用SetDefaultMenuItems

namespace ABI {
namespace Windows {
namespace UI {
namespace Input {

    MIDL_INTERFACE("A6B79ECB-6A52-4430-910C-56370A9D6B42")
    IRadialControllerConfiguration : public IInspectable
    {
        public:
            virtual HRESULT STDMETHODCALLTYPE SetDefaultMenuItems( 
            /* [in] */ __RPC__in_opt __FIIterable_1_Windows__CUI__CInput__CRadialControllerSystemMenuItemKind *buttons) = 0;
        // ...
    };
}
}
}
}

对于原生 C++,似乎没有 IIterableIVector 的现有实现。

【问题讨论】:

  • 您可以在std::vector 之上构造VectorView,或任何其他与您的标准C++ 集合类型匹配的适当容器包装器。
  • 我需要创建一个实现IVectorView的运行时组件。然后我应该尝试使用该自定义组件来让 IIterable 传递给 API?
  • 没有IVectorView接口。 VectorView 是一个类模板,它实现了IIterable 接口。您可以立即将指向VectorView 的指针传递给期望IIterable 接口的函数。这听起来真的让你完全迷失了,可能是因为你不了解 COM、C++ 或如何使用 C++ 来实现 COM。然后 WRL 添加了另一个你需要首先掌握的抽象。这不太可能有好的结局。您必须重新开始并熟悉基础知识。
  • 你说得对,我是新人。

标签: c++ winapi windows-runtime wrl


【解决方案1】:

我最终使用cppwinrt 来做我想做的事。有了这个,我能够将 vanilla std 容器等传递给 WinRT。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    • 2015-09-17
    • 1970-01-01
    • 2013-04-07
    相关资源
    最近更新 更多