Visual C++'ta System::String'den Char'a Dönüştürme

Bu makalede, Visual C++'da yönetilen uzantıları kullanarak'dan'a System::String*char* dönüştürmenin çeşitli yolları açıklanmaktadır.

Orijinal ürün sürümü: Visual C++
Özgün KB numarası: 311259

Özet

Bu makale, aşağıdaki Microsoft .NET Framework Sınıf Kitaplığı ad alanlarını ifade eder:

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

Bu makalede, aşağıdakileri kullanarak dönüştürmenin System::String*char* çeşitli yolları açıklanır:

  • Visual C++ .NET 2002 ve Visual C++ .NET 2003'te C++ için yönetilen uzantılar
  • Visual C++ 2005 ve Visual C++ 2008'de C++/CLI

Yöntem 1

PtrToStringChars size gerçek String nesnenin iç işaretçisini verir. Bu işaretçiyi yönetilmeyen bir işlev çağrısına geçirirseniz, nesnenin zaman uyumsuz bir çöp toplama işlemi sırasında hareket etmediğinden emin olmak için önce işaretçiyi sabitlemeniz gerekir:

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

Yöntem 2

StringToHGlobalAnsi yönetilen String bir nesnenin içeriğini yerel yığına kopyalar ve ardından anında Amerikan Ulusal Standartlar Enstitüsü (ANSI) biçimine dönüştürür. Bu yöntem gerekli yerel yığın belleğini ayırır:

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

Not

Visual C++ 2005 ve Visual C++ 2008'de, önceki kod örneğini başarıyla derlemek için ortak dil çalışma zamanı desteği derleyici seçeneğini (/clr:oldSyntax) eklemeniz gerekir. Ortak dil çalışma zamanı desteği derleyici seçeneğini eklemek için şu adımları izleyin:

  1. Project'e ve ardından ProjectName Özellikleri'ne tıklayın.

    Not

    ProjectName, projenin adı için bir yer tutucudur.

  2. Yapılandırma Özellikleri'ni genişletin ve genel'e tıklayın.

  3. Sağ bölmede, Ortak Dil Çalışma Zamanı destek projesi ayarlarında Ortak Dil Çalışma Zamanı Desteği, Eski Söz Dizimi (/clr:oldSyntax) öğesini seçmek için tıklayın.

  4. Uygula'yı ve ardından Tamam'ı tıklatın.

Ortak dil çalışma zamanı desteği derleyici seçenekleri hakkında daha fazla bilgi için aşağıdaki Microsoft Developer Network (MSDN) Web sitesini ziyaret edin:

/clr (Ortak Dil Çalışma Zamanı Derlemesi)

Bu adımlar makalenin tamamı için geçerlidir.

Yöntem 3

VC7 CString sınıfı, yönetilen bir Dize işaretçisi alan ve içeriğini yükleyen bir oluşturucuya CString sahiptir:

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

Yöntem 4

Visual C++ 2008, marshal yardım sınıfını marshal_as<T> ve marshal yardımcı sınıfını marshal_context() tanıtır.

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

Not

Bu kod, Visual C++ .NET 2002 veya Visual C++ .NET 2003'te C++ için yönetilen uzantılar kullanılarak derlenmez. Visual C++ 2005'te tanıtılan yeni C++/CLI söz dizimini ve Visaul C++ 2008'de kullanıma sunulan yeni msclr ad alanı kodunu kullanır. Bu kodu başarıyla derlemek için Visual C++ 2008'de /clr C++ derleyici anahtarını kullanmanız gerekir.

C++ için Yönetilen Uzantılar örnek kod (Visual C++ 2002 veya 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 örnek kodu (Visual C++ 2005 ve 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;
}