【问题标题】:How to convert from ref ^ pointer to raw pointer?如何从 ref ^ 指针转换为原始指针?
【发布时间】:2013-01-08 15:14:21
【问题描述】:

在 WindowsRT / Metro 中,如何将 ref ^ 指针转换为原始指针?

例如,我想将一个指向控件的指针传递给一个旧的 C 风格回调,它期望参数是 void*

// this = type derived from Windows::UI::Xaml::Controls::Page
SetCallback(this);

但是,我得到一个错误:

无法将参数 1 从 'MyProject::MainPage ^const' 转换为 'void *'

如何将MainPage 转换为原始指针(没有 C 样式/reinterpret_casts)?

【问题讨论】:

    标签: windows-8 microsoft-metro windows-runtime c++-cx


    【解决方案1】:

    可以使用reinterpret_cast(*)T^ 转换为其对应的指针类型T*。最简单、正确的代码是将T^ 转换为Object^,然后转换为IInspectable*

    IInspectable* AsInspectable(Platform::Object^ o)
    {
        return reinterpret_cast<IInspectable*>(o);
    }
    

    IInspectable* 可转换为void*,尽管您确实需要注意 COM 生命周期规则(我不知道您打算如何处理此 void*,所以我无法提出任何具体建议在这里)。

    我在我的文章 "Types That Wear Hats." 中详细讨论了这顶帽子,您可能会发现其中一些信息很有帮助。


    (*) 您要求在没有reinterpret_cast 的情况下执行此操作,但该限制没有意义:reinterpret_cast 是执行此转换的受支持方式。

    【讨论】:

    • reinterpret_cast 评论是因为我的印象是reinterpret_cast 只用于无关类型,如果它们不相关,你应该在使用之前三思而后行。我首先尝试了static_cast,但显然没有用。谢谢。
    • 好吧,这很有道理。 :-) 在这种情况下,reinterpret_cast 是正确答案。
    • 另请注意,这仅支持T^T*,如果你将Canvas^ 重新解释为ICanvas*,你可能会遇到麻烦,你必须先safe_cast/static_cast @ 987654342@ to ICanvas^,然后你可以重新解释ICanvas^ to ICanvas*
    • 另请注意,T^ -> T* 也有例外。例如:Platform::String^ 可以重新解释为HSTRINGObject^ 可以重新解释为IInspectable*
    • @BobFincheimer:是的,有复杂性和微妙性,这就是为什么我推荐Object^ -> IInspectable* 用于通用解决方案(它适用于所有接口和运行时类帽子,它是大多数情况下正在处理的问题)。注意Canvas^ -> ICanvas*实际上是正确的,因为ICanvasCanvas的默认接口。
    猜你喜欢
    • 2014-01-01
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 2019-09-21
    • 2020-05-19
    • 2021-09-20
    • 2016-08-01
    相关资源
    最近更新 更多