Cómo: Calcular referencias de cadenas Unicode mediante la interoperabilidad de C++

Actualización: noviembre 2007

En este tema se muestra un aspecto de la interoperabilidad de Visual C++. Para obtener más información, vea Utilizar la interoperabilidad de C++ (PInvoke implícito).

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. No es necesario compilar con /clr (Compilación de Common Language Runtime) los archivos que contienen únicamente funciones no administradas.

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

Ejemplo

Para pasar una cadena Unicode de una función administrada a una no administrada, se puede usar la función PtrToStringChars (declarada en Vcclr.h) para tener acceso a la ubicación en la memoria donde se almacena la cadena administrada. Dado que esta dirección se pasará a una función nativa, es importante fijar la memoria con pin_ptr para evitar que los datos de la cadena cambien de ubicación, si tuviese lugar un ciclo de recolección de elementos no utilizados durante la ejecución de 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) recieved '%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 );
}

El ejemplo siguiente muestra el cálculo de referencias de datos que se requiere para tener acceso a una cadena Unicode en una función administrada a la que llama una función no administrada. La función administrada, al recibir la cadena Unicode nativa, la convierte en una cadena administrada utilizando 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) recieved '{0}'", ms);
}

#pragma unmanaged

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

#pragma managed

int main() {
   NativeProvidesAString();
}

Vea también

Referencia

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