Como converter de System::String * carácter * no Visual C++

Traduções de Artigos Traduções de Artigos
Artigo: 311259 - Ver produtos para os quais este artigo se aplica.
Este artigo refere-se à seguinte Espaços de nomes de biblioteca de classes do .NET Framework Microsoft:
  • System::Runtime::InteropServices
  • Msclr::Interop
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Este artigo aborda as várias formas de converter de System::String * char * utilizando o seguinte:
  • Managed 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 para o objecto real da cadeia. Se transmitir este apontador para uma chamada de função não geridos, primeiro deve afixar o ponteiro para garantir que o objecto não mover durante um lixo assíncrono processo de recolha:
//#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 gerido de cadeia para da pilha nativa, e, em seguida, converte-lo em ANSI American National Standards Institute () Formatar ao compor uma mensagem. Este método atribui a memória da pilha 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);
				
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 de linguagem comum (/ clr:oldSyntax) com êxito a compilar o código de exemplo anterior. Para adicionar a opção de compilador do suporte de runtime de idioma comum, siga estes passos:
  1. Clique em Projectoe, em seguida, clique em NomeProjecto Propriedades.

    NotaNomeProjecto é um marcador de posição para o nome do projecto.
  2. Expandir Propriedades de configuraçãoe, em seguida, clique em Geral.
  3. No painel da direita, clique para seleccionar Suporte em Runtime de idioma comum, a antiga sintaxe (/ clr:oldSyntax) no Suporte em Runtime de idioma comum definições do projecto.
  4. Clique em Aplicare, em seguida, clique em OK.
Para mais informações sobre comum opções de compilador do suporte de runtime do idioma, visite o seguinte Web site da Microsoft Developer Network (MSDN):
http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx
Estes passos aplicam-se para o artigo completo.

Método 3

A classe de VC7 CString tem um construtor que assuma um ponteiro de cadeia gerido e carrega o CString com o 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 a marshal_as<T> </T> empacotar a classe de ajuda e a classe de programa auxiliar de empacotamento de referências de 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;
Nota Este código não pode ser compilado utilizando extensões geridas para C++, Visual C++ .NET 2002 ou Visual C++ .NET 2003. Utiliza o novo C + + sintaxe, CLI que foi introduzido no Visual C++ 2005 e o novo código de espaço de nomes de msclr que foi introduzido na Visaul C++ 2008. Para este código foi compilado com êxito, tem de utilizar o parâmetro de compilador /clr C++ no Microsoft Visual C++ 2008.

Geridos extensões para o 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 + + código de exemplo 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;
}

Referências

Para outras ocorrências na parte superior Visual C++ .NET Microsoft Knowledge Base artigos, visite o seguinte Web site da Microsoft:
http://support.microsoft.com/default.aspx?xmlid=FH%3BEN-us%3Bvcnet

Propriedades

Artigo: 311259 - Última revisão: 30 de maio de 2013 - Revisão: 6.0
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: 
kbhowtomaster kbmanaged kbnewsgrouplink kbmt KB311259 KbMtpt
Traduçã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

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com