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

Windows 8 如何从ref^指针转换为原始指针?,windows-8,microsoft-metro,windows-runtime,c++-cx,Windows 8,Microsoft Metro,Windows Runtime,C++ Cx,在WindowsRT/Metro中,如何将ref^指针转换为原始指针 例如,我希望将指向控件的指针传递给旧的C样式回调,该回调要求参数为void*: //此=从Windows::UI::Xaml::Controls::Page派生的类型 SetCallback(这个) 但是,我得到一个错误: 无法将参数1从“MyProject::MainPage ^const”转换为“void*” 如何将MainPage转换为原始指针(无C-style/reinterpret\u cast)?aT^可以使用re

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

例如,我希望将指向控件的指针传递给旧的C样式回调,该回调要求参数为
void*

//此=从Windows::UI::Xaml::Controls::Page派生的类型
SetCallback(这个)

但是,我得到一个错误:

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


如何将
MainPage
转换为原始指针(无C-style/reinterpret\u cast)?

a
T^
可以使用
reinterpret\u cast
(*)将其转换为相应的指针类型
T*
。最简单、正确的代码是将
T^
转换为
对象^
,然后转换为
IInspectable*

IInspectable* AsInspectable(Platform::Object^ o)
{
    return reinterpret_cast<IInspectable*>(o);
}
IInspectable*AsInspectable(平台::对象^o)
{
返回重新解释(o);
}
IInspectable*
可转换为
void*
,不过您确实需要注意COM生存期规则(我不知道您打算如何处理此
void*
,因此我无法在此提出任何具体建议)

我在文章中详细讨论了帽子,你可能会发现其中一些信息很有用



(*)您要求一种方法来执行此操作,而无需
reinterpret\u cast
,但该限制毫无意义:
reinterpret\u cast
是支持执行此转换的方法。

a
T^
可以使用
reinterpret\u cast
(*)将
T^
转换为相应的指针类型。最简单、正确的代码是将
T^
转换为
对象^
,然后转换为
IInspectable*

IInspectable* AsInspectable(Platform::Object^ o)
{
    return reinterpret_cast<IInspectable*>(o);
}
IInspectable*AsInspectable(平台::对象^o)
{
返回重新解释(o);
}
IInspectable*
可转换为
void*
,不过您确实需要注意COM生存期规则(我不知道您打算如何处理此
void*
,因此我无法在此提出任何具体建议)

我在文章中详细讨论了帽子,你可能会发现其中一些信息很有用



(*)您要求一种无需重新解释的方法,但这种限制毫无意义:
reinterpret\u cast
是执行此转换的受支持方式。

reinterpret\u cast
注释是因为我的印象是,
reinterpret\u cast
仅用于不相关的类型,如果它们是不相关的,你应该在使用它之前三思而后行。我第一次尝试了
static\u cast
,但显然没有成功。谢谢。好的,这很有道理。:-)在这种情况下,
reinterpret\u cast
是正确的答案。请注意,这仅支持
T^
T*
,如果您将
Canvas^
重新解释到
ICanvas*
,您可能会遇到麻烦,您必须首先将/static\u cast
Canvas^
安全地转换到
ICanvas^
,然后,您可以将_cast
ICanvas^
重新解释为
ICanvas*
。另外请注意,
T^
->
T*
也有例外。例如:
Platform::String^
可以重新解释为
HSTRING
Object^
可以重新解释为
IInspectable*
@BobFincheimer:是的,存在复杂性和微妙性,这就是为什么我推荐
Object^
->
IInspectable*
作为通用解决方案的原因(它适用于所有接口和运行时类hats,这在大多数情况下都会处理)请注意,
Canvas^
->
ICanvas*
实际上是正确的,因为
ICanvas
Canvas
的默认界面。
reinterpret\u cast
注释是因为我的印象是,
reinterpret\u cast
只用于不相关的类型,如果它们不相关,你真的应该这样做在使用它之前要三思。我第一次尝试了
static\u cast
,但显然不起作用。谢谢。好的,这很有意义。:-)在这种情况下,
reinterpret\u cast
是正确的答案。请注意,这只支持
t^
t*
,如果你重新解读{code>Canvas^到一个
ICanvas*
,你可能会陷入麻烦,你必须首先将{u cast/static}Canvas^安全解读到
ICanvas^
,然后你可以将{code>ICanvas^重新解读到
ICanvas*
。另外请注意,
T^
->
也有例外。例如:
Platform::String^
可以重新解释为
HSTRING
Object^
可以重新解释为
IInspectable*
@BobFincheimer:是的,存在复杂性和微妙性,这就是为什么我推荐
Object^
->
IInspectable*
作为通用解决方案的原因(它适用于所有接口和运行时类HAT,这在大多数情况下都会处理)。请注意,
Canvas^
->
ICanvas*
实际上是正确的,因为
ICanvas
Canvas
的默认接口。