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

Переводы статьи Переводы статьи
Код статьи: 311259 - Vizualiza?i produsele pentru care se aplic? acest articol.
Данная статья ссылается на следующие пространства имен библиотеки классов 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:
http://msdn.microsoft.com/ru-ru/library/k8d11d4s.aspx
Эти действия применимы ко всей статье.

Способ 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 см. на следующем веб-сайте Майкрософт:
http://support.microsoft.com/default.aspx?xmlid=fh%3BEN-US%3Bvcnet

Свойства

Код статьи: 311259 - Последний отзыв: 5 сентября 2013 г. - Revision: 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

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com