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

1 ... 182 183 184 [ 185 ] 186 187 188 ... 200


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-объектом, на который он указывает. Если объект



1 ... 182 183 184 [ 185 ] 186 187 188 ... 200

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