Программирование >>  Элементы языков с и с++ 

1 ... 176 177 178 [ 179 ] 180 181 182 ... 200


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)



1 ... 176 177 178 [ 179 ] 180 181 182 ... 200

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика