Compartir a través de


Cómo: serializar cadenas Unicode mediante la interoperabilidad de C++

En este tema se muestra una faceta de la interoperabilidad de Visual C++. Para más información, consulte Uso de la interoperabilidad de C++ (PInvoke implícito).

En los ejemplos de código siguientes se usan las directivas de #pragma managed, unmanaged para implementar funciones administradas y no administradas en el mismo archivo, pero estas funciones interoperan de la misma forma si se definen en archivos independientes. Los archivos que contienen solo funciones no administradas no tienen que compilarse con /clr (compilación de Common Language Runtime).

En este tema se muestra cómo se pueden pasar cadenas Unicode desde una función administrada a una función no administrada y viceversa. Para interoperar con otros tipos de cadenas, vea los temas siguientes:

Ejemplo: Pasar una cadena Unicode de una función administrada a una función no administrada

Para pasar una cadena Unicode desde una función administrada a una función no administrada, se puede usar la función PtrToStringChars (declarada en Vcclr.h) para tener acceso en la memoria donde se almacena la cadena administrada. Dado que esta dirección se pasará a una función nativa, es importante que la memoria se ancle con pin_ptr (C++/CLI) para evitar que los datos de cadena se reubiquen, en caso de que se produzca un ciclo de recolección de elementos no utilizados mientras se ejecuta la función no administrada.

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

using namespace std;

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

#pragma unmanaged

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

#pragma managed

int main() {
   String^ s = gcnew String("test string");
   pin_ptr<const wchar_t> str = PtrToStringChars(s);

   Console::WriteLine("(managed) passing string to native func...");
   NativeTakesAString( str );
}

Ejemplo: Serialización de datos necesaria para acceder a la cadena Unicode

En el ejemplo siguiente se muestra la serialización de datos necesaria para tener acceso a una cadena Unicode en una función administrada a que llama una función no administrada. La función administrada, al recibir la cadena Unicode nativa, la convierte en una cadena administrada mediante el método PtrToStringUni.

// MarshalUnicode2.cpp
// compile with: /clr
#include <iostream>

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

#pragma managed

void ManagedStringFunc(wchar_t* s) {
   String^ ms = Marshal::PtrToStringUni((IntPtr)s);
   Console::WriteLine("(managed) received '{0}'", ms);
}

#pragma unmanaged

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

#pragma managed

int main() {
   NativeProvidesAString();
}

Consulte también

Usar la interoperabilidad de C++ (PInvoke implícito)