На этом шаге мы приведем программу, реализующую указанное преобразование.
Это преобразование - обратное приведенному в примере 3 предыдущего шага. Преобразование, которое мы рассматриваем, фактически переводит native Юникод-строку в состояние managed. А в этом состоянии со строкой уже можно работать, применяя managed-указатель ^.
Текст программы приведен ниже, а результат - на рисунке 1.
// 215_1.cpp: главный файл проекта. #include "stdafx.h" #include <stdio.h> #include <conio.h> using namespace System; using namespace System::Runtime::InteropServices; #pragma managed void ManagedStringFunc(wchar_t* s) { String^ ms = Marshal::PtrToStringUni( (IntPtr)s ); // копирует native-символы строки s в Юникоде в // native-кучу, преобразовывая их в managed-строку // и выдает managed-указатель на место расположения // строки. // Аргумент метода по его определению должен иметь // тип IntPtr (внутренний указатель), поэтому s // преобразуется к этому типу. Console::WriteLine("(managed) recieved '{0}'", ms); } #pragma unmanaged void NativeProvidesAString() { printf("(unmanaged) calling managed func...\n"); ManagedStringFunc (L"test string"); } #pragma managed void main() { NativeProvidesAString(); _getch(); }
Рис.1. Результат преобразования wchar_t в String^
На следующем шаге мы рассмотрим маршаллинг native-структуры.