Postupy: Zařazování řetězců v kódu Unicode pomocí zprostředkovatele komunikace C++
Toto téma ukazuje jednu omezující vlastnost interoperability Visual C++. Další informace naleznete v tématu Použití Zprostředkovatele komunikace C++ (Implicit PInvoke).
Následující příklady kódu používají spravované, nespravované direktivy #pragma k implementaci spravovaných a nespravovaných funkcí ve stejném souboru, ale tyto funkce vzájemně fungují stejným způsobem, pokud jsou definovány v samostatných souborech. Soubory obsahující pouze nespravované funkce nemusí být kompilovány pomocí /clr (Common Language Runtime Compilation).
Toto téma ukazuje, jak lze řetězce Unicode předat ze spravované funkce do nespravované funkce a naopak. Pokud chcete spolupracovat s jinými typy řetězců, přečtěte si následující témata:
Postupy: Zařazování řetězců v kódu ANSI pomocí zprostředkovatele komunikace C++
Postupy: Zařazování řetězců modelu COM pomocí zprostředkovatele komunikace C++
Příklad: Předání řetězce Unicode ze spravované do nespravované funkce
Pokud chcete předat řetězec Unicode ze spravované funkce do nespravované funkce, je možné použít funkci PtrToStringChars (deklarovanou v souboru Vcclr.h) pro přístup do paměti, ve které je uložený spravovaný řetězec. Vzhledem k tomu, že se tato adresa předá nativní funkci, je důležité, aby se paměť připnula pomocí pin_ptr (C++/CLI), aby se zabránilo přemístění řetězcových dat, pokud by se během provádění nespravované funkce prováděl 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 );
}
Příklad: Zařazování dat vyžadované pro přístup k řetězci Unicode
Následující příklad ukazuje zařazování dat vyžadované pro přístup k řetězci Unicode ve spravované funkci volané nespravovanou funkcí. Spravovaná funkce při příjmu nativního řetězce Unicode ji pomocí metody převede na spravovaný řetězec 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é
Použití zprostředkovatele komunikace C++ (implicitní služba PInvoke)