Jak převést z System::String * Char * v aplikaci Visual C++

Tento článek se týká následujících oborů názvů knihovny tříd rozhraní.NET Framework společnosti Microsoft:
  • System::Runtime::InteropServices
  • Msclr::interop

Souhrn

Tento článek popisuje několik způsobů, jak převést z System::String * char * pomocí následujících kroků:
  • Řízená rozšíření pro C++ v aplikaci Microsoft Visual C++ .NET 2002 a Microsoft Visual C++ .NET 2003
  • C + +/ CLI aplikace Microsoft Visual C++ 2005 a Microsoft Visual C++ 2008

Metoda 1

PtrToStringChars poskytuje vnitřní ukazatel na aktuální objekt řetězce. Pokud předáte tento ukazatel volání nespravované funkce, musí nejprve Připnutí ukazatele k zajištění, že objekt nepřesune během asynchronního uvolnění kolekce:
//#include <vcclr.h>System::String * str = S"Hello world\n";
const __wchar_t __pin * str1 = PtrToStringChars(str);
wprintf(str1);

Metoda 2

StringToHGlobalAnsi obsah spravovaného objektu řetězec zkopíruje do nativní haldy a pak jej převede do formátu vnitrostátní normy ANSI (American Institute) průběžně. Tato metoda přiděluje paměť požadována nativní haldy:
//using namespace System::Runtime::InteropServices;System::String * str = S"Hello world\n";
char* str2 = (char*)(void*)Marshal::StringToHGlobalAnsi(str);
printf(str2);
Marshal::FreeHGlobal(str2);

Poznámka: V aplikaci Visual C++ 2005 a Visual C++ 2008, je nutné přidat možnost kompilátoru podporu runtime běžné jazyk (/ CLR: oldSyntax) úspěšně zkompilovat předchozí ukázkový kód. Chcete-li přidat možnost kompilátoru podporu runtime běžné jazyk, postupujte takto:

  1. Klepněte na tlačítko projekta klepněte na tlačítko ProjectName vlastnosti.



    Poznámka: Název projektu je zástupný symbol pro název projektu.
  2. Rozbalte uzel Vlastnosti konfiguracea potom klepněte na položku Obecné.

  3. V pravém podokně klepnutím vyberte Společná podpora Runtime jazyka, staré syntaxe (/ CLR: oldSyntax) v Podporují Common Language Runtime nastavení projektu.
  4. Klepněte na tlačítko použíta potom klepněte na tlačítko OK.
Další informace o možnostech podpory kompilátoru společného jazyka runtime naleznete následujícím webu Microsoft Developer Network (MSDN):

Tyto kroky platí pro celý tento článek.

Metoda 3

VC7 CString třída má konstruktor, který trvá spravované ukazatel na řetězec a načte CString s obsahem:
//#include <atlstr.h>System::String * str = S"Hello world\n";
CString str3(str);
printf(str3);

Metoda 4

Visual C++ 2008 představuje třídu marshal_as < T > zařazování nápovědy a marshal_context() zařazování pomocná třída.
//#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;

Poznámka: Tento kód nelze kompilovat pomocí spravovaného rozšíření jazyka C++ v aplikaci Visual C++ .NET 2002 nebo Visual C++ .NET 2003. Používá nové C + +/ CLI syntaxe, která byla zavedena v aplikaci Visual C++ 2005 a nový kód oboru názvů msclr , který byl zaveden v roce 2008 Visaul C++. Úspěšně zkompilovat tento kód, musíte použít přepínač kompilátoru /clr/CLR C++ v aplikaci Microsoft Visual C++ 2008.

Řízená rozšíření pro C++ ukázkový kód (Visual C++ 2002 a 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 ukázkový kód (Visual C++ 2005 a 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;
}

Odkazy

Další horní přístupů Visual C++ .NET Microsoft Knowledge Base články navštivte na následující webu společnosti Microsoft:
Vlastnosti

ID článku: 311259 - Poslední kontrola: 20. 1. 2017 - Revize: 1

Váš názor