На этом шаге мы приведем программу, реализующую указанное преобразование.
Текст программы приведен ниже, а результат ее работы - на рисунке 1.
// 213_1.cpp: главный файл проекта. #include "stdafx.h" #include <stdio.h> #include <conio.h> using namespace System; using namespace System::Runtime::InteropServices; #pragma managed void ManagedStringFunc(char* s) // здесь managed-функция получает native-аргумент { String^ ms = Marshal::PtrToStringAnsi(static_cast<IntPtr>(s)); // метод PtrToStringAnsi() копирует native-строку s в // managed-пространство, преобразуя каждый символ ASCII в Юникод, // и выдает указатель на месторасположение новой строки в // переменную s, которая преобразуется в тип IntPtr. // Затем этот тип преобразуется оператором static_cast // в тип String^ Console::WriteLine("(managed): received '{0}'", ms); } #pragma unmanaged void NativeProvidesAString() //это native-функция, которая вызывает //managed-функцию { printf("(native) calling managed func..\n"); ManagedStringFunc("test string"); } #pragma managed int main() //это managеd-функцин, которая вызывает native-функцию { NativeProvidesAString(); _getch(); }
Рис.1. Результат перевода managed-строки в native-строку
На следующем шаге мы приведем пример программы, выполняющей преобразование String^ строки в строку wchar_t.