Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье описывается несколько способов преобразования из System::String*
char*
использования управляемых расширений в Visual C++.
Исходная версия продукта: Visual C++
Исходный номер базы знаний: 311259
Итоги
В этой статье рассматриваются следующие пространства имен библиотеки классов Microsoft платформа .NET Framework:
System::Runtime::InteropServices
Msclr::interop
В этой статье рассматривается несколько способов преобразования из System::String*
char*
следующего:
- Управляемые расширения для C++ в Visual C++ .NET 2002 и Visual C++ .NET 2003
- C++/CLI в Visual C++ 2005 и 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, выполните следующие действия.
Щелкните "Проект" и выберите "Свойства ProjectName".
Примечание.
Имя проекта — это заполнитель для имени проекта.
Разверните свойства конфигурации и нажмите кнопку "Общие".
В правой области щелкните, чтобы выбрать поддержку среды clr (/clr:oldSyntax) в параметрах проекта поддержки среды CLR.
Щелкните Применить, затем щелкните ОК.
Дополнительные сведения о параметрах компилятора поддержки среды CLR см. на следующем веб-сайте Microsoft Developer Network (MSDN):
/clr (компиляция среды выполнения)
Эти действия применяются ко всей статье.
Метод 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>
класс справки маршала и вспомогательный 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++ в 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;
}