|
Программирование >> Элементы языков с и с++
const char* chars = (const char*) (Marshal::StringToHGlobalAnsi(s)).ToPointerO ; /*os - указатель на строку с символами char:*/ OS = chars; /*освобождение памяти в неуправляемой куче, которую занимает строка:*/ Marshal::FreeHGlobal(IntPtr((void*)chars)); -----------------функция копирует s в os типа wstring-------------- void MarshalString ( String s, wstring & os ) { /*Маршал-метод копирует содержимое managed-строки в неуправляемую память (кучу) и выдает указатель типа void для его последующего преобразования в необходимый тип (в даннсжл случае в const wchar t*): */ const wchar t* chars = (const wchar t*) (Marshal::StringToHGlobalUni(s)).ToPointer() ; OS = chars; теперь можно присвоить, т.к переменные одного типа /*освобождение памяти в неуправляемой куче, которую занимает строка:*/ Marshal::FreeHGlobal(IntPtr((void*)chars)); int mainO { string a = test ; wstring b = L test2 ; широкая строка (по 2 байта на символ) String с = gcnew String( abed ); cout a endl; вывод строки a MarshalString(с, a); перезапись с в a с = efgh ; MarshalString(с, b); перезапись с в b cout a endl; вывод a wcout b endl; вывод b сТ C:\WINDOWS\system32\cmd.exe 1Я продолжения нажмите любую клавишу . . . Рис. 14.11. Результат работы со строками string, string и wstring i Пример 11. Преобразование sfr/лд-строки в Str/лд-строку Текст программы показан в листинге 14.12, а результат- на рис. 14.12. Листинг 14.12 2008-string to String.срр : main project file. iinclude stdafx.h iinclude <string> linclude <iostream> using namespace System; using namespace std; int tnainO { string str = test ; можно записать и так, используя конструктор: string str = string( test ); cout str endl; /*метол c str() класса string преобразует string-строку в обычную С-строку с символом \0 в качестве признака конца строки. string-строка такого признака конца не имеет и этот символ может быть обычным ее символсжл. string-строка - это аналог AnsiString-строки в С++ Builder*/ string str2 = gcnew String(str.c strО); Console::WriteLine(str2); C:\WINDOWS\systero32\cmd.exe я продолжения нажмите любую клавишу Рис. 14.12. Результат преобразования string в String Пример 12. Объявление дескрипторов в native-типах Дескрипторами называют указатели в среде CLR. Именно они указывают на объект в управляемой куче. Напрямую нельзя объявить дескриптор в native-типе. Например, в native-функции вы не можете сделать объявление типа такого: String s; Компилятор вам выдаст ошибку. Файл vcclr.h содержит специальный настраиваемый шаблон gcroot, позволяющий ссылаться на CLR-объекты из С++ кучи, т. е. объекты из неуправляемой кучи могут ссылать на объекты из управляемой кучи. Тем самым устанавливается связь между различными средами. При этом вам позволяется использовать дескриптор в native-типе (например, в функции) и трактовать его как основной тип. Шаблон gcroot создан на основе класса: System::Runtime::InteropServices::GCHandle, который обеспечивает дескрипторами объекты в управляемой куче. Отметим, что сами дескрипторы автоматически удаляются деструктором класса gcroot только тогда, когда они больше не используются. Их нельзя удалять вручную Если же вы создаете gcroot-объект в native-куче (т. е. в неуправляемой), то должны сами вызвать оператор delete для освобождения ресурса. В режиме исполнения программы поддерживается постоянная связь между дескриптором и CLR-объектом, на который он указывает. Если объект
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |