В настоящее время вы работаете в автономном режиме; ожидается повторное подключение к Интернету

Преобразование System::String* в Char* в Visual C++

Данная статья ссылается на следующие пространства имен библиотеки классов Microsoft .NET Framework:
  • System::Runtime::InteropServices
  • Msclr::interop
Аннотация
В этой статье рассматривается несколько способов преобразования System::String* в char* с помощью следующих средств.
  • Управляемые расширения для C++ в Microsoft Visual C++ .NET 2002 и в Microsoft Visual C++ .NET 2003
  • C++/CLI в Microsoft Visual C++ 2005 и в Microsoft Visual C++ 2008

Способ 1

PtrToStringChars предоставляет внутренний указатель на реальный объект String. При передаче этого указателя в неуправляемый вызов функции сначала необходимо прикрепить указатель, чтобы объект не был перемещен во время асинхронного процесса сборки мусора.
//#include <vcclr.h>System::String * str = S"Hello world\n";const __wchar_t __pin * str1 = PtrToStringChars(str);wprintf(str1);					

Способ 2

StringToHGlobalAnsi копирует содержимое управляемого объекта String в собственную кучу, а затем "на лету" преобразует его в формат ANSI. Этот метод выделяет необходимую память для собственной кучи.
//using namespace System::Runtime::InteropServices;System::String * str = S"Hello world\n";char* str2 = (char*)(void*)Marshal::StringToHGlobalAnsi(str);printf(str2);Marshal::FreeHGlobal(str2);				
Примечание. Чтобы успешно выполнить компиляцию предыдущего примера кода в Visual C++ 2005 и Visual C++ 2008, необходимо добавить параметр компилятора для поддержки среды CLR (/clr:oldSyntax).Чтобы добавить параметр компилятора для поддержки среды CLR, выполните следующие действия.
  1. Нажмите кнопку Проект, а затем — Свойства Имя_проекта.

    Примечание. Имя_проекта — это имя вашего проекта.
  2. Разверните пункт Свойства конфигурации, а затем — пункт Общие.
  3. В правой области щелчком выделите Поддержка среды CLR, старый синтаксис (/clr:oldSyntax) в параметрах Поддержка среды CLR для проекта.
  4. Нажмите кнопку Применить, а затем — кнопку ОК.
Дополнительные сведения о параметрах компилятора для поддержки среды CLR см. на следующем веб-сайте MSDN: Эти действия применимы ко всей статье.

Способ 3

Класс CString в VC7 имеет конструктор, который получает управляемый указатель String и загружает его содержимое в CString:
//#include <atlstr.h>System::String * str = S"Hello world\n";CString str3(str); printf(str3);				

Способ 4

Visual C++ 2008 имеет класс справки маршалинга marshal_as<T> и класс вспомогательного приложения маршалинга marshal_context().
//#include <msclr/marshal.h>//using namespace msclr::interop;marshal_context ^ context = gcnew marshal_context();const char* str4 = context->marshal_as<const char*>(str);puts(str4);delete context;
Примечание. Этот код нельзя скомпилировать, используя управляемые расширения для C++ в Visual C++ .NET 2002 или в Visual C++ .NET 2003. В нем используется новый синтаксис C++/CLI, появившийся в Visual C++ 2005 и новый код пространства имен msclr, появившийся в Visual C++ 2008. Чтобы успешно скомпилировать этот код в Microsoft Visual C++ 2008, необходимо использовать параметр компилятора C++ /clr.

Управляемые расширения для примера кода на C++ (Visual C++ 2002 или Visual C++ 2003)

//параметр компилятора: cl /clr  #include <vcclr.h>#include <atlstr.h>#include <stdio.h>#using <mscorlib.dll>using namespace System;using namespace System::Runtime::InteropServices;int _tmain(void){   	System::String * str = S"Hello world\n";	//способ 1	const __wchar_t __pin * str1 = PtrToStringChars(str);	wprintf(str1);		//способ 2	char* str2 = (char*)(void*)Marshal::StringToHGlobalAnsi(str);	printf(str2);	Marshal::FreeHGlobal(str2);	//способ 3	CString str3(str); 	wprintf(str3);    return 0;}				

Пример кода C++/CLI (Visual C++ 2005 и Visual C++ 2008)

//параметр компилятора: cl /clr #include <atlstr.h>#include <stdio.h>#using <mscorlib.dll>using namespace System;using namespace System::Runtime::InteropServices;#if _MSC_VER > 1499 // Только для Visual C++ 2008#include <msclr/marshal.h>using namespace msclr::interop;#endif int _tmain(void){		     System::String ^ str = "Hello world\n";	     /способ 1	     pin_ptr<const wchar_t> str1 = PtrToStringChars(str);     	wprintf(str1);		     //способ 2	     char* str2 = (char*)Marshal::StringToHGlobalAnsi(str).ToPointer();     	printf(str2);	     Marshal::FreeHGlobal((IntPtr)str2);	     //способ 3	     CString str3(str); 	     wprintf(str3);     	//способ 4#if _MSC_VER > 1499 // Только для Visual C++ 2008	     marshal_context ^ context = gcnew marshal_context();	     const char* str4 = context->marshal_as<const char*>(str);     	puts(str4);	     delete context;#endif	return 0;}
Ссылки
Другие популярные статьи базы знаний Майкрософт о Visual C++ .NET см. на следующем веб-сайте Майкрософт:
kbVC700
Свойства

Номер статьи: 311259 — последний просмотр: 09/05/2013 13:27:00 — редакция: 10.0

  • Microsoft Visual C++ 2008 Express Edition
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • kbhowtomaster kbmanaged kbnewsgrouplink KB311259
Отзывы и предложения