Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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();
}