字符串有一个^
,因为这是托管引用的标记。基本上,它的使用方式与*
非托管区相同,只是它只能指向对象类型,不能指向其他指针类型或 void。
TCHAR
是 #defined (或者可能是 typedefed,我不记得了)到char
or wchar_t
,基于 _UNICODE 预处理器定义。因此,我会使用它并编写两次代码。
内联:
TCHAR* str;
String^ managedString
#ifdef _UNICODE
str = (TCHAR*) Marshal::StringToHGlobalUni(managedString).ToPointer();
#else
str = (TCHAR*) Marshal::StringToHGlobalAnsi(managedString).ToPointer();
#endif
// use str.
Marshal::FreeHGlobal(IntPtr(str));
或者作为一对转换方法,两者都假设输出缓冲区已经分配并且足够大。方法重载应该根据 TCHAR 的定义选择正确的方法。
void ConvertManagedString(String^ managedString, char* outString)
{
char* str;
str = (char*) Marshal::StringToHGlobalAnsi(managedString).ToPointer();
strcpy(outString, str);
Marshal::FreeHGlobal(IntPtr(str));
}
void ConvertManagedString(String^ managedString, wchar_t* outString)
{
wchar_t* str;
str = (wchar_t*) Marshal::StringToHGlobalUni(managedString).ToPointer();
wcscpy(outString, str);
Marshal::FreeHGlobal(IntPtr(str));
}