任何正文都可以告诉如何在托管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;
}
提前致谢
答案 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