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

Код статьи: 311259 - Список продуктов, к которым относится данная статья.
В данной статье относится к следующим Пространства имен библиотеки классов платформа.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: oldSyntax) для успешной компиляции из предыдущего примера. Чтобы добавить параметр компилятора поддержки среды, выполните следующие действия.
  1. Нажмите кнопку Проект, а затем нажмите кнопку Имя_проекта Свойства.

    ПримечаниеИмя_проекта — Это имя проекта.
  2. Разверните узел Свойства конфигурации, а затем нажмите кнопку Общие.
  3. В области справа щелкните, чтобы выбрать Поддержка Common Language Runtime, старый синтаксис (/ CLR: oldSyntax) в Поддержка среды CLR Параметры проекта.
  4. Нажмите кнопку Применить, а затем нажмите кнопку ОК.
Дополнительные сведения о вариантах поддержки компилятора общий язык среды выполнения посетите следующий веб-узел Microsoft Developer Network (MSDN):
http://msdn2.Microsoft.com/en-us/library/k8d11d4s.aspx
Эти действия применимы ко всей статьи.

Способ 3

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

Способ 4

Знакомство с Visual C++ 2008 marshal_as<T> </T> маршалинга класса справки и вспомогательного класса marshal 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 , который был представлен в Visaul C++ 2008. Для успешной компиляции кода, необходимо использовать параметр компилятора /clr/CLR C++ в Microsoft Visual C++ 2008.

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

//compiler option: 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";

	//method 1
	const __wchar_t __pin * str1 = PtrToStringChars(str);
	wprintf(str1);	

	//method 2
	char* str2 = (char*)(void*)Marshal::StringToHGlobalAnsi(str);
	printf(str2);
	Marshal::FreeHGlobal(str2);

	//method 3
	CString str3(str); 
	wprintf(str3);

    return 0;
}
				

C + +/ CLI образец кода (Visual C++ 2005 и Visual C++ 2008)

//compiler option: 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 only
#include <msclr/marshal.h>
using namespace msclr::interop;
#endif 

int _tmain(void)
{
		     System::String ^ str = "Hello world\n";

	     /method 1
	     pin_ptr<const wchar_t> str1 = PtrToStringChars(str);
     	wprintf(str1);	

	     //method 2
	     char* str2 = (char*)Marshal::StringToHGlobalAnsi(str).ToPointer();
     	printf(str2);
	     Marshal::FreeHGlobal((IntPtr)str2);

	     //method 3
	     CString str3(str); 
	     wprintf(str3);

     	//method 4
#if _MSC_VER > 1499 // Visual C++ 2008 only
	     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 Microsoft Knowledge Base статьи, посетите следующий веб-узел корпорации Майкрософт:
http://support.Microsoft.com/default.aspx?xmlid=fh%3BEN-US%3Bvcnet

Свойства

Код статьи: 311259 - Последнее изменение :: 30 декабря 2012 г. - Редакция: 8.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 kbmt KB311259 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке: 311259

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