Porady: przeprowadzanie marshalingu ciągów Unicode za pomocą międzyoperacyjności języka C++
W tym temacie przedstawiono jeden aspekt współdziałania języka Visual C++. Aby uzyskać więcej informacji, zobacz Using C++ Interop (Implicit PInvoke) (Używanie międzyoperacyjności języka C++ (niejawna funkcja PInvoke).
Poniższe przykłady kodu używają zarządzanych, niezarządzanych dyrektyw #pragma do implementowania funkcji zarządzanych i niezarządzanych w tym samym pliku, ale te funkcje współdziałają w taki sam sposób, jeśli są zdefiniowane w oddzielnych plikach. Pliki zawierające tylko funkcje niezarządzane nie muszą być kompilowane za pomocą polecenia /clr (kompilacja środowiska uruchomieniowego języka wspólnego).
W tym temacie przedstawiono sposób przekazywania ciągów Unicode z zarządzanej do niezarządzanej funkcji i odwrotnie. Aby uzyskać informacje o współdziałaniu z innymi typami ciągów, zobacz następujące tematy:
Instrukcje: przeprowadzanie marshalingu ciągów ANSI za pomocą międzyoperacyjności języka C++
Instrukcje: przeprowadzanie marshalingu ciągów COM za pomocą międzyoperacyjności języka C++
Przykład: Przekazywanie ciągu Unicode z zarządzanej do niezarządzanej funkcji
Aby przekazać ciąg Unicode z zarządzanej do funkcji niezarządzanej, funkcja PtrToStringChars (zadeklarowana w pliku Vcclr.h) może służyć do uzyskiwania dostępu do pamięci, w której przechowywany jest ciąg zarządzany. Ponieważ ten adres zostanie przekazany do funkcji natywnej, ważne jest, aby pamięć została przypięta za pomocą pin_ptr (C++/CLI), aby zapobiec przeniesieniu danych ciągu, jeśli podczas wykonywania funkcji niezarządzanej następuje cykl odzyskiwania pamięci.
// 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 );
}
Przykład: przeprowadzanie marshalingu danych wymaganych do uzyskania dostępu do ciągu Unicode
W poniższym przykładzie pokazano marshaling danych wymagany do uzyskania dostępu do ciągu Unicode w funkcji zarządzanej wywoływanej przez funkcję niezarządzaną. Funkcja zarządzana, po otrzymaniu natywnego ciągu Unicode, konwertuje go na ciąg zarządzany przy użyciu PtrToStringUni metody .
// 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();
}
Zobacz też
Korzystanie z międzyoperacyjności języka C++ (niejawna funkcja PInvoke)