最終更新:2017-12-19 (火) 14:47:10 (2313d)
プラットフォーム呼び出し/文字列
Top / プラットフォーム呼び出し / 文字列
文字列に対する既定のマーシャリング
- プラットフォーム呼び出しは、文字列の引数を、.NET Framework形式 (Unicode) から、プラットフォーム アンマネージ形式に変換してコピーします。
- 文字列は不変であり、呼び出しが戻るときに、アンマネージ メモリから元のマネージ メモリにコピーされることはありません。
概要
- アンマネージ文字列の型はいくつかあり、マネージ文字列の型は 1つしかありませんので、マネージ文字列をアンマネージコードにマーシャリングするときは、文字セットを使用してその方法を指定する必要があります。
- C♯の文字列はCOMのBSTR型(Unicode)互換
CharSet
CharSet.Ansi?
- Platform invoke marshals strings from their managed format (Unicode) to ANSI format.
CharSet.Unicode
- Platform invoke copies strings from their managed format (Unicode) to Unicode format.
メモ
- Win32 APIやDLL関数に文字列を渡す場合は、デフォルトでANSI文字セット(char*)
- Unicode版のAPIを使うときはCharSet=CharSet.Unicode
MarshalAs
プラットフォーム呼び出しで使用される文字列 (関数の引数)
UnmanagedType C++ UnmanagedType.AnsiBStr? 長さと ANSI 文字がプレフィックスされた COM スタイル BSTR。 UnmanagedType.BStr? 長さと Unicode 文字がプレフィックスされた COM スタイル BSTR。 UnmanagedType.LPStr LPSTR (char*) ANSI 文字の null で終わる配列へのポインター。 UnmanagedType.LPTStr (既定値) LPTSTR (TCHAR*) プラットフォーム依存文字の null で終わる配列へのポインター。 UnmanagedType.LPWStr? LPWSTR (WCHAR*) Unicode 文字の null で終わる配列へのポインター。 UnmanagedType.TBStr? 長さとプラットフォーム依存文字がプレフィックスされた COM スタイル BSTR。 VBByRefStr? Visual Basic .NET?で、アンマネージ コードの文字列を変更し、結果をマネージ コードに反映できるようにする値。 この値は、プラットフォーム呼び出しでだけサポートされます。
DLL関数に文字列バッファを渡す場合
- StringBuilder (固定長文字列バッファー)
UnmanagedType C++ UnmanagedType.LPStr LPSTR (char*) UnmanagedType.LPTStr LPTSTR (TCHAR*) UnmanagedType.LPWStr? LPWSTR (WCHAR*)
構造体で使用される文字列
UnmanagedType C++ UnmanagedType.BStr? 長さと Unicode 文字がプレフィックスされた COM スタイル BSTR。 UnmanagedType.LPStr LPSTR (char*) ANSI 文字の null で終わる配列へのポインター。 UnmanagedType.LPTStr LPTSTR (TCHAR*) プラットフォーム依存文字の null で終わる配列へのポインター。 UnmanagedType.LPWStr? LPWSTR (WCHAR*) Unicode 文字の null で終わる配列へのポインター。 UnmanagedType.ByValTStr char[n]/WCHAR[n],TCHAR[n] 固定長の文字配列。配列の型は、包含構造体の文字セットによって決まります。 - StringBuilderバッファーは構造体では無効