Шаг 220.
Microsoft Visual C++ 2010. Язык С/С++. Преобразование между регулируемыми и нерегулируемыми... . Пример 9. Преобразование System::String в wchar_t* или char*

    На этом шаге мы приведем программу, реализующую указанное преобразование.

    Метод PtrToStringChars() из vcclr.h можно использовать для преобразования строки System:: String в native-строку типа wchar_t* или char*.

    Метод возвращает указатель на Юникод-строку, т. к. строки CLR - это строки Юникода. Затем, как показано в примере, вы можете конвертировать "широкую" строку в обычную.

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

// 220_1.cpp: главный файл проекта.

#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <vcclr.h> //for PtrTostringChars()

using namespace System;

void main()
{
	String^ str = "Hello from our friends!";
	// Преобразование String-строки в тип wchar_t в управляемой куче
	// и формирование pin-указателя на новую строку (указателя-фиксатора)
	// чтобы строка не переместилась в куче, пока будет идти
	// вызов native-функции printf():
	pin_ptr<const wchar_t> wch = PtrToStringChars(str);
	printf_s("%S\n", wch);

	// преобразование к типу char*:
	// можно сразу перевести wchar_t* в char*, используя одну
	// из функций-преобразователей WideCharToMultiByte() и wcstombs_s():
	size_t convertedChars = 0;
	size_t sizeInBytes = ((str->Length + 1) * 2);
	errno_t err = 0;

	// выделение памяти в неуправляемой куче
	// под размер managed-строки;
	// ch будет на нее указывать:
	char *ch = new char [sizeInBytes];
	err = wcstombs_s(&convertedChars, // кол-во преобразованных символов
		ch,   // адрес, с которого они будут записываться
		sizeInBytes, // размер буфера ch
		wch,  // адрес исходной строки
		sizeInBytes); // максимальное количество переписываемых байтов 
	if (err != 0)
		printf_s("wcstombs_s  failed!\n");

	printf_s("%s\n", ch); //вывод переписанной строки 
	delete [] ch;
	_getch();
}
Архив проекта можно взять здесь.


Рис.1. Результат преобразования System::String-строки в wchar_t* и char*

    На следующем шаге мы рассмотрим преобразование String-строки в string-строку.




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