Перетворення з System::String * * Char в Visual C++

Номер статті: 311259 - Показ продуктів, яких стосується ця стаття.
Ця стаття відноситься до таких Microsoft бібліотека класів .NET Framework простори імен:
  • System::Runtime::InteropServices
  • Msclr::interop
Розгорнути все | Згорнути все

На цій сторінці

ПІДСУМКИ

У цій статті розглянуто кілька способів перетворити з System::String * char * за допомогою таких дій:
  • Керував розширень для C++ в Visual C++ Microsoft .net 2002 і в Visual C++ Microsoft .net 2003
  • C + + / CLI у Microsoft Visual c + + 2005 та в Microsoft Visual c + + 2008

Спосіб 1

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

Спосіб 2

StringToHGlobalAnsi копіювання вмісту керованих рядок об'єкта, до рідної купи, і потім конвертує його в американський національних стандартів інститут (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);
				
Примітка 2005 Року Visual C++ і Visual c + + 2008 необхідно додати Загальні виконавчі мови підтримки компілятор параметр (/ clr:oldSyntax) успішно узагальнити попередні зразок коду. Щоб додати Загальні виконавчі мови підтримки компілятор параметр, виконайте такі дії:
  1. Натисніть кнопку Проекта потім натисніть кнопку ProjectName Властивості.

    ПриміткаProjectName — це назва проекту.
  2. деталізувати Налаштування властивостейа потім натисніть кнопку Загальні.
  3. У правій області клацніть, щоб вибрати Загальні виконавчі файли підтримки мови, старий синтаксис (/ clr:oldSyntax) у регіоні Загальні виконавчі мови підтримки налаштування проекту.
  4. Натисніть кнопку Застосуватиа потім натисніть кнопку Гаразд.
Щоб отримати додаткові відомості про Загальні виконавчі файли підтримки компілятор стандарти відвідайте веб-сайт корпорації Майкрософт розробників (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_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 C++ компілятор перемикач у Microsoft Visual c + + 2008.

Керував розширень для зразка коду (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 зразки коду (2005 року Visual C++ і 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 бази знань Майкрософт статті, відвідайте такий веб-сайт корпорації Майкрософт:
http://support.Microsoft.com/default.aspx?xmlid=FH%3BEN-US%3Bvcnet
Щоб отримати більш загальну інформацію про Visual C++ .net, відвідайте на такі групи новин Microsoft Usenet:
Microsoft.Public.DOTNET.languages.VC

Властивості

Номер статті: 311259 - Востаннє переглянуто: 29 червня 2012 р. - Редакція: 2.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 KbMtuk
Машинний переклад
УВАГА! Цю статтю переклала програма машинного перекладу Microsoft, а не людина. Корпорація Microsoft пропонує вам як машинні переклади, так і переклади фахівців, щоб Ви мали доступ до всіх статей бази знань рідною мовою. Проте стаття, яку переклав комп’ютер, не завжди бездоганна. Вона може містити лексичні, синтаксичні або граматичні помилки. Так само помиляється іноземець, спілкуючись вашою рідною мовою. Корпорація Microsoft не несе відповідальність за жодні неточності, помилки або шкоду, завдану неправильним перекладом змісту або його використанням з боку користувачів. Крім того, корпорація Microsoft часто оновлює програму машинного перекладу.
Клацніть тут, щоб переглянути цю статтю англійською мовою: 311259

Надіслати відгук