Bagaimana mengkonversi dari System::String * Char * dalam Visual C++

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 311259 - Melihat produk di mana artikel ini berlaku.
Artikel ini merujuk kepada berikut Microsoft .NET Framework kelas Perpustakaan namespaces:
  • System::runtime::InteropServices
  • Msclr::Interop
Perbesar semua | Perkecil semua

Pada Halaman ini

Ringkasan

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

Metode 1

PtrToStringChars memberi Anda interior pointer ke objek String yang sebenarnya. Jika Anda lulus pointer ini untuk panggilan fungsi unmanaged, Anda harus terlebih dahulu pin pointer untuk memastikan bahwa objek bergerak selama sampah asinkron 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 dari sebuah objek String yang dikelola ke tumpukan asli, dan kemudian mengubah ini ke American National Standards Institute (ANSI) format on the fly. Metode ini mengalokasikan kehabisan 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 Dalam Visual C++ 2005 dan dalam Visual C ++ 2008, Anda harus menambahkan common language runtime kompiler opsi dukungan (/ clr:oldSyntax) untuk berhasil mengumpulkan sampel kode sebelumnya. Untuk menambahkan bahasa runtime dukungan kompiler pilihan umum, ikuti langkah berikut:
  1. Klik Proyek, lalu klik ProjectName Properti.

    CatatanProjectName adalah pengganti untuk nama proyek.
  2. Memperluas Konfigurasi properti, lalu klik Umum.
  3. Di panel kanan-atas, klik untuk memilih Common Language Runtime dukungan, tua sintaks (/ clr:oldSyntax) dalam Common Language Runtime dukungan Seting Proyek.
  4. Klik Menerapkan, lalu klik Oke.
Untuk informasi lebih lanjut tentang opsi kompiler common language runtime dukungan, kunjungi situs web Microsoft Developer Network (MSDN) berikut:
http://msdn2.Microsoft.com/en-US/Library/k8d11d4s.aspx
Langkah-langkah berikut berlaku untuk seluruh artikel.

Metode 3

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

Metode 4

Visual C ++ 2008 memperkenalkan marshal_as<T> </T> Marsekal bantuan kelas dan marshal_context() Marsekal penolong kelas.
//#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 mengkompilasi dengan menggunakan ekstensi dikelola untuk C++ Visual C++ .NET 2002 atau Visual C++ .NET 2003. Menggunakan C baru + / CLI sintaks yang diperkenalkan dalam Visual C++ 2005 dan kode namespace msclr baru yang diperkenalkan di Visaul C ++ 2008. Untuk berhasil mengkompilasi kode ini, Anda harus menggunakan tombol tekan kompiler /clr C++ dalam Microsoft Visual C ++ 2008.

Managed 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 + +/ CLI contoh kode sumber (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++ .NET Microsoft Knowledge Base Artikel, kunjungi Web site Microsoft berikut:
http://support.Microsoft.com/default.aspx?xmlid=FH%3BEN-US%3Bvcnet

Properti

ID Artikel: 311259 - Kajian Terakhir: 30 Mei 2013 - Revisi: 3.0
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 Mesin
PENTING: Artikel ini diterjemahkan oleh perangkat lunak penerjemahan mesin Microsoft, dan mungkin telah diedit oleh Masyarakat Microsoft melalui teknologi CTF dan bukan oleh seorang penerjemah profesional. Microsoft menawarkan baik artikel yang diterjemahkan oleh manusia maupun artikel hasil editan terjemahan oleh mesin/komunitas, sehingga Anda dapat mengakses semua artikel di Sentra Pengetahuan yang kami miliki dalam berbagai bahasa. Namun artikel hasil editan mesin atau bahkan komunitas tidak selalu sempurna. Artikel ini dapat mengandung kesalahan dalam hal kosa kata, sintaksis atau tatabahasa, sangat mirip dengan penutur asing yang membuat kekeliruan ketika berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab atas ketidakakuratan, kesalahan atau kerugian apa pun akibat dari kekeliruan dalam penerjemahan isi atau penggunaannya oleh pelanggan kami. Microsoft juga akan senantiasa memperbarui perangkat lunak penerjemahan mesin dan alat untuk menyempurnakan Editan Hasil Penerjemahan Mesin.
Klik disini untuk melihat versi Inggris dari artikel ini: 311259

Berikan Masukan

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com