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

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


Глава 14

Преобразование

между нерегулируемыми

и регулируемыми (режим CLR)

указателями

На практике часто встречаются случаи, когда требуется переходить от обычных указателей к регулируемым и наоборот (еще говорят переход от native-среды к managed-среде и наоборот ). Этот процесс называют маршаллингом. Среда VC++ содержит специальную библиотеку, предназначенную для этих целей. Эту библиотеку можно использовать без так называемого marshaicontext Class, однако некоторые преобразования требуют наличия этого класса. Другие преобразования используют функцию marshaias о. В табл. 14.1 представлены поддерживаемые преобразования с учетом требования контекста, задаваемого классом marshaicontext class.

Таблица 14.1. Преобразование между нерегулируемыми и регулируемыми

указателями

Из типа

В тип

Marshal-метод

Какой файл надо подключать (Include file)

System: : String

const char *

marshal context

marshal, h

const char *

System::String

marshal as

marshal, h

char *

System: :String

marshal as

marshal.h

System: : String

const wchar t*

marshal context

marshal, h

const wchar t *

System::String

marshal as

marshal.h

wchar t *

System::String

marshal as

marshal.h



Таблица 14.1 (окончание)

Из типа

В тип

Marshal-метод

Какой файл надо подключать (Include file)

System::IntPtr

handle

marshal as

marshal windows.h

handle

System::IntPtr

marshal as

marshal windows.h

System::String

BSTR

marshal context

marshal windows.h

BSTR

System::String

marshal as

marshal.h

System::String

bstr t

marshal as

marshal windows.h

bstr t

System::String

marshal as

marshal windows.h

System::String

std::string

marshal as

marshal cppstd.h

std::string

System::String

marshal as

marshal cppstd.h

System::String

std::wstring

marshal as

marshal cppstd.h

std::wstring

System::String

marshal as

marshal cppstd.h

System::String

CStringT<char>

marshal as

marshal atl.h

CStringT<char>

System::String

marshal as

marshal atl.h

System::String

CStringT<wchar t>

marshal as

marshal atl.h

CStringT<wchar t>

System::String

marshal as

marshal atl.h

System::String

CComBSTR

marshal as

marshal atl.h

CComBSTR

System::String

marshal as

marshal atl.h

Маршаллинг требует контекстного файла только в том случае, когда выполняется преобразование из управляемого типа в родной (native) тип и при этом native-тип, в который идет преобразование, не имеет деструктора для автоматического освобождения памяти от объекта. Вот тогда маршаллинг-контекст разрушает размещенный объект native-типа своим деструктором. Поэтому преобразования, требующие маршаллинг-контекста, действительны только до момента удаления контекста. Чтобы сохранить любое мар-шаллинг-значение, вы должны скопировать его в свою собственную переменную. Если строке присвоено значение nulls, результат преобразования такой строки не гарантируется.



Пример 1.

Перевод строки String в ASCII-строку

Текст программы показан в листинге 14.1, результат - на рис. 14.1.

р-.................

Листинг 14.1

2008 marshl.срр : main project file. Itinclude stdafx.h

Itinclude <stdio.h> *

using namespace System;

using namespace System::Runtime::InteropServices;

ttpragma unmanaged

/*сигнал компилятору, что далее следуют unmanaged-функции, работающие с обычными (native) переменными, которые станут размещаться в неуправляемой куче (памяти), за переполнением которой надо следить самому - вовремя освобождать от занимающих ее объектов

void NativeTakesAString(const char* p) I

printf( (native) received %s\n , p);

ttpragma managed

/♦сигнал компилятору, что далее следуют managed-функции, работающие со средой CLR, в которой переменные станут размещаться в управляемой куче (памяти), за переполнением которой не надо следить Сс1мому - среда CLR сама позаботится об ее освобождении от занимаемых объектов

V .

На практике для использования маршаллинга достаточно подключить к вашей программе пространство имен:

using namespace System::Runtime::InteropServices.



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

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