Windows 8 如何从ref^指针转换为原始指针?
在WindowsRT/Metro中,如何将ref^指针转换为原始指针 例如,我希望将指向控件的指针传递给旧的C样式回调,该回调要求参数为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
void*
:
//此=从Windows::UI::Xaml::Controls::Page派生的类型
SetCallback(这个)代码>
但是,我得到一个错误:
无法将参数1从“MyProject::MainPage ^const”转换为“void*”
如何将MainPage
转换为原始指针(无C-style/reinterpret\u cast)?aT^
可以使用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
是支持执行此转换的方法。aT^
可以使用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 castCanvas^
安全地转换到ICanvas^
,然后,您可以将_castICanvas^
重新解释为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
的默认接口。