كيفية القيام بما يلي: تنظيم وإرسال سلاسل 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();
}