كيفية القيام بما يلي: تنظيم وإرسال سلاسل Unicode باستخدام C++ Interop

يوضح هذا الموضوع أحد جوانب إمكانية التشغيل التفاعلي بـ ++Visual C . لمزيد من المعلومات، راجع استخدام PInvoke) C++ Interop الضمني ).

أمثلة التعليمات البرمجية التالية تستخدم توجيهات # pragma ـmanaged, unmanaged لتنفذ الدالات المدارة و غير المدارة في نفس الملف , ولكن تتفاعل هذه الدالات بنفس الطريقة في حالة تعريفها في ملفات منفصلة. الملفات التي تحتوي على دالات غير مدارة فقط لا تحتاج إلى أن يتم تحويلها برمجياً باستخدام /clr (التجميع وقت تشغيل اللغة العامة).

يوضح هذا الموضوع كيف يمكن تمرير سلاسل Unicode من دالة مُدارة إلى أخري غير مدارة، والعكس . للتشغيل التفاعلي مع أنواع السلاسل الأخرى, راجع المواضيع التالية:

مثال

لتمرير سلسلة Unicode من دالة مدارة إلى أخري غير مدارة ،دالة PtrToStringChars (تم التصريح بها في Vcclr.h) يمكن استخدامها للدخول فى الذاكرة حيث تم تخزين السلسلة المدارة. و لأنه سيتم تمرير هذا العنوان إلى دالة أصلية ، يعتبر من الضروري القيام بتثبيت الذاكرة مع pin_ptr لمنع تغيير موقع بيانات السلسلة , فلا يحدث تجميع للبيانات المهملة أثناء تنفيذ الدالة الغير المُدارة.

// MarshalUnicode1.cpp
// compile with: /clr
#include <iostream>
#include <stdio.h>
#include <vcclr.h>

using namespace std;

using namespace System;
using namespace System::Runtime::InteropServices;

#pragma unmanaged

void NativeTakesAString(const wchar_t* p) {
   printf_s("(native) received '%S'\n", p);
}

#pragma managed
 
int main() {
   String^ s = gcnew String("test string");
   pin_ptr<const wchar_t> str = PtrToStringChars(s);

   Console::WriteLine("(managed) passing string to native func...");
   NativeTakesAString( str );
}

يوضح المثال التالي تنظيم و إرسال البيانات المطلوب للوصول إلى سلسلة Unicode في الدالة المدارة المُستدعاة بواسطة دالة غير مدارة. الدالة المدارة , عند تلقي سلسلة Unicode أصلية , تحولها إلى سلسلة مدارة باستخدام الأسلوب PtrToStringUni.

// MarshalUnicode2.cpp
// compile with: /clr
#include <iostream>

using namespace std;
using namespace System;
using namespace System::Runtime::InteropServices;

#pragma managed

void ManagedStringFunc(wchar_t* s) {
   String^ ms = Marshal::PtrToStringUni((IntPtr)s);
   Console::WriteLine("(managed) received '{0}'", ms);
}

#pragma unmanaged

void NativeProvidesAString() {
   cout << "(unmanaged) calling managed func...\n";
   ManagedStringFunc(L"test string");
}

#pragma managed

int main() {
   NativeProvidesAString();
}

راجع أيضًا:

المرجع

استخدام PInvoke) C++ Interop الضمني )