Konwertowanie z elementu System::String na char w visual C++

W tym artykule opisano kilka sposobów konwertowania System::String* z na char* przy użyciu rozszerzeń zarządzanych w programie Visual C++.

Oryginalna wersja produktu: Visual C++
Oryginalny numer KB: 311259

Podsumowanie

W tym artykule opisano następujące przestrzenie nazw biblioteki klas programu Microsoft .NET Framework:

  • System::Runtime::InteropServices
  • Msclr::interop

W tym artykule omówiono kilka sposobów konwertowania System::String* z programu na char* przy użyciu następujących elementów:

  • Rozszerzenia zarządzane dla języka C++ w programie Visual C++ .NET 2002 i visual C++ .NET 2003
  • C++/CLI w programie Visual C++ 2005 i Visual C++ 2008

Metoda 1

PtrToStringChars daje wskaźnik wewnętrzny do rzeczywistego String obiektu. Jeśli przekażesz ten wskaźnik do niezarządzanego wywołania funkcji, musisz najpierw przypiąć wskaźnik, aby upewnić się, że obiekt nie przenosi się podczas procesu asynchronicznego odzyskiwania pamięci:

c++
//#include <vcclr.h>
System::String * str = S"Hello world\n";
const __wchar_t __pin * str1 = PtrToStringChars(str);
wprintf(str1);

Metoda 2

StringToHGlobalAnsi kopiuje zawartość zarządzanego String obiektu na natywną stertę, a następnie konwertuje ją na format American National Standards Institute (ANSI) na bieżąco. Ta metoda przydziela wymaganą natywną pamięć sterty:

c++
//using namespace System::Runtime::InteropServices;
System::String * str = S"Hello world\n";
char* str2 = (char*)(void*)Marshal::StringToHGlobalAnsi(str);
printf(str2);
Marshal::FreeHGlobal(str2);

Uwaga

W programie Visual C++ 2005 i visual C++ 2008 należy dodać opcję kompilatora obsługi środowiska uruchomieniowego języka wspólnego (/clr:oldSyntax), aby pomyślnie skompilować poprzedni przykładowy kod. Aby dodać opcję kompilatora obsługi środowiska uruchomieniowego języka wspólnego, wykonaj następujące kroki:

  1. Kliknij pozycję Project (Projekt), a następnie kliknij pozycję ProjectName Properties (Właściwości projectname).

    Uwaga

    ProjectName to symbol zastępczy nazwy projektu.

  2. Rozwiń węzeł Właściwości konfiguracji, a następnie kliknij przycisk Ogólne.

  3. W okienku po prawej stronie kliknij, aby wybrać pozycję Obsługa środowiska uruchomieniowego języka wspólnego, stara składnia (/clr:oldSyntax) w ustawieniach projektu obsługi środowiska uruchomieniowego języka wspólnego.

  4. Kliknij Zastosuj a następnie kliknij OK.

Aby uzyskać więcej informacji na temat opcji kompilatora obsługi środowiska uruchomieniowego języka wspólnego, odwiedź następującą witrynę sieci Web Microsoft Developer Network (MSDN):

/clr (Kompilacja środowiska uruchomieniowego języka wspólnego)

Te kroki dotyczą całego artykułu.

Metoda 3

Klasa VC7 CString ma konstruktor, który pobiera zarządzany wskaźnik ciągów i ładuje element CString z jego zawartością:

c++
//#include <atlstr.h>
System::String * str = S"Hello world\n";
CString str3(str);
printf(str3);

Metoda 4

Program Visual C++ 2008 wprowadza klasę marshal_as<T> pomocy marshala i klasę marshal_context() pomocnika marshala.

c++
//#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;

Uwaga

Ten kod nie jest kompilowany przy użyciu rozszerzeń zarządzanych dla języka C++ w programie Visual C++ .NET 2002 lub Visual C++ .NET 2003. Używa nowej składni języka C++/CLI wprowadzonej w programie Visual C++ 2005 oraz nowego kodu przestrzeni nazw msclr wprowadzonego w programie Visaul C++ 2008. Aby pomyślnie skompilować ten kod, należy użyć przełącznika kompilatora /clr C++ w programie Visual C++ 2008.

Rozszerzenia zarządzane dla przykładowego kodu C++ (Visual C++ 2002 lub Visual C++ 2003)

c++
//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;
}

Przykładowy kod C++/CLI (Visual C++ 2005 i Visual C++ 2008)

c++
//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;
}