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:
Clique em Projeto e clique em Propriedades do ProjectName.
Observação
ProjectName é um espaço reservado para o nome do projeto.
Expanda Propriedades de Configuração e clique em Geral.
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 .
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;
}
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários