如何从ref ^指针转换为原始指针?

时间:2013-01-08 15:14:21

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

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

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

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

然而,我收到错误:

  

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

如何将MainPage转换为原始指针(不带C-style / reinterpret_casts)?

1 个答案:

答案 0 :(得分:4)

可以使用T^ (*)T*转换为其对应的指针类型reinterpret_cast。最简单,最正确的代码是将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是支持的执行此转换的方法。