Delen via


Hoe te: Unicode-tekenreeksen marshallen met C++ interoperabiliteit

In dit onderwerp ziet u één facet van visual C++-interoperabiliteit. Zie C++ Interop (impliciete PInvoke) gebruiken voor meer informatie.

In de volgende codevoorbeelden worden de beheerde, onbeheerde #pragma instructies gebruikt om beheerde en onbeheerde functies in hetzelfde bestand te implementeren, maar deze functies werken op dezelfde manier als deze zijn gedefinieerd in afzonderlijke bestanden. Bestanden met alleen niet-beheerde functies hoeven niet te worden gecompileerd met /clr (Common Language Runtime Compilation).

In dit onderwerp wordt gedemonstreerd hoe Unicode-tekenreeksen kunnen worden doorgegeven van een beheerde naar een niet-beheerde functie, en omgekeerd. Zie de volgende onderwerpen voor samenwerking met andere tekenreekstypen:

Voorbeeld: Unicode-tekenreeks doorgeven van beheerde naar niet-beheerde functie

Als u een Unicode-tekenreeks van een beheerde functie wilt doorgeven aan een niet-beheerde functie, kan de functie PtrToStringChars (gedeclareerd in Vcclr.h) worden gebruikt voor toegang in het geheugen waarin de beheerde tekenreeks wordt opgeslagen. Omdat dit adres wordt doorgegeven aan een natuurlijke functie, is het belangrijk dat het geheugen wordt vastgezet met pin_ptr (C++/CLI) om te voorkomen dat de stringgegevens worden verplaatst als er een garbage collection cyclus plaatsvindt terwijl de onbeheerde functie wordt uitgevoerd.

// 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 );
}

Voorbeeld: Gegevensverwerking vereist voor toegang tot Unicode-tekenreeks

In het volgende voorbeeld ziet u de data marshaling die is vereist voor toegang tot een Unicode-tekenreeks in een beheerde functie die wordt aangeroepen door een niet-beheerde functie. De beheerde functie, bij het ontvangen van de systeemeigen Unicode-tekenreeks, converteert deze naar een beheerde tekenreeks met behulp van de PtrToStringUni methode.

// 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();
}

Zie ook

C++ Interop gebruiken (impliciete PInvoke)