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

W tym artykule opisano kilka sposobów konwersji z System::String* 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 microsoft .NET Framework:

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

W tym artykule omówiono kilka sposobów konwersji z System::String* 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 ci wewnętrzny wskaźnik do rzeczywistego String obiektu. Jeśli przekażesz ten wskaźnik do wywołania funkcji niezarządzanej, musisz najpierw przypiąć wskaźnik, aby upewnić się, że obiekt nie zostanie przeniesiony podczas asynchronicznego procesu odzyskiwania pamięci:

//#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 do sterty natywnej, a następnie konwertuje ją na format Amerykańskiego Narodowego Instytutu Standardów (ANSI) na bieżąco. Ta metoda przydziela wymaganą natywną pamięć sterty:

//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ład kodu. Aby dodać opcję kompilatora obsługi środowiska uruchomieniowego języka wspólnego, wykonaj następujące kroki:

  1. Kliknij pozycję Projekt, a następnie kliknij pozycję Właściwości projectname.

    Uwaga

    ProjectName jest symbolem zastępczym nazwy projektu.

  2. Rozwiń węzeł Właściwości konfiguracji, a następnie kliknij pozycję 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 przycisk Zastosuj, a następnie przycisk 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 string i ładuje CString go za pomocą jego zawartości:

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

Metoda 4

Visual C++ 2008 wprowadza klasę marshal_as<T> pomocy marszałka i klasę pomocnika marshala 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;

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, która została wprowadzona w programie Visual C++ 2005, oraz nowego kodu przestrzeni nazw msclr, który został wprowadzony 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.

Managed Extensions for C++ przykładowy kod (Visual C++ 2002 lub 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;
}

Przykładowy kod C++/CLI (Visual C++ 2005 i 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;
}