¿Le resultó útil esta página?
Sus comentarios sobre este contenido son muy importantes. Háganos saber su opinión.
¿Tiene comentarios adicionales?
Caracteres restantes: 1500
Exportar (0) Imprimir
Expandir todo
Expandir Minimizar
Importante Es posible que este documento no represente los procedimientos recomendados para el desarrollo actual. Puede que los vínculos a las descargas y otros recursos ya no sean válidos. Encontrará aquí la versión que se recomienda en la actualidad.

Cómo: Convertir cadenas ANSI mediante la interoperabilidad de C++

Este tema muestra cómo se pueden pasar cadenas ANSI mediante la interoperabilidad de C++, pero String de .NET Framework representa cadenas en formato Unicode, por lo que la conversión a ANSI requiere un paso adicional. Para interoperar con otros tipos de cadenas, vea los temas siguientes:

En los siguientes ejemplos de código, se utilizan las directivas #pragma managed, unmanaged para implementar funciones administradas y no administradas en el mismo archivo, pero sin que éstas dejen de interactuar como si se hubieran definido en archivos separados. Dado que los archivos que contienen sólo funciones no administradas no necesitan ser compilados con /clr (Compilación de Common Language Runtime), pueden retener sus características de rendimiento.

Ejemplo

El ejemplo muestra el paso de una cadena ANSI de una función administrada a una no administrada utilizando StringToHGlobalAnsi. Este método asigna memoria en el montón no administrado y devuelve la dirección después de realizar la conversión. Esto significa que no es necesario fijar (ya que la memoria del montón GC no se pasa a la función no administrada) y que el valor IntPtr devuelto de StringToHGlobalAnsi se debe liberar explícitamente o se producirá una pérdida de memoria.

// MarshalANSI1.cpp
// compile with: /clr
#include <iostream>
#include <stdio.h>

using namespace std;
using namespace System;
using namespace System::Runtime::InteropServices;

#pragma unmanaged

void NativeTakesAString(const char* p) {
   printf_s("(native) received '%s'\n", p);
}

#pragma managed

int main() {
   String^ s = gcnew String("sample string");
   IntPtr ip = Marshal::StringToHGlobalAnsi(s);
   const char* str = static_cast<const char*>(ip.ToPointer());

   Console::WriteLine("(managed) passing string...");
   NativeTakesAString( str );

   Marshal::FreeHGlobal( ip );
}

El ejemplo siguiente muestra el cálculo de referencias de datos necesario para tener acceso a una cadena ANSI en una función administrada a la que se llama mediante una función no administrada. La función administrada, cuando recibe la cadena nativa, puede usarla directamente o convertirla en una cadena administrada utilizando el método PtrToStringAnsi, como se muestra.

// MarshalANSI2.cpp
// compile with: /clr
#include <iostream>
#include <vcclr.h>

using namespace std;

using namespace System;
using namespace System::Runtime::InteropServices;

#pragma managed

void ManagedStringFunc(char* s) {
   String^ ms = Marshal::PtrToStringAnsi(static_cast<IntPtr>(s));
   Console::WriteLine("(managed): received '{0}'", ms);
}

#pragma unmanaged

void NativeProvidesAString() {
   cout << "(native) calling managed func...\n";
   ManagedStringFunc("test string");
}

#pragma managed

int main() {
   NativeProvidesAString();
}

Vea también

Adiciones de comunidad

AGREGAR
Mostrar:
© 2015 Microsoft