|
Программирование >> Элементы языков с и с++
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
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |