如何将System :: IntPtr转换为char *

时间:2009-05-01 06:02:44

标签: c++-cli

任何正文都可以告诉如何在托管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;
}

提前致谢

3 个答案:

答案 0 :(得分:8)

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

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

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

编辑

已验证这适用于VS2008和VS2015

答案 1 :(得分:1)

而不是

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的神奇之处。

答案 2 :(得分:0)

<强>注意!

我想在JaredPar中添加一些答案。我不知道你的IntPtr来自哪里,但你也应该使用pin_ptr来防止垃圾收集器弄乱你的内存。我过去做了很多CLR / Native inter op,并且使用pin_ptr是我学会了很难做的事情之一。

阅读以下内容: click me