String имеет ^
, потому что это маркер для управляемой ссылки. По сути, он используется так же, как *
в неуправляемой земле, за исключением того, что он может указывать только на тип объекта, а не на другие типы указателей или на void.
TCHAR
- это #defined (или, возможно, typedefed, я не помню) либо char
, либо 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));
}