2009-05-01 113 views
0

任何机构可以告诉如何系统:: IntPtr的转换为char *在托管C++ 这是我的主要功能提前如何系统:: 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; 
} 

感谢

+0

感谢 对于您的信息 – Cute 2009-05-14 09:33:27

回答

6

我不是一个庞大的C++/CLI程序员,但下面的工作应该很好。

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

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

编辑

验证了这一点适用于VS2008

+0

感谢guy.u做得很好 – Cute 2009-05-01 06:09:12

0

注意!

我想添加一些JaredPar答案。我不知道你的IntPtr来自哪里,但你也应该使用pin_ptr为了防止垃圾收集器搞乱你的记忆。在过去,我做了很多CLR /本地互操作,使用pin_ptr是我学会以艰苦的方式学习的东西之一。

阅读以下内容: click me

+2

Marshal :: StringToHGlobalAnsi的返回值位于非托管内存中,不需要固定。 – 2011-10-10 02:04:01

1

使用

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

它清除自身起来,C++ RAII的魔法而不是

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