【问题标题】:How to convert System::IntPtr to char*如何将 System::IntPtr 转换为 char*
【发布时间】:2010-10-23 01:26:53
【问题描述】:

任何人都可以告诉如何在托管 c++ 中将 System::IntPtr 转换为 char* 这是我的主要功能

int main(void) 
{
    String* strMessage = "Hello world";

    CManagedClass* pCManagedClass = new CManagedClass();//working
    pCManagedClass->ShowMessage(strMessage);//working


****above said error here***    
       char* szMessage = (char*)Marshal::StringToHGlobalAnsi(strMessage);
    CUnmanagedClass cUnmanagedClass; cUnmanagedClass.ShowMessageBox(szMessage);
    Marshal::FreeHGlobal((int)szMessage);

    return 0;
}

提前致谢

【问题讨论】:

    标签: c++-cli


    【解决方案1】:

    我不是一个庞大的 C++/CLI 程序员,但以下应该可以正常工作。

    IntPtr p = GetTheIntPtr();
    char* pChar = reinterpret_cast<char*>(p.ToPointer());
    

    IntPtr 类有一个名为 ToPointer 的方法,它以void* 类型返回地址。这将在 C++/CLI 中转换为char*

    编辑

    验证这在 VS2008 和 VS2015 上有效

    【讨论】:

      【解决方案2】:

      注意!

      我想在 JaredPar 答案中添加一些内容。我不知道您的 IntPtr 来自哪里,但您还应该使用 pin_ptr 以防止垃圾收集器弄乱您的内存。我过去做过很多 CLR/Native 互操作,使用 pin_ptr 是我通过艰苦的方式学会做的事情之一。

      阅读以下内容: click me

      【讨论】:

      • Marshal::StringToHGlobalAnsi的返回值在非托管内存中,不需要固定。
      【解决方案3】:

      代替

      char* szMessage = (char*)Marshal::StringToHGlobalAnsi(strMessage).ToPointer();
      Marshal::FreeHGlobal((int)szMessage);
      

      使用

      marshal_context conversions.
      const char* szMessage = conversions.marshal_as<const char*>(strMessage);
      

      它会自行清理,C++ RAII 的魔力。

      【讨论】:

      • 仅供参考,第二个代码块中有错字(没有足够的代表来更改)。 marshal_context conversions. 应该是 marshal_context conversions;
      猜你喜欢
      • 2011-01-16
      • 2015-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多