2013-01-08 91 views
1

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

比如,我想通过传递指针的控制,以一个老C风格的回调,其预计参数是void*

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

但是,我得到一个错误:

cannot convert parameter 1 from 'MyProject::MainPage ^const ' to 'void *'

如何将MainPage转换为原始指针(无C风格/ reinterpret_casts)?

回答

4

A T^可以使用reinterpret_cast(*)转换成其相应的指针类型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是执行此转换的支持方式。

+0

'reinterpret_cast'的评论是因为我的印象是'reinterpret_cast'只用于不相关的类型,如果它们不相关,在使用它之前应该考虑三次。我第一次尝试'static_cast'但显然不起作用。谢谢。 –

+0

好的,这是有道理的。 :-)在这种情况下,'reinterpret_cast'是正确的答案。 –

+0

请注意,这仅仅支持'T ^'到'T *',如果你将'Canvas ^'重新编译为'ICanvas *',你可能会遇到麻烦,你必须先安装safe_cast/static_cast'Canvas ^'到'ICanvas ^',那么你可以把'ICanvas ^'重新解释为'ICanvas *'。 –