Visual C++ で System::String* から char* に変換する方法

この資料では、次の Microsoft .NET Framework クラス ライブラリの名前空間を参照しています。
  • System::Runtime::InteropServices
  • Msclr::interop

概要

この資料では、以下のものを使用して System::String* から char* に変換する方法をいくつか説明します。
  • Microsoft Visual C++ .NET 2002 および Microsoft Visual C++ .NET 2003 での C++ のマネージ拡張
  • Microsoft Visual C++ 2005 および Microsoft Visual C++ 2008 での C++/CLI

方法 1

PtrToStringChars は、実際の String オブジェクトへの内部ポインターを提供します。このポインターを渡してアンマネージ関数を呼び出す場合は、次のように、最初にポインターを固定して、非同期ガーベジ コレクション処理の実行中にオブジェクトが移動されないようにします。
//#include <vcclr.h>
System::String * str = S"Hello world\n";
const __wchar_t __pin * str1 = PtrToStringChars(str);
wprintf(str1);

方法 2

StringToHGlobalAnsi は、マネージ String オブジェクトの内容をネイティブのヒープにコピーし、それをすぐに ANSI (米国規格協会) 形式に変換します。このメソッドで、必要なネイティブ ヒープ メモリを割り当てます。
//using namespace System::Runtime::InteropServices;
System::String * str = S"Hello world\n";
char* str2 = (char*)(void*)Marshal::StringToHGlobalAnsi(str);
printf(str2);
Marshal::FreeHGlobal(str2);
: Visual C++ 2005 および Visual C++ 2008 で、上記のコードのコンパイルを正常終了するためには、共通言語ランタイム サポート コンパイラ オプション (/clr:oldSyntax) を追加する必要があります。 共通言語ランタイム サポート コンパイラ オプションを追加するには、次の手順を実行します。

  1. [プロジェクト] メニューの [ProjectName のプロパティ] をクリックします。



    : ProjectName には、プロジェクトの名前が入ります。
  2. [構成プロパティ] を展開し、[全般] をクリックします。

  3. 右側のウィンドウで、[共通言語ランタイム サポート] プロジェクト設定の [共通言語ランタイム サポート、古い構文 (/clr:oldSyntax)] をクリックします。
  4. [適用] をクリックし、[OK] をクリックします。
共通言語ランタイム サポート コンパイラ オプションの詳細を参照するには、次の MSDN (Microsoft Developer Network) Web サイトをクリックしてください。

ここに示す手順は資料全体に適用されます。

方法 3

VC7 の CString クラスには、マネージ String ポインターを受け取るコンストラクターがあり、このコンストラクターはその内容を CString に読み込みます。
//#include <atlstr.h>
System::String * str = S"Hello world\n";
CString str3(str);
printf(str3);

方法 4

Visual C++ 2008 では、marshal_as<T> マーシャリング ヘルプ クラスおよび marshal_context() マーシャリング ヘルパー クラスが導入されています。
//#include <msclr/marshal.h>
//using namespace msclr::interop;
marshal_context ^ context = gcnew marshal_context();
const char* str4 = context->marshal_as<const char*>(str);
puts(str4);
delete context;
注: このコードは、Visual C++ .NET 2002 または Visual C++ .NET 2003 での C++ のマネージ拡張を使用してもコンパイルされません。このコードでは、Visual C++ 2005 で導入された新しい C++/CLI 構文と、Visaul C++ 2008 で導入された新しい msclr 名前空間が使用されています。このコードを正常にコンパイルするには、Microsoft Visual C++ 2008 で /clr C++ コンパイラ スイッチを使用する必要があります。

C++ のマネージ拡張のサンプル コード (Visual C++ 2002 または Visual C++ 2003)

//コンパイラ オプション: cl /clr  
#include <vcclr.h>
#include <atlstr.h>
#include <stdio.h>
#using <mscorlib.dll>
using namespace System;
using namespace System::Runtime::InteropServices;

int _tmain(void)
{
System::String * str = S"Hello world\n";

//方法 1
const __wchar_t __pin * str1 = PtrToStringChars(str);
wprintf(str1);

//方法 2
char* str2 = (char*)(void*)Marshal::StringToHGlobalAnsi(str);
printf(str2);
Marshal::FreeHGlobal(str2);

//方法 3
CString str3(str);
wprintf(str3);

return 0;
}

C++/CLI サンプル コード (Visual C++ 2005 および Visual C++ 2008)

//コンパイラ オプション: cl /clr 

#include <atlstr.h>
#include <stdio.h>
#using <mscorlib.dll>

using namespace System;
using namespace System::Runtime::InteropServices;

#if _MSC_VER > 1499 // Visual C++ 2008 only
#include <msclr/marshal.h>
using namespace msclr::interop;
#endif

int _tmain(void)
{
System::String ^ str = "Hello world\n";

/method 1
pin_ptr<const wchar_t> str1 = PtrToStringChars(str);
wprintf(str1);

//方法 2
char* str2 = (char*)Marshal::StringToHGlobalAnsi(str).ToPointer();
printf(str2);
Marshal::FreeHGlobal((IntPtr)str2);

//方法 3
CString str3(str);
wprintf(str3);

//方法 4
#if _MSC_VER > 1499 // Visual C++ 2008 only
marshal_context ^ context = gcnew marshal_context();
const char* str4 = context->marshal_as<const char*>(str);
puts(str4);
delete context;
#endif

return 0;
}

関連情報

Visual C++ .NET に関してよく参照されるその他のサポート技術情報については、次のマイクロソフト Web サイトを参照してください。
プロパティ

文書番号:311259 - 最終更新日: 2013/07/02 - リビジョン: 1

フィードバック