ID do artigo: 311259 - Última revisão: terça-feira, 1 de abril de 2008 - Revisão: 5.0

Como converter de System::String 1 para caracteres 1 no Visual C++

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Este artigo se refere aos seguintes namespaces Microsoft .NET Framework Class Library:
  • System::Runtime::InteropServices
  • Msclr::Interop

Nesta página

Expandir tudo | Recolher tudo

Sumário

Este artigo aborda várias maneiras para converter de System::String 1 para char 1 usando o seguinte:
  • Gerenciado extensões para C++ no Microsoft Visual C++ .NET 2002 e no Microsoft Visual C++ .NET 2003
  • C + c++ / CLI no Microsoft Visual C++ 2005 e no Microsoft Visual C++ 2008

Método 1

PtrToStringChars lhe oferece um ponteiro interior para o objeto String real. Se você passar o ponteiro para uma chamada de função não gerenciada, primeiro você deve marcar o ponteiro para garantir que o objeto não move durante um processo de coleta lixo assíncrona:
//#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 String gerenciado para nativo heap e a converte em formato do American National Standards Institute (ANSI) imediatamente. Esse método aloca a memória 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 de compilador de suporte de tempo de execução idioma comum (/ CLR: oldSyntax) para compilar o exemplo de código anterior com êxito. Para adicionar a opção de compilador de suporte de tempo de execução idioma comum, siga estas etapas:
  1. Clique em projeto e, em seguida, clique em propriedades ProjectName.

    Observação ProjectName é um espaço reservado para o nome do projeto.
  2. Expanda Configuration Properties e, em seguida, clique em Geral .
  3. No painel direito, clique para selecionar Common Language Runtime suporte, sintaxe antiga (/ CLR: oldSyntax) nas configurações de projeto oferece suporte a Common Language Runtime .
  4. Clique em Aplicar e, em seguida, clique em OK .
Para obter mais informações sobre idioma comum suporte em tempo de execução opções do compilador, visite o seguinte site da Web Microsoft Developer Network (MSDN):
http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx (http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx)
Estas etapas se aplicam o artigo inteiro.

Método 3

A classe VC7 CString tem um construtor que leva um ponteiro gerenciado de String e carrega o CString com seu 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 marshal_as<t> empacotar a classe de Ajuda e o marshal_context() empacotar auxiliar class.
//#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 compila usando extensões gerenciadas para C++ no Visual C++ .NET 2002 ou no Visual C++ .NET 2003. Ele usa o novo C + c++ / CLI sintaxe que foi introduzido no Visual C++ 2005 e o código de namespace msclr novo que foi introduzido no Visaul C++ 2008. Para compilar com êxito esse código, você deve usar o / clr comutador de compilador C++ no Microsoft Visual C++ 2008.

Managed Extensions para 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 + c++ / CLI código de exemplo (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;
}

Referências

Para outros superior-impacto Visual C++ .NET Microsoft Knowledge Base artigos, visite o seguinte site da Microsoft:
http://support.microsoft.com/default.aspx?xmlid=fh%3BEN-US%3Bvcnet (http://support.microsoft.com/default.aspx?xmlid=fh%3ben-us%3bvcnet)
Para obter informações mais gerais sobre o Visual C++ .NET, visite o seguinte grupo de notícias Usenet da Microsoft:
Microsoft.public.dotnet.languages.vc (http://msdn.microsoft.com/newsgroups/default.aspx?query=Microsoft.public.dotnet.languages.vc+&dg=&cat=en-us-msdn&lang=en&cr=US&pt=&catlist=774F24A2-F71F-425F-AC2B-DC48AB0DA5C9&dglist=&ptlist=&exp=&sloc=en-us)

A informação contida neste artigo aplica-se a:
  • 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
Palavras-chave: 
kbmt kbhowtomaster kbmanaged kbnewsgrouplink KB311259 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 311259  (http://support.microsoft.com/kb/311259/en-us/ )