Visual C++에서 System::String에서 Char로 변환

이 문서에서는 Visual C++에서 관리되는 확장을 사용하여 에서 System::String* 로 변환하는 char* 여러 가지 방법을 설명합니다.

원래 제품 버전: Visual C++
원래 KB 번호: 311259

요약

이 문서에서는 다음 Microsoft .NET Framework 클래스 라이브러리 네임스페이스를 참조합니다.

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

이 문서에서는 다음을 사용하여 에서 System::String* 로 변환하는 char* 여러 가지 방법을 설명합니다.

  • Visual C++ .NET 2002 및 Visual C++ .NET 2003에서 C++에 대한 관리되는 확장
  • Visual C++ 2005 및 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. 사용자에 대한 다이얼 플랜을 찾으려면 다이얼 플랜(전화 컨텍스트) 상자에서 찾아보기를 클릭합니다.

공용 언어 런타임 지원 컴파일러 옵션에 대한 자세한 내용은 다음 MSDN(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;

참고

이 코드는 Visual C++ .NET 2002 또는 Visual C++ .NET 2003에서 C++용 관리형 확장을 사용하여 컴파일되지 않습니다. Visual C++ 2005에 도입된 새 C++/CLI 구문과 Visaul C++ 2008에 도입된 새 msclr 네임스페이스 코드를 사용합니다. 이 코드를 성공적으로 컴파일하려면 Visual C++ 2008에서 /clr 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;
}