|
Программирование >> Элементы языков с и с++
int main(array<SystGin::String > args) ( . String s = gcnew String( sample string ); IntPtr ip = Marshal::StringToHGlobalAnsi(s); /♦этот метод вьщеляет для s место в неуправляемой куче и указатель на это место передает в структуру IntPtr. Указатель имеет тип void, т.е. его еще надо настроить на конкретный тип данного*/ const char* str = static cast<const char*>(ip.ToPointer()); /*кастинг указателя: настройка его на native-тип char* с помощью оператора static cast <type-id> (expression). Теперь указатель str типа char будет настроен в неуправляемой куче на начало переменной s. Так как S - константа, то у указателя str взят квалификатор const, говорящий о том, что значение, на которое указывает указатель, изменять нельзя */ . Console::WriteLine( (managed) passing string... ); /*т.к. мы находимся в managed-методе (mainO, то и вывод идет по WriteLine О)*/ NativeTakesAString( str ); вызов native-метода внутри managed-метода Marshal::FreeHGlobal( ip ); /*этот метод освобождает память, выделенную StringToHGlobalAnsi(s): т.к. это уже неуправляемая куча, то память надо освобождать самому */ C:\WINDOWS\system32\cmd.exe <nana9ed> passing string... <nati e> received sanple string ilifl продолжения нажните любую клавишу Рис. 14.1. Результат перевода native-строки в managed-строку Пример 2. Перевод ASCII-строки в String-строку Текст программы показан в листинге 14.2, результат- на рис. 14.2. iinclude stdafx.h iinclude <stdio.h> using namespace System; using namespace System::Runtime::InteropServices; ipragma managed void ManagedStringFunc(char* s) /*здесь managed-функция получает native-аргумент*/ String ms = Marshal::PtrToStringAnsi(static cast<IntPtr>(s)); . /♦метод PtrToStringAnsi0 копирует native-строку s в managed-пространство, преобразуя каадый символ ASCII в Юникод, и вьщает указатель на месторасположение новой строки в переменную s, которая преобразуется в тип IntPtr. Затем этот тип преобразуется оператором static cast в тип String */ Console::WriteLine( (managed): received {0) , ms); ipragma unmanaged void NativeProvidesAStringO это native-функция, которая-вызывает man-aged-функцию printf( (native) calling managed func...\n ); ManagedStringFunc( test string ); ipragma managed int main 0 это managed-функция, которая вызывает native-функцию ( NativeProvidesAString(); CV C:\WINDOWS\system32\cmd.exe (natiue) calling nanaged func... (managed): received test string [Цля продолжения нажните любую клавишу Рис. 14.2. Результат преобразования managed-строки в native-строку Пример 3. Преобразование String-строки в строку wcharjt Тип wchart - это native-тип символа по таблице Юникода. Этот тип данного отличается от типа char тем, что символ кодируется двумя байтами, а не одним. Класс string тоже создает строку из Юникод-символов, однако по своему определению относится к managed-типу. Преобразование, которое мы рассматриваем, фактически переводит Юникод-строку из состояния managed в состояние native. А в этом состоянии со строкой уже можно работать, применяя обычный указатель *. Юникод-тексты можно вводить в файлы и читать из них соответственно функциями fputws и fgetws. Текст программы показан в листинге 14,3, а результат - на рис. 14.3. f Листинг 14.3 2008-Marshal String to wchar t.cpp : main project file. #include stdafx.h ttinclude <stdio.h> для printf() ttinclude <vcclr.h> для PtrToStringChars() using namespace System; using namespace System::Runtime::InteropServices; ttpragma unmanaged void NativeTakesAString(const wchar t* p)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |