System::String から Char に変換Visual C++

この記事では、管理拡張機能を使用して変換する方法について説明します System::String* char* 。Visual C++。

元の製品バージョン:   Visual C++
元の KB 番号:   311259

概要

この記事では、次の Microsoft .NET Frameworkクラス ライブラリの名前空間について説明します。

  • System::Runtime::InteropServices
  • Msclr::interop

この記事では、次の方法を使用して変換 System::String* する char* 方法について説明します。

  • C++ の管理拡張機能 (.NET 2002 Visual C++ .NET 2003 Visual C++)
  • C++/CLI in Visual C++ 2005 および Visual C++ 2008

方法 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);

注意

2005 Visual C++ および Visual C++ 2008 では、前のコード サンプルを正常にコンパイルするには、共通言語ランタイム サポート コンパイラ オプション (/clr:oldSyntax) を追加する必要があります。 共通言語ランタイム サポート コンパイラ オプションを追加するには、次の手順を実行します。

  1. [名前 Project] をクリックし 、[ProjectName プロパティ] をクリックします

    注意

    ProjectName は、プロジェクトの名前のプレースホルダーです。

  2. [構成 プロパティ] を展開 し、[全般] を クリックします

  3. 右側のウィンドウで、[共通言語ランタイムのサポート] プロジェクト設定の [共通言語ランタイム のサポート] [古い構文 ] (/clr:oldSyntax) をクリックして選択 します。

  4. [ダイヤル プラン (電話のコンテキスト)] ボックスで、[参照] をクリックして、ユーザーのダイヤル プランを見つけます。

共通言語ランタイム サポート コンパイラ オプションの詳細については、MSDN (MSDN) web サイトのMicrosoft Developer Networkを参照してください。

/clr (共通言語ランタイム コンパイル)

これらの手順は記事全体に適用されます。

方法 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;

注意

このコードは、C++ のマネージ拡張機能を Visual C++ .NET 2002 または .NET 2003 Visual C++使用してコンパイルされません。 Visual C++ 2005 で導入された新しい C++/CLI 構文と、Visaul C++ 2008 で導入された新しい msclr 名前空間コードを使用します。 このコードを正常にコンパイルするには、2008 年に /clr C++ コンパイラ スイッチVisual C++必要があります。

Managed Extensions for C++ コード (Visual C++ 2002 または Visual C++ 2003)

//compiler option: 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";

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

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

    //method 3
    CString str3(str);
    wprintf(str3);

    return 0;
}

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

//compiler option: 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);

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

    //method 3
    CString str3(str);
    wprintf(str3);

    //method 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;
}