Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se describen varias maneras de convertir desde System::String* a char* mediante extensiones administradas en Visual C++.
Versión original del producto: Visual C++
Número de KB original: 311259
Resumen
En este artículo se hace referencia a los siguientes espacios de nombres de la biblioteca de clases de Microsoft .NET Framework:
System::Runtime::InteropServicesMsclr::interop
En este artículo se describen varias maneras de convertir de System::String* a char* mediante lo siguiente:
- Extensiones administradas para C++ en Visual C++ .NET 2002 y en Visual C++ .NET 2003
- C++/CLI en Visual C++ 2005 y en Visual C++ 2008
Método 1
PtrToStringChars proporciona un puntero interior al objeto real String . Si pasa este puntero a una llamada de función no administrada, primero debe anclar el puntero para asegurarse de que el objeto no se mueve durante un proceso asincrónico de recolección de elementos no utilizados:
//#include <vcclr.h>
System::String * str = S"Hello world\n";
const __wchar_t __pin * str1 = PtrToStringChars(str);
wprintf(str1);
Método 2
StringToHGlobalAnsi copia el contenido de un objeto administrado String en un montón nativo y, a continuación, lo convierte en formato American National Standards Institute (ANSI) sobre la marcha. Este método asigna la memoria de montón nativa necesaria:
//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:
En Visual C++ 2005 y en Visual C++ 2008, debe agregar la opción del compilador compatible con Common Language Runtime (/clr:oldSyntax) para compilar correctamente el ejemplo de código anterior. Para agregar la opción del compilador de compatibilidad con Common Language Runtime, siga estos pasos:
Haga clic en Proyectoy, a continuación, haga clic en Propiedades de ProjectName.
Nota:
ProjectName es un marcador de posición para el nombre del proyecto.
Expanda Propiedades de configuración y, a continuación, haga clic en General.
En el panel derecho, haga clic para seleccionar Compatibilidad con Common Language Runtime, Sintaxis antigua (/clr:oldSyntax) en la configuración del proyecto de compatibilidad con Common Language Runtime.
Haga clic en Aplicar y, a continuación, en Aceptar.
Para obtener más información sobre las opciones del compilador de compatibilidad con Common Language Runtime, visite el siguiente sitio web de Microsoft Developer Network (MSDN):
/clr (Compilación de Common Language Runtime)
Estos pasos se aplican a todo el artículo.
Método 3
La clase VC7 CString tiene un constructor que toma un puntero string administrado y carga con CString su contenido:
//#include <atlstr.h>
System::String * str = S"Hello world\n";
CString str3(str);
printf(str3);
Método 4
Visual C++ 2008 presenta la marshal_as<T> clase de ayuda de serialización y la marshal_context() clase auxiliar de serialización.
//#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 no se compila mediante extensiones administradas para C++ en Visual C++ .NET 2002 ni en Visual C++ .NET 2003. Usa la nueva sintaxis de C++/CLI que se introdujo en Visual C++ 2005 y el nuevo código de espacio de nombres msclr que se introdujo en Visaul C++ 2008. Para compilar correctamente este código, debe usar el modificador del compilador /clr C++ en Visual C++ 2008.
Extensiones administradas para C++ código de ejemplo (Visual C++ 2002 o 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 ejemplo de C++/CLI (Visual C++ 2005 y 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;
}