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

この記事は、以前は次の ID で公開されていました: JP311259
この資料では、次の 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 サイトを参照してください。
kbVC700
注意 : これは、マイクロソフトのサポート組織内で直接作成された "緊急公開" の資料です。 この資料には、確認中の問題に関する現状ベースの情報が記載されています。 情報提供のスピードを優先するため、資料には誤植が含まれる可能性があり、予告なしに随時改定される場合があります。 その他の考慮事項については、使用条件を参照してください。
プロパティ

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

Microsoft Visual C++ 2008 Express Edition, Microsoft Visual C++ 2005 Express Edition, Microsoft Visual C++ .NET 2003 Standard Edition, Microsoft Visual C++ .NET 2002 Standard Edition

  • kbhowtomaster kbmanaged kbnewsgrouplink KB311259
フィードバック