Artigo: 311259 - Última revisão: terça-feira, 1 de Abril de 2008 - Revisão: 5.0

Como converter System::String * para o carácter * 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 faz referência à seguintes espaços de nomes Microsoft .NET Framework Class Library:
  • System::Runtime::InteropServices
  • Msclr::Interop

Nesta página

Expandir tudo | Reduzir tudo

Sumário

Este artigo descreve várias formas de converter de System::String * char * utilizando o seguinte:
  • Gerido extensões para o C++ no Microsoft Visual C++ .NET 2002 e no Microsoft Visual C++ .NET 2003
  • C + + / CLI no Microsoft Visual C++ 2005 e no Microsoft Visual C++ 2008

Método 1

PtrToStringChars dá-lhe um ponteiro interior ao objecto de cadeia real. Se este ponteiro para uma chamada de função não geridos, primeiro tem a associar o ponteiro para se certificar de que o objecto não é movido durante um processo de recolha 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 objecto de cadeia gerido na pilha nativa e, em seguida, converte-as no formato ANSI (American National Standards Institute) ao compor uma mensagem. Este método atribui a memória de pilha nativo 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);
				
NOTA: no Visual C++ 2005 e no Visual C++ 2008, tem de adicionar a opção de compilador do suporte de tempo de execução idioma comum (/ clr:oldSyntax) para compilar com êxito o anterior exemplo de código. Para adicionar a opção de compilador do suporte de tempo de execução idioma comum, siga estes passos:
  1. Clique em projecto e, em seguida, clique em propriedades ProjectName.

    Nota ProjectName é um marcador para o nome do projecto.
  2. Expanda Propriedades de configuração e, em seguida, clique em Geral .
  3. No painel direito, clique para seleccionar Runtime do idioma comum suporte, sintaxe antigo (/ clr:oldSyntax) no Common Language Runtime suporta definições do projecto.
  4. Clique em Aplicar e, em seguida, clique em OK .
Para mais informações sobre opções de compilador suporte tempo de execução de linguagem comum, visite o seguinte Web site da Microsoft Developer Network (MSDN):
http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx (http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx)
Estes passos aplicam-se para o artigo completo.

Método 3

A classe VC7 CString tem um construtor que recebe um ponteiro de cadeia gerido 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

Visual C++ 2008 introduz o marshal_as<t> é empacotar referências de classe de ajuda e o marshal_context() empacotamento de referências ajuda 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;
Nota Este código não compilar utilizando extensões geridas para C++ no Visual C++ .NET 2002 ou no Visual C++ .NET 2003. Utiliza o novo C + + / sintaxe de clip que foi introduzido no Visual C++ 2005 e o novo código de espaço de nomes de msclr que foi introduzido no Visaul C++ 2008. Para compilar com êxito este código, tem de utilizar o / clr parâmetro do compilador C++ no Microsoft Visual C++ 2008.

Gerido extensões para exemplo de código C++ (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 + + / 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-acerto Visual C++ .NET da base de dados de conhecimento da Microsoft artigos, visite o seguinte Web 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 mais informações gerais sobre Visual C++. NET, visite o newsgroup Microsoft Usenet seguinte:
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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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/ )