Converter de System::String para Char no Visual C++

Este artigo descreve várias maneiras de converter de System::String* para char* usando extensões gerenciadas no Visual C++.

Versão original do produto: Visual C++
Número de KB original: 311259

Resumo

Este artigo refere-se aos seguintes namespaces da Biblioteca de Classes da Microsoft .NET Framework:

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

Este artigo discute várias maneiras de converter de System::String* para char* usando o seguinte:

  • Extensões gerenciadas para C++ no Visual C++ .NET 2002 e no Visual C++ .NET 2003
  • C++/CLI no Visual C++ 2005 e no Visual C++ 2008

Método 1

PtrToStringChars fornece um ponteiro interno para o objeto real String . Se você passar esse ponteiro para uma chamada de função não gerenciada, primeiro você deverá fixar o ponteiro para garantir que o objeto não se mova durante um processo de coleta de lixo assíncrono:

//#include <vcclr.h>
System::String * str = S"Hello world\n";
const __wchar_t __pin * str1 = PtrToStringChars(str);
wprintf(str1);

Método 2

StringToHGlobalAnsi copia o conteúdo de um objeto gerenciado String em heap nativo e, em seguida, converte-o no formato ANSI (American National Standards Institute) em tempo real. Este método aloca a memória de heap nativa necessária:

//using namespace System::Runtime::InteropServices;
System::String * str = S"Hello world\n";
char* str2 = (char*)(void*)Marshal::StringToHGlobalAnsi(str);
printf(str2);
Marshal::FreeHGlobal(str2);

Observação

No Visual C++ 2005 e no Visual C++ 2008, você deve adicionar a opção do compilador de suporte de runtime de linguagem comum (/clr:oldSyntax) para compilar com êxito o exemplo de código anterior. Para adicionar a opção do compilador de suporte do common language runtime, siga estas etapas:

  1. Clique em Projeto e clique em Propriedades do ProjectName.

    Observação

    ProjectName é um espaço reservado para o nome do projeto.

  2. Expanda Propriedades de Configuração e clique em Geral.

  3. No painel direito, clique para selecionar Suporte ao Common Language Runtime, Sintaxe Antiga (/clr:oldSyntax) nas configurações de projeto de suporte do Common Language Runtime .

  4. Na caixa Plano de discagem (Contexto de telefone), clique em Procurar para localizar o plano de discagem do usuário.

Para obter mais informações sobre as opções do compilador de suporte do common language runtime, visite o seguinte site da MSDN (Microsoft Developer Network):

/clr (Compilação do Common Language Runtime)

Essas etapas se aplicam a todo o artigo.

Método 3

A classe VC7 CString tem um construtor que usa um ponteiro string gerenciado e carrega o com seu CString conteúdo:

//#include <atlstr.h>
System::String * str = S"Hello world\n";
CString str3(str);
printf(str3);

Método 4

O Visual C++ 2008 apresenta a classe de ajuda do marshal_as<T> marshal e a classe auxiliar marshal 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;

Observação

Esse código não é compilado usando extensões gerenciadas para C++ no Visual C++ .NET 2002 ou no Visual C++ .NET 2003. Ele usa a nova sintaxe C++/CLI que foi introduzida no Visual C++ 2005 e o novo código de namespace msclr que foi introduzido no Visaul C++ 2008. Para compilar esse código com êxito, você deve usar a opção do compilador /clr C++ no Visual C++ 2008.

Managed Extensions for C++ código de exemplo (Visual C++ 2002 ou 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ódigo de exemplo C++/CLI (Visual C++ 2005 e 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;
}