Freigeben über


Gewusst wie: Marshallen von Unicode-Zeichenfolgen mit C++-Interop

Dieses Thema veranschaulicht einen Aspekt der Visual C++-Interoperabilität.Weitere Informationen finden Sie unter Verwenden von C++-Interop (implizites PInvoke).

In den folgenden Codebeispielen werden die verwaltet, nicht verwaltet-#pragma-Direktiven verwendet, um verwaltete und nicht verwaltete Funktionen in derselben Datei zu implementieren. Diese Funktionen arbeiten jedoch auf dieselbe Weise zusammen, wenn sie in separaten Dateien definiert werden.Dateien, die ausschließlich nicht verwaltete Funktionen enthalten, müssen nicht mit /clr (Common Language Runtime-Kompilierung) kompiliert werden.

In diesem Thema wird beschrieben, wie Unicode-Zeichenfolgen von einer verwalteten an eine nicht verwaltete Funktion und umgekehrt übergeben werden können.Informationen zur Interoperation mit anderen Zeichenfolgentypen finden Sie in den folgenden Themen:

Beispiel

Zum Übergeben einer Unicode-Zeichenfolge von einer verwalteten an eine nicht verwaltete Funktion kann die PtrToStringChars-Funktion (in Vcclr.h deklariert) für den Zugriff auf den Speicher verwendet werden, in dem die verwaltete Zeichenfolge gespeichert ist.Da diese Adresse an die systemeigene Funktion übergeben wird, ist es wichtig, den Speicher mit pin_ptr zu fixieren, damit die Zeichenfolgendaten nicht verschoben werden, falls während der Ausführung der nicht verwalteten Funktion ein Garbage Collection-Zyklus erfolgt.

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

Das folgende Beispiel zeigt das erforderliche Datenmarshalling für den Zugriff auf die Unicode-Zeichenfolge in einer verwalteten Funktion, die von einer nicht verwalteten Funktion aufgerufen wird.Die von der verwalteten Funktion empfangene systemeigene Unicode-Zeichenfolge wird mit der PtrToStringUni-Methode in eine verwaltete Zeichenfolge konvertiert.

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

Siehe auch

Referenz

Verwenden von C++-Interop (implizites PInvoke)