ID Artikel: 311259 - Kajian Terakhir: 24 September 2011 - Revisi: 2.0

Cara mengkonversi dari System::String * Char * in Visual C++

Tips SistemThis article applies to a different operating system than the one you are using. Article content that may not be relevant to you is disabled.
Artikel ini merujuk kepada berikut Microsoft.NET Framework kelas perpustakaan namespaces:
  • System::runtime::InteropServices
  • Msclr::Interop

Pada Halaman ini

Perbesar semua | Perkecil semua

RINGKASAN

Artikel ini membahas beberapa cara untuk mengkonversi dari System::String * char * dengan menggunakan berikut:
  • Berhasil ekstensi untuk C++ di Microsoft Visual C++.NET 2002 dan Microsoft Visual C++.NET 2003
  • C + +/ CLI di Microsoft Visual C++ 2005 dan di Microsoft Visual c ++ 2008

Metode 1

PtrToStringChars memberi Anda interior pointer ke objek String yang sebenarnya. Jika Anda lulus pointer ini tidak dikelola fungsi panggilan, Anda harus pertama pin pointer untuk memastikan bahwa objek tidak bergerak selama asynchronous sampah proses pengumpulan:
//#include <vcclr.h>
System::String * str = S"Hello world\n";
const __wchar_t __pin * str1 = PtrToStringChars(str);
wprintf(str1);	
				

Metode 2

StringToHGlobalAnsi menyalin isi dikelola objek String ke tumpukan asli, dan kemudian orang-orang itu ke dalam American National Standards Institute (ANSI) format on the fly. Metode ini mengalokasikan memori tumpukan asli yang diperlukan:
//using namespace System::Runtime::InteropServices;
System::String * str = S"Hello world\n";
char* str2 = (char*)(void*)Marshal::StringToHGlobalAnsi(str);
printf(str2);
Marshal::FreeHGlobal(str2);
				
Catatan Visual C++ 2005 dan di Visual c ++ 2008, Anda harus menambahkan umum bahasa runtime kompiler opsi dukungan (/ clr:oldSyntax) untuk berhasil mengkompilasi kode sampel sebelumnya. Untuk menambahkan runtime bahasa umum dukungan opsi kompiler, ikuti langkah berikut:
  1. Klik Project, lalu klik ProjectName Properti.

    Catatan ProjectName adalah sebuah tempat untuk nama proyek.
  2. Memperluas Konfigurasi properti, lalu klik General.
  3. Dalam pane kanan, klik untuk memilih Common Language Runtime Support, sintaks tua (/ clr:oldSyntax) dalam Common Language Runtime dukungan Seting Proyek.
  4. Klik Menerapkan, lalu klik Oke.
Untuk informasi lebih lanjut tentang common language runtime opsi kompiler dukungan, kunjungi Web site Microsoft Developer Network (MSDN) berikut:
http://msdn2.Microsoft.com/en-us/library/k8d11d4s.aspx (http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx)
Langkah-langkah berikut berlaku untuk seluruh artikel.

Metode 3

VC7 CString kelas memiliki konstruktor yang mengambil berhasil pointer String dan banyak CString dengan isinya:
//#include <atlstr.h>
System::String * str = S"Hello world\n";
CString str3(str); 
printf(str3);
				

Metode 4

Memperkenalkan visual c ++ 2008 marshal_as<t></t> Marsekal bantuan kelas dan marshal_context() kelas helper Marsekal.
//#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;
Catatan Kode ini tidak dapat dikompilasi dengan menggunakan ekstensi dikelola untuk C++ in Visual C++.NET 2002 atau in Visual C++.NET 2003. Menggunakan baru C + +/ CLI sintaks yang diperkenalkan dalam Visual C++ 2005 dan baru msclr namespace kode yang diperkenalkan di Visaul c ++ 2008. Untuk berhasil mengkompilasi kode ini, Anda harus menggunakan /CLR C++ compiler switch di Microsoft Visual c ++ 2008.

Berhasil ekstensi untuk kode contoh C++ (Visual C++ 2002 atau 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 + +/ kode contoh CLI (Visual C++ 2005 dan 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;
}

REFERENSI

Lain atas-hit Visual C++.Basis Pengetahuan NET Microsoft Artikel, kunjungi Web site Microsoft berikut:
http://support.Microsoft.com/default.aspx?xmlid=Fh%3BEN-US%3Bvcnet (http://support.microsoft.com/default.aspx?xmlid=fh%3BEN-US%3Bvcnet)
Untuk lebih banyak informasi umum tentang Visual C++.NET, kunjungi newsgroup Microsoft Usenet berikut:
Microsoft.Public.DotNet.Languages.VC (http://msdn.microsoft.com/newsgroups/default.aspx?query=Microsoft.public.dotnet.languages.vc+&dg=&cat=en-us-msdn&lang=en&cr=US&pt=&catlist=774F24A2-F71F-425F-AC2B-DC48AB0DA5C9&dglist=&ptlist=&exp=&sloc=en-us)

Berlaku bagi:
  • Microsoft Visual C++ 2008 Express Edition
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
Kata kunci: 
kbhowtomaster kbmanaged kbnewsgrouplink kbmt KB311259 KbMtid
Penerjemahan MesinPenerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:311259  (http://support.microsoft.com/kb/311259/en-us/ )