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

文書翻訳 文書翻訳
文書番号: 311259 - 対象製品
この記事は、以前は次の 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 サイトをクリックしてください。
http://msdn2.microsoft.com/ja-jp/library/k8d11d4s.aspx
ここに示す手順は資料全体に適用されます。

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

プロパティ

文書番号: 311259 - 最終更新日: 2013年7月2日 - リビジョン: 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
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com