Шаг 211.
Microsoft Visual C++ 2010. Язык С/С++. Преобразование между регулируемыми и нерегулируемыми указателями (общие сведения)

    На этом шаге мы приведем общие сведения о маршаллизации.

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

    В таблице 1 представлены поддерживаемые преобразования с учетом требования контекста, задаваемого классом marshal_context Class.

Таблица 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
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, результат преобразования такой строке не гарантируется.

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

  using namespace System::Runtime::InteropServices    .

    На следующем шаге мы рассмотрим перевод строки String^ в ASCII-строку.




Предыдущий шаг Содержание Следующий шаг