Sdílet prostřednictvím


Postupy: Zařazování řetězců kódování Unicode pomocí C++ Interop

Toto téma ukazuje na jeden aspekt vzájemné funkční spolupráce jazyka Visual C++. Další informace naleznete v tématu Použití interoperability C++ (implicitně PInvoke).

Následující příklady kódu používají managed, unmanaged direktivy # pragma k implementaci spravované a nespravované funkce ve stejném souboru, ale tyto funkce spolupracují stejným způsobem, pokud jsou definovány v samostatných souborech. Soubory obsahující pouze nespravované funkce nemusí být kompilovány s /clr (Common Language Runtime Compilation).

Toto téma ukazuje, jak mohou být řetězce kódování Unicode předány ze spravované do nespravované funkce a naopak. Více informací o spolupráci s jinými typy řetězců, naleznete v následujících tématech:

Příklad

K předání řetězce kódování Unicode ze spravované do nespravované funkce, lze použít funkci PtrToStringChars (deklarované v Vcclr.h), k přístupu do paměti, kde je uložen spravovaný řetězec. Vzhledem k tomu, že tato adresa bude předána nativní funkci, je důležité, aby byla připojená paměť s pin_ptr. K zabránění přemístění datům řetězce, by měl být při spuštění nativní funkce zahájen cyklus uvolňování paměti.

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

Následující příklad znázorňuje potřebné zařazování data k přístupu do řetězce kódování Unicode ve spravované funkci zavolaný nespravovanou funkcí. Po obdržení nativního řetězce kódování Unicode převede spravovaná funkce tento řetězec na spravovaný řetězec pomocí metody 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) received '{0}'", ms);
}

#pragma unmanaged

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

#pragma managed

int main() {
   NativeProvidesAString();
}

Viz také

Odkaz

Použití interoperability C++ (implicitně PInvoke)