^
これはマネージド参照のマーカーであるため、文字列には があります。基本的には、管理されていない土地と同じように使用され*
ますが、オブジェクト型のみを指すことができ、他のポインター型や void を指すことはできません。
TCHAR
_UNICODE プリプロセッサ定義に基づいて、char
またはのいずれかに #defined (または、おそらく typedefed、覚えていません)です。wchar_t
したがって、それを使用してコードを 2 回記述します。
インラインのいずれか:
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));
}