最終更新:2017-12-19 (火) 14:47:10 (724d)  

プラットフォーム呼び出し/文字列 はてなブックマークを見る

文字列に対する既定のマーシャリング

  • プラットフォーム呼び出しは、文字列の引数を、.NET Framework形式 (Unicode) から、プラットフォーム アンマネージ形式に変換してコピーします。
  • 文字列は不変であり、呼び出しが戻るときに、アンマネージ メモリから元のマネージ メモリにコピーされることはありません。
    文字コードC++C♯
    ANSI(既定)char*stringマーシャリングされる
    Unicodewchar_t*?stringマーシャリングされない

概要

  • アンマネージ文字列の型はいくつかあり、マネージ文字列の型は 1つしかありませんので、マネージ文字列をアンマネージコードにマーシャリングするときは、文字セットを使用してその方法を指定する必要があります。
  • C♯の文字列はCOMBSTR型(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.

メモ

  • ネイティブ側がUTF-16 (wchar_t*?)を使っている限り、変換なしで文字列を渡すことができる
    • UTF-16なnull終端文字列に対してC♯側から文字列を渡す場合、ポインタ渡しになる

MarshalAs

プラットフォーム呼び出しで使用される文字列 (関数の引数)

  • UnmanagedTypeC++
    UnmanagedType.AnsiBStr?長さと ANSI 文字がプレフィックスされた COM スタイル BSTR
    UnmanagedType.BStr?長さと Unicode 文字がプレフィックスされた COM スタイル BSTR
    UnmanagedType.LPStrLPSTR (char*)ANSI 文字の null で終わる配列へのポインター。
    UnmanagedType.LPTStr (既定値)LPTSTR (TCHAR*)プラットフォーム依存文字の null で終わる配列へのポインター。
    UnmanagedType.LPWStr?LPWSTR (WCHAR*)Unicode 文字の null で終わる配列へのポインター。
    UnmanagedType.TBStr?長さとプラットフォーム依存文字がプレフィックスされた COM スタイル BSTR。
    VBByRefStr?Visual Basic .NET?で、アンマネージ コードの文字列を変更し、結果をマネージ コードに反映できるようにする値。 この値は、プラットフォーム呼び出しでだけサポートされます。

DLL関数に文字列バッファを渡す場合

構造体で使用される文字列

char[]

参考