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

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


printf( (native) recieved %S\n , p);

Jpragma managed

int main ()

String s = gcnew String( test string ); pin j3tr<const wchar t> str = PtrToStringChars(s);

метод размещает s в управляемой куче и вьщает native-указатель типа const Char ptr на размещенный объект. Этот указатель с помощью оператора

[cli::]pin ptr<cv qualifier type> var = Sinitializer;

преобразуется в тип const wchar t. Здесь:

cv gualifier - квалификатор const или квалификатор volatile.

Квалификатор volatile показывает, что поле может модифицироваться

многочисленными средами, выполняющимися в данный момент,

и все изменения данного поля будут присутствовать в этсм поле.

Указатель типа pin ptr по умолчанию имеет квалификатор volatile,

поэтому в операторе применен квалификатор const,

чтобы объект в куче не изменял своего значения, а не только

место расположения.

initializer - зто ссылочный тип данного: элемент managed-массива или любого другого объекта, которому вы назначаете native-укаэатель. Метод PtrToStringChars() как раз и выдает такой указатель: native-укаэатель в управляемой (managed) куче, type - тип initializerа. В нашем случае это wchar t, var - имя pin ptr указателя. В нашем случае это str. То есть str - это уже native-укаэатель String -строки в управляемой куче.

Console::WriteLine( (managed) passing string to native func... ); /*вывод сообщения из managed-функции*/ ,



NativeTakesAString( str );

/*вызов native-функции, которая вьшаст native-сообщение*/

ST C:\WINDOWS\system32Vcmd.exe

<nianaged> passing string to native func,

<natiMe> recieued test string

Для продолжения нажмите любую клавишу .

Рис. 14.3. Результат преобразования Юникод-строки в native-строку

Здесь применен указатель pinptr (указатель от зашкаливания, как определяют его авторы). Это внутренний указатель, который предотвращает объект (на который он указывает) от какого-либо перемещения в управляемой куче (памяти, с которой работает режим CLR): значение указателя не изменяется средой CLR. Такое условие необходимо при передаче адреса managed-объекта native-функции, потому что этот адрес не должен меняться во время вызова native-функции.

Пример 4.

Преобразование строки wcharjt в String-строку

Это преобразование - обратное приведенному в примере 3. Преобразование, которое мы рассматриваем, фактически переводит native Юникод-строку в состояние managed. А В ЭТОМ СОСТОЯНИИ со строкой уже можно работать, применяя managed-указатель Текст программы показан в листинге 14.4, результат - на рис. 14.4.

/I 2008-Marshal wchar t to Unicod.cpp : main project file.

ttinclude stdafx.h

ttinclude <stdio.h> . .

using nemiespace System;

using nemiespace System::Runtime:: InteropServices;.



I Преобразование между нерегулируемыми и регулируемыми указателями... Ipragma managed

void ManagedStringFunc (wchar t* s) I

String ms = Marshal::PtrToStringUni((IntPtr)s);

копирует native-cMMBonH строки s в Юникоде в native-кучу, гфеобраэовьшая их в managed-строку и выдает managed-указатель на место расположения строки.

Аргумент метода по его определению должен иметь

тип IntPtr (внутренний указатель), поэтому s преобразуется

к этому типу.

Console::WriteLine( (managed) recieved {01 , ms);

pragma unmanaged

void NativeProvidesAString ()

printf( (unmanaged) calling managed func...\n ), ManagedStringFunc(L test string );

hpragma managed

i int main 0 (

NativeProvidesAString 0 ; 1)

~ C:\WINOOWS\system32\cmd.exe

uniiianaged> calling managed func... (managed) recieued test string Пля продолжения нажмите любую клавишу

Рис. 14.4. Результат преобразования wchar tB String



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

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