วิธีการแปลงจาก System::String * เป็นอักขระ * ใน Visual C++

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 311259 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
บทความนี้อ้างถึงต่อไปนี้ Namespaces ไลบรารีคลาสของ.NET Framework ของ Microsoft:
  • System::Runtime::InteropServices
  • Msclr::interop
ขยายทั้งหมด | ยุบทั้งหมด

เนื้อหาบนหน้านี้

สรุป

บทความนี้อธิบายวิธีการต่าง ๆ เพื่อแปลงจาก System::String * เป็นอักขระ * โดยใช้ตัวเลือกต่อไปนี้:
  • ส่วนขยายที่ได้มีจัดการสำหรับ c ++ ใน Microsoft Visual C++ .NET 2002 และ Microsoft Visual C++ .NET 2003
  • C + + /mts ไม่ ใน Microsoft Visual C++ 2005 และ ใน Microsoft Visual C++ 2008

วิธีที่ 1

PtrToStringCharsให้คุณมีตัวชี้ภายในออบเจ็กต์สตริงที่แท้จริง ถ้าคุณ ส่งนี้ชี้ไปยังการเรียกฟังก์ชันที่ไม่มีการจัดการ คุณต้องการตรึงตัวชี้ เพื่อให้แน่ใจว่า วัตถุไม่ย้ายในระหว่างการขยะแบบอะซิงโครนัส กระบวนการเรียกเก็บเงิน:
//#include <vcclr.h>
System::String * str = S"Hello world\n";
const __wchar_t __pin * str1 = PtrToStringChars(str);
wprintf(str1);	
				

วิธีที่ 2

StringToHGlobalAnsiคัดลอกเนื้อหาของวัตถุสายอักขระมีการจัดการเป็น heap ดั้งเดิม และจากนั้น แปลงนั้นลงในสหรัฐอเมริกาแห่งชาติมาตรฐาน Institute (ANSI) รูป รีบเร่ง วิธีการนี้จัดสรรหน่วยความจำฮีปท้องถิ่นจำเป็นต้องใช้:
//using namespace System::Runtime::InteropServices;
System::String * str = S"Hello world\n";
char* str2 = (char*)(void*)Marshal::StringToHGlobalAnsi(str);
printf(str2);
Marshal::FreeHGlobal(str2);
				
หมายเหตุ ใน 2005 Visual C++ และ 2008 Visual C++ คุณต้องเพิ่มทั่วไปภาษารันไทม์สนับสนุนคอมไพเลอร์ตัว (/ clr:oldSyntax) ไปเรียบร้อยแล้วคอมไพล์โค้ดตัวอย่างก่อนหน้านี้ เมื่อต้องการเพิ่มทั่วไปภาษารันไทม์สนับสนุนคอมไพเลอร์ตัว ให้ทำตามขั้นตอนเหล่านี้:
  1. คลิก โครงการแล้ว คลิก ProjectName คุณสมบัติ.

    หมายเหตุProjectName คือตัวยึดสำหรับชื่อของโครงการ
  2. ขยาย คุณสมบัติการตั้งค่าคอนฟิกแล้ว คลิก ทั่วไป.
  3. ในบานหน้าต่างด้านขวา คลิกเพื่อเลือก สนับสนุนการใช้งานจริงภาษาทั่วไป ไวยากรณ์เก่า (/ clr:oldSyntax) ในการ สนับสนุนการรันไทม์ภาษาทั่วไป การตั้งค่าโครงการ
  4. คลิก นำไปใช้แล้ว คลิก ตกลง.
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับทั่วไปภาษารันไทม์สนับสนุนคอมไพเลอร์ตัว แวะไปที่เว็บไซต์ Microsoft Developer Network (MSDN) ต่อไปนี้:
http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx
ขั้นตอนเหล่านี้ถูกนำไปใช้กับบทความทั้งหมด

วิธีที่ 3

คลา VC7 CStringได้เป็นตัวสร้างที่ใช้เป็นตัวชี้ตำแหน่งสายอักขระที่มีการจัดการ และ โหลด CString ที่ มีเนื้อหาของ:
//#include <atlstr.h>
System::String * str = S"Hello world\n";
CString str3(str); 
printf(str3);
				

วิธีที่ 4

2008 Visual C++ แนะนำmarshal_as<T> </T> marshal วิธีใช้คลาสและคลาmarshal_context() marshal ผู้ช่วยเหลือ
//#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;
หมายเหตุ รหัสนี้ไม่ได้คอมไพล์ โดยใช้ส่วนขยายที่มีการจัดการสำหรับ c ++ ใน 2002 .NET Visual C++ หรือ ใน Visual C++ .NET 2003 ใช้ C ตัวใหม่ + + /mts ไม่ไวยากรณ์ที่ถูกนำมาใช้ใน 2005 Visual C++ และรหัส namespace msclrใหม่ที่ถูกนำมาใช้ใน 2008 c ++ Visaul การคอมไพล์โค้ดนี้เรียบร้อยแล้ว คุณต้องใช้สวิตช์ของคอมไพเลอร์/clr c ++ใน Microsoft Visual C++ 2008

ส่วนขยายที่ได้มีจัดการสำหรับ c ++ตัวอย่างโค้ด (2002 Visual C++ หรือ 2003 Visual 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;
}
				

C + + /mts ไม่โค้ดตัวอย่าง (2005 Visual C++ และ 2008 Visual 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;
}

ข้อมูลอ้างอิง

สำหรับอื่น ๆ บนจำนวน Visual C++ .NET Microsoft Knowledge Base บทความ แวะไปที่เว็บไซต์ต่อไปนี้ของ Microsoft:
http://support.microsoft.com/default.aspx?xmlid=fh%3BEN-US%3Bvcnet

คุณสมบัติ

หมายเลขบทความ (Article ID): 311259 - รีวิวครั้งสุดท้าย: 30 พฤษภาคม 2556 - Revision: 5.0
ใช้กับ
  • Microsoft Visual C++ 2008 Express Edition
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ 2002 Standard Edition
Keywords: 
kbhowtomaster kbmanaged kbnewsgrouplink kbmt KB311259 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:311259

ให้ข้อเสนอแนะ

 

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