Så här: Hantera Unicode-strängar med hjälp av C++-Interop

Det här avsnittet visar en aspekt av Visual C++-samverkan. Mer information finns i Använda C++ Interop (Implicit PInvoke).

I följande kodexempel används de hanterade, ohanterade #pragma-direktiven för att implementera hanterade och ohanterade funktioner i samma fil, men dessa funktioner samverkar på samma sätt om de definieras i separata filer. Filer som endast innehåller ohanterade funktioner behöver inte kompileras med /clr (Common Language Runtime Compil).

Det här avsnittet visar hur Unicode-strängar kan skickas från en hanterad till en ohanterad funktion och vice versa. Information om hur du samverkar med andra strängtyper finns i följande avsnitt:

Exempel: Skicka Unicode-sträng från hanterad till ohanterad funktion

Om du vill skicka en Unicode-sträng från en hanterad till en ohanterad funktion kan funktionen PtrToStringChars (deklarerad i Vcclr.h) användas för att komma åt i minnet där den hanterade strängen lagras. Eftersom den här adressen skickas till en intern funktion är det viktigt att minnet fästs med pin_ptr (C++/CLI) för att förhindra att strängdata flyttas om en skräpinsamlingscykel sker medan den ohanterade funktionen körs.

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

Exempel: Datamarsering krävs för åtkomst till Unicode-sträng

I följande exempel visas den datamarsering som krävs för att komma åt en Unicode-sträng i en hanterad funktion som anropas av en ohanterad funktion. Den hanterade funktionen tar emot den infödda Unicode-strängen och konverterar den till en hanterad sträng med hjälp av PtrToStringUni-metoden.

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

Se även

Använda C++ Interop (implicit PInvoke)