كيفية تحويل من system:: string * إلى * حرف في Visual c + +

تشير هذه المقالة إلى مكتبة فئات Microsoft.NET Framework مساحات الأسماء التالية:
  • System::Runtime::InteropServices
  • Msclr::interop

ملخص

تتناول هذه المقالة عدة طرق لتحويل من system:: string * إلى * حرف باستخدام ما يلي:
  • ملحقات مدارة ل c + + في Microsoft Visual c + +.NET 2002 وفي Microsoft Visual c + +.NET 2003
  • C + +/CLI في Microsoft Visual c + + 2005 وفي Microsoft Visual c + + 2008

الطريقة الأولى

يعطي PtrToStringChars مؤشر داخلي لكائن السلسلة الفعلية. إذا قمت بتمرير هذا المؤشر إلى استدعاء دالة غير مدارة، يجب أولاً تثبيت المؤشر للتأكد من أن الكائن لا تتحرك أثناء عملية تجميع البيانات مهملة غير متزامن:
//#include <vcclr.h>System::String * str = S"Hello world\n";
const __wchar_t __pin * str1 = PtrToStringChars(str);
wprintf(str1);

الطريقة الثانية

نسخ محتويات كائن السلسلة المدارة في كومة الذاكرة المؤقتة الأصلية سترينجتوهجلوبالانسي ، وتحويل إلى تنسيق الأمريكية الوطنية معايير معهد (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 و 2008 Visual c + +، يجب إضافة خيار المحول البرمجي دعم وقت تشغيل اللغة العامة (/clr: oldsyntax) ترجمة نموذج التعليمات البرمجية السابق بنجاح. لإضافة خيار المحول البرمجي دعم وقت تشغيل اللغة العامة، اتبع الخطوات التالية:

  1. انقر فوق المشروعومن ثم انقر فوق خصائص اسم المشروع .



    ملاحظة: اسم المشروع عنصرا نائبا لاسم المشروع.
  2. توسيع تكوين خصائص، وانقر فوق عام.

  3. في الجزء الأيسر، انقر فوق لتحديد دعم وقت تشغيل اللغة العامة, بناء الجملة القديمة (/clr: oldsyntax) في وقت تشغيل اللغة العامة يدعم إعدادات المشروع.
  4. انقر فوق تطبيق، ومن ثم انقر فوق موافق.
لمزيد من المعلومات حول خيارات برنامج التحويل البرمجي دعم وقت تشغيل اللغة العامة، قم بزيارة موقع شبكة مطوري Microsoft (MSDN) التالي على الويب:

تطبيق هذه الخطوات لكل مادة.

الطريقة الثالثة

الفئة VC7 CString تحتوي على منشئ يأخذ مؤشر سلسلة مدارة ويحمل CString بمحتوياته:
//#include <atlstr.h>System::String * str = S"Hello world\n";
CString str3(str);
printf(str3);

الطريقة الرابعة

يقدم visual c + + 2008 الفئة marshal_as < T > تعليمات التنظيم وفئة المساعد التنظيم 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 وقانون مساحة الاسم مسكلر الجديد الذي تم تقديمه في عام 2008 c + + فيساول. ترجمة التعليمات البرمجية هذا بنجاح، يجب استخدام مفتاح التبديل برنامج التحويل البرمجي /clr c + + في Microsoft Visual c + + 2008.

ملحقات مدارة لكود نموذج c + + (2002 Visual c + + أو 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 و 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 التالي على الويب:
خصائص

رقم الموضوع: 311259 - آخر مراجعة: 18‏/01‏/2017 - المراجعة: 1

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

تعليقات