כיצד להמיר מ- System::String * Char * ב- Visual C++

תרגומי מאמרים תרגומי מאמרים
Article ID: 311259 - View products that this article applies to.
מאמר זה מתייחס הבאות מרחבי שמות של ספריית המחלקות של .NET Framework של Microsoft:
  • System::Runtime::InteropServices
  • Msclr::interop
הרחב הכל | כווץ הכל

On This Page

תקציר

מאמר זה מתאר מספר דרכים כדי להמיר מ- System::String * char * באמצעות הפעולות הבאות:
  • לנהל הרחבות עבור C++ ב- Microsoft Visual C++ .NET 2002 וב -Microsoft Visual C++ .NET 2003
  • C + + / CLI ב- 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 מעתיקה את התוכן של אובייקט מחרוזת מנוהל לתוך ערימה מקורי ולאחר מכן ממירה אותו לתוך הלאומי מכון התקנים ארה (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);
				
הערה ב- Visual C++ 2005 ו- Visual C++ 2008, עליך להוסיף זמן הריצה של השפה נפוצות האפשרות מהדר תמיכה (/ clr:oldSyntax) לבצע בהצלחה הידור הקוד לדוגמה הקודמת. כדי להוסיף את זמן הריצה של השפה נפוצות האפשרות מהדר תמיכה, בצע את הפעולות הבאות:
  1. לחץ פרוייקט, ולאחר מכן לחץ על ProjectName מאפיינים.

    הערהProjectName הוא מציין מיקום עבור השם של הפרוייקט.
  2. הרחב מאפייני תצורה, ולאחר מכן לחץ על כללי.
  3. בחלונית השמאלית, לחץ על כדי לבחור תמיכת זמן ריצה נפוצות של שפה, תחביר הישן (/ clr:oldSyntax) ב- תמיכת זמן ריצה של השפה נפוצות הגדרות פרוייקט.
  4. לחץ החל, ולאחר מכן לחץ על אישור.
לקבלת מידע נוסף אודות אפשרויות מהדר התמיכה של זמן הריצה של השפה הנפוצות, בקר באתר האינטרנט הבא של Microsoft מפתח רשת (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

Visual C++ 2008 מציג marshal_as<T> </T> לסדר עזרה class ומחלקה מסייעת של סידור 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;
הערה קוד זה הידור לא באמצעות הרחבות מנוהלים עבור C++ ב- Visual C++ .NET 2002 או ב- Visual C++ .NET 2003. היא משתמשת את חדש C + + / תחביר CLI שהוצגה ב- Visual C++ 2005 ו קוד השמות msclr החדשה שהוצגה ב- Visaul C++ 2008. לבצע בהצלחה הידור קוד זה, עליך להשתמש בבורר מהדר /clr C++ ב- Microsoft Visual C++ 2008.

לנהל הרחבות עבור קוד לדוגמה C++ (Visual C++ 2002 או ב- 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 (Visual C++ 2005 ו- 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;
}

מידע נוסף

עבור אחרים hit העליון Visual C++ .NET Microsoft Knowledge Base מאמרים, בקר באתר האינטרנט הבא של Microsoft:
http://support.microsoft.com/default.aspx?xmlid=fh%3BEN-US%3Bvcnet

מאפיינים

Article ID: 311259 - Last Review: יום שישי 07 יוני 2013 - Revision: 1.0
המידע במאמר זה חל על:
  • 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
מילות מפתח 
kbhowtomaster kbmanaged kbnewsgrouplink kbmt KB311259 KbMthe
תרגום מכונה
חשוב: מאמר זה תורגם באמצעות תוכנת תרגום מכונה של Microsoft וייתכן שנערך לאחר מכן על-ידי קהילת Microsoftבאמצעות טכנולוגייתCommunity Translation Framework (CTF) או באמצעות תרגום אנושי. Microsoft מציעה לך גם מאמרים בתרגום אנושי, מאמרים בתרגום מכונה ומאמרים שנערכו על ידי הקהילה כדי לאפשר גישה למאמרים הקיימים במאגר הידע (Knowledge Base) של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