C++ におけるマーシャリングの概要
混合モードでは、ネイティブ型とマネージ型の間でのデータのマーシャリングが必要になる場合があります。Visual Studio 2008 には、データのマーシャリングと変換を簡単に行うためのマーシャリング ライブラリが導入されています。
マーシャリング ライブラリは、marshal_context クラスの有無に関係なく使用できます。一部の変換ではコンテキストが必要になります。marshal_as 関数を使用して実装できる変換もあります。次の表は、現在サポートされている変換、それぞれの変換にコンテキストが必要かどうか、およびインクルードする必要のあるマーシャル ファイルの一覧です。
変換前の型 |
変換後の型 |
マーシャル メソッド |
インクルード ファイル |
---|---|---|---|
System::String^ |
const char* |
marshal_context |
marshal.h |
const char* |
System::String^ |
marshal_as |
marshal.h |
char* |
System::String^ |
marshal_as |
marshal.h |
System::String^ |
const wchar_t * |
marshal_context |
marshal.h |
const wchar_t * |
System::String^ |
marshal_as |
marshal.h |
wchar_t* |
System::String^ |
marshal_as |
marshal.h |
System::IntPtr |
HANDLE |
marshal_as |
marshal_windows.h |
HANDLE |
System::IntPtr |
marshal_as |
marshal_windows.h |
System::String^ |
BSTR |
marshal_context |
marshal_windows.h |
BSTR |
System::String^ |
marshal_as |
marshal.h |
System::String^ |
bstr_t |
marshal_as |
marshal_windows.h |
bstr_t |
System::String^ |
marshal_as |
marshal_windows.h |
System::String^ |
std::string |
marshal_as |
marshal_cppstd.h |
std::string |
System::String^ |
marshal_as |
marshal_cppstd.h |
System::String^ |
std::wstring |
marshal_as |
marshal_cppstd.h |
std::wstring |
System::String^ |
marshal_as |
marshal_cppstd.h |
System::String^ |
CStringT<char> |
marshal_as |
marshal_atl.h |
CStringT<char> |
System::String^ |
marshal_as |
marshal_atl.h |
System::String^ |
CStringT<wchar_t> |
marshal_as |
marshal_atl.h |
CStringT<wchar_t> |
System::String^ |
marshal_as |
marshal_atl.h |
System::String^ |
CComBSTR |
marshal_as |
marshal_atl.h |
CComBSTR |
System::String^ |
marshal_as |
marshal_atl.h |
マーシャリングでコンテキストが必要となるのは、マネージ データ型からネイティブ データ型へのマーシャリングで、変換先のネイティブ型に自動クリーンアップを行うためのデストラクタがない場合だけです。マーシャリング コンテキストは、割り当てられたネイティブ データ型をそのデストラクタで破棄します。したがって、コンテキストを必要とする変換は、コンテキストが削除されると無効になります。マーシャリングされた値を保存するには、独自の変数に値をコピーする必要があります。
メモ : |
---|
複数の NULL が埋め込まれている文字列に対してマーシャリングを行うと、予期しない結果になる場合があります。文字列に NULL が埋め込まれていると、それが原因で文字列が切り捨てられる可能性があります。切り捨てられずに保持される場合もあります。 |
マーシャリング ライブラリは拡張可能なので、独自のマーシャリング型を追加できます。マーシャリング ライブラリの拡張の詳細については、「方法 : マーシャリング ライブラリを拡張する」を参照してください。
以前のバージョンでは、プラットフォーム呼び出しを使用してデータをマーシャリングすることができました。PInvoke の詳細については、「マネージ コードからのネイティブ関数の呼び出し」を参照してください。