Como converter do System * Char * no Visual C++

Traduções deste artigo Traduções deste artigo
ID do artigo: 311259 - Exibir os produtos aos quais esse artigo se aplica.
Este artigo se refere à seguinte Microsoft.NET Framework Class Library namespaces:
  • System::Runtime::InteropServices
  • Msclr::Interop
Expandir tudo | Recolher tudo

Neste artigo

Sumário

Este artigo descreve várias maneiras para converter System * em char *, usando o seguinte:
  • Managed extensions para 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 fornece um indicador interior para o objeto real da cadeia de caracteres. Se você passar este ponteiro para uma chamada de função não gerenciada, você primeiro deve fixar o ponteiro para garantir que o objeto não se move durante um lixo assíncrono processo de coleta:
//#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 de seqüência de caracteres gerenciado no heap nativa, e, em seguida, converte-lo para o American National Standards Institute (ANSI) Formatar o sistema em funcionamento. Este método aloca a memória de heap nativa necessários:
//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 suporte common language runtime (/: oldSyntax) para compilar com êxito o exemplo de código anterior. Para adicionar a opção de compilador suporte common language runtime, execute estas etapas:
  1. Clique em Projetoe, em seguida, clique em ProjectName Propriedades.

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

Método 3

A classe VC7 CString tem um construtor que leva um ponteiro gerenciado de seqüência de caracteres 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 o marshal_as<T> </T> empacotar ajuda classe e a classe do auxiliar de empacotar o 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 compila usando extensões gerenciadas para C++ no Visual C++ .NET 2002 ou no Visual C++ .NET 2003. Ele usa o novo C + + / sintaxe CLI que foi introduzido no Visual C++ 2005 e o novo código de namespace msclr que foi introduzido no Visaul C++ 2008. Para compilar com êxito esse código, você deverá utilizar a opção de compilador /clr C++ no Microsoft Visual C++ 2008.

Managed Extensions for C++ exemplo de código (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 exemplo de código (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 Microsoft Knowledge Base artigos, visite o seguinte site da Microsoft:
http://support.microsoft.com/default.aspx?xmlid=fh%3BEN-US%3Bvcnet

Propriedades

ID do artigo: 311259 - Última revisão: sexta-feira, 30 de novembro de 2012 - 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 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

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