如何将 IntPtr 转换为本机 C++ 对象

Posted

技术标签:

【中文标题】如何将 IntPtr 转换为本机 C++ 对象【英文标题】:How to Convert IntPtr to native c++ object 【发布时间】:2010-11-25 13:42:02 【问题描述】:

我有在 C++/Cli 中使用的 COM dll,此 COM dll 中的方法之一返回 IntPtr 我想将其转换回本机对象指针。我怎么能做到这一点?请输入

【问题讨论】:

您需要提供COM方法和“本机对象”的声明。 【参考方案1】:

IntPtr 是整数类型,需要先转换成指针类型:

  IntPtr somePtr;
  ...
  Mumble* fooPtr = (Mumble*)(void*)somePtr;

或者更易读的版本:

  Mumble* fooPtr = (Mumble*)somePtr.ToPointer();

方法调用将在运行时被优化掉。

【讨论】:

【参考方案2】:

IntPtr 有一个ToPointer 方法,它返回一个void*。调用此方法,然后使用reintepret_cast 将此指针强制转换为正确的原生类型。

【讨论】:

我认为在这种情况下使用static_cast 应该没问题。我知道没有充分的理由 reintepret_cast 指向另一个指针类型的 void 指针。【参考方案3】:

我想修改Hans Passant's answer,IntPtr直接返回void指针..你可以很容易地转换成任何类型的原生C++指针。

IntPtr somePtr;
Mumble* fooPtr = (Mumble*)somePtr.ToPointer();

这里.ToPointer() 将返回 void 指针,现在您可以转换为您的自定义指针类型。

【讨论】:

以上是关于如何将 IntPtr 转换为本机 C++ 对象的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 IntPtr 将 c++ 数组编组为 c#

Unity c#intptr到没有大小信息的字节数组[重复]

如何将 intptr_t 转换为字符串 [重复]

将 IntPtr 转换为对象 C#

如何将 cli::array 从本机代码转换为本机数组?

如何将 C++ 本机对象编组到托管 C++ CLI