Udostępnij za pośrednictwem


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:

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)