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:
Cómo: Serializar cadenas ANSI mediante la interoperabilidad de C++
Cómo: Serializar cadenas COM mediante la interoperabilidad de C++
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();
}