استدعاء وظائف C ++ في Delphi مباشرة وتدعو دلفي في C ++
ما يعني أن طريقة استدعاء الوظيفة الافتراضية لـ Delphi 1 هي طريقة Pascal ، Delphi 4 ، Delphi
الطريقة الافتراضية لـ 5 هي طريقة استدعاء CDECL المحسنة ، أي طريقة التسجيل. ليكون في C ++
تنفيذ مشاركة الوظائف مع برامج Delphi ، ما لم تكن هناك أسباب كافية ، يجب استخدام المعيار.
طريقة استدعاء النظام العاري ، أي طريقة stdcall. لكي لا يحدد برنامج التحويل البرمجي C ++ الوظيفة على أنها "مانغ"
LED "، مما تسبب في اعتقاد برنامج التحويل البرمجي Delphi عن طريق الخطأ أن الوظيفة تستخدم طريقة استدعاء CDECL ، يجب أن تكون في C ++
في الكود ، يصف Extern "C" الوظيفة المشتركة ، كما هو موضح في المثال التالي: النموذج الأولي الوصف: في C ++
في: extern "c" int _stdcall testfunc () ؛
stdcall ؛ بناء بناء الجملة: في c ++: int i = testfunc () ؛
في دلفي: var i: integer ؛ ...
يبدأ…
أنا: = testfunc ؛ ...
النهاية ؛ يجب أن تكون معلمات الوظيفة المشتركة هي النوع المتغير المدعوم من كلتا اللغتين ، وهو ما هو الصحيح.
المتطلب السابق لتمرير المعلمات. فئات متغيرة مثل عملة Delphi ، سلسلة ، مجموعة ، إلخ.
اكتب ، في C ++ ، لا يوجد نوع متغير مقابل ولا يمكن استخدامه كمعلمة لوظيفة مشتركة. يستطيع
تمرير مؤشرات سلسلة مع معلمات القيمة باستخدام نوع PCAR.
إعادة تدوير مساحة السلسلة.
يجب وصف المعلمات المتغيرة في لغة Delphi على أنها أشكال مرجعية لأنواع المتغيرات المقابلة في C ++.
على النحو التالي: في دلفي: وظيفة testfunc (var i: integer): integer ؛
في: int testfunc (int & i) ؛
يمكن إجراء الاتصال عن طريق الارتباط الثابت أو الارتباط الديناميكي.
1. طريقة الارتباط الثابت إذا كان برنامج C ++ نفسه يحتوي على كمية صغيرة من التعليمات البرمجية ، وليس هناك حاجة للقلق بشأن ج
سيكون لمكتبة وقت التشغيل عملية تفاعلية ، ويمكن استخدام طريقة الربط الثابتة ، أي Delphi و C ++
يتم ربط ملف الكائن (*.OBJ) بالملف النهائي القابل للتنفيذ. الطريقة المحددة هي استخدام {$ l}
ترجمة إرشادات لتمكين برنامج التحويل البرمجي Delphi من قراءة ملف الهدف المحدد تلقائيًا ، كما هو موضح أدناه: الوظيفة
Testfunc: integer ؛ stdcall ؛ {$ l testfunc.obj} 2.
إذا كان رمز C ++ شاملًا بالفعل أو نظامًا فرعيًا كاملًا ، فإن حجم الكود كبير ، أو
عند استخدام مكتبة وقت التشغيل C ، في هذه الحالة ، يجب استخدام طريقة مكتبة الارتباط الديناميكية (DLL). هذا
عندما ، يجب تقديم التفسير التالي في الكود المصدري للغاتين: في C ++: int stdcall تصدير
Testfunc () ؛
"TestFunc.dll" ؛
الآن فيما يتعلق بمشاركة أساليب الكائنات ، يمكن تقسيم هذه المشاركة إلى مستويين: كائن (كائن)
مشاركة الفصل ومشاركة الفصل. لتنفيذ المشاركة على مستوى الكائن ، يجب أن تكون لغة البرمجة
متطلبات مسبقة: قادرة على تحديد مؤشر إلى كائن تم إنشاؤه بواسطة لغة أخرى ؛
طرق في كائن يحدده مؤشر.
لتنفيذ مشاركة على مستوى الفصل ، تحتاج أيضًا إلى النظر في: القدرة على إنشاء فصول محددة بلغة أخرى
على سبيل المثال ، يمكن تحرير المساحة التي تشغلها مثيل.
يصف ما يلي طريقة تنفيذ مشاركة الكائنات بين Delphi و Borland C ++.
1. لمشاركة كائنات Delphi في C ++ ، لتنفيذ كائنات Delphi من C ++ ، يجب عليك أولاً استخدام Delphi
يشير جزء الواجهة من الوحدة وملف رأس C ++ إلى واجهة الكائن الذي يجب مشاركته ، في
تحدد واجهة الكائن الخصائص والأساليب التي يحتوي عليها الكائن ، وتشرح الأجزاء التي يمكن مشاركتها.
يكمن مفتاح مشاركة الكائنات في طرق المشاركة. في لغة دلفي ، اجعل كائنًا قادرًا
ليتم مشاركتها ، يمكن وصفها بأنها قسمين واجهة ، تسمى مؤقتًا "الواجهة المشتركة" و "التنفيذ
الواجهة ". حيث تشير واجهة مشتركة إلى الأساليب في الكائن التي يمكن مشاركتها بلغة أخرى ؛
ترث الواجهة الحالية الواجهة المشتركة ، ويتم استخدام الطريقة في جزء التنفيذ من الوحدة لتنفيذ الواجهة.
تحديد تطبيقات محددة. لتحديد كائن Delphi الذي يمكن مشاركته بواسطة C ++ ، الواجهة المشتركة
ملاحظة: في برنامج Delphi ، يجب وصف الطريقة التي يجب مشاركتها على أنها مجردة (مجردة).
و Virtual (افتراضية) ؛
يجب شرح طريقة الكائن المشترك على أنها "افتراضية خالصة" بواسطة Delphi.
يجب وصفه بلغتين مثل طريقة الاتصال نفسها ، وعادة ما تستخدم مكالمات النظام القياسية
الطريق (stdcall).
أدناه ، دعنا نعطي مثالاً على هذه القواعد ، على افتراض أن هناك كائن دلفي: ttestobject = classProcedure
proc1 (x: integer) ؛ func1 func1 (x: integer): pchar ؛ الإجراء
proc2 ؛ وظيفة func2: integer ؛ end ؛ إذا كانت برامج C ++ تحتاج إلى مشاركة
يمكن تعديل الأساليب PROC1 و FUNC1 في النموذج التالي:
StestObject = classprocedure
PROC1 (X: Integer) ؛
stdcall ؛ وظيفة func1 (x: عدد صحيح) ؛
الافتراضية
proc1 (x: integer) ؛ fuction func1 (x: integer): pchar ؛
الإجراء proc2 ؛ وظيفة
Func2: integer ؛ end ؛
{virtual void proc1 (int x) = 0 ؛ virtual char *func1 (int x) = 0 ؛} ؛
من أجل الوصول بنجاح إلى فئات Delphi المحددة في C ++ ، يجب تحديد واجهة Delphi.
يحتوي على "وظيفة المصنع" القابلة للمشاركة CreateTestObject ،
يمكن تعريف وظيفة التصنيع في مكتبة أو ملف رابط ديناميكي (.OBJ) ، على سبيل المثال: المكتبة
testlib ؛ تصدير createTestObject ؛ وظيفة createStObject: StestObject ؛
stdcall ؛
نهاية.
كائن المكالمة هو كما يلي: extern "C" StestObject stdcall
*CreateTestObject () ؛ void
UsetestObject (void) {StestObject *thetestobject = createStObject () ؛
*str = thetestobject-> func1 (0) ؛} عند استدعاء وظيفة التصنيع CreateStObject
عندما يشغل جانب Delphi بالفعل مساحة مثيل الكائن ، يكون برنامج C ++ موجودًا
بعد اكتمال كل المعالجة لهذا الكائن ، يجب تحرير المساحة.
حدد فئة في دلفي ، مثل الطريقة المشتركة خالية من PROC1 المذكورة أعلاه ، لإكمال هذا
مهمة واحدة: StestObject = classprocedure proc1 (x: integer) ؛
الملخص ؛
stdcall ؛
تطبيق…
الإجراء ttestobject.fre.
نهاية؛…
end.2.delphi share c ++ كائنات عادة ، سينظر المبرمجون في استخدام Delphi للتجميع.
واجهة المستخدم ، بحيث يبدو أن رمز Delphi Conduct C ++ أكثر عملية. في الواقع ، دلفي
تشبه طريقة التنفيذ لمشاركة كائنات C ++ إلى حد كبير كائنات Delphi المشتركة C ++ أعلاه. استخدم نفس الشيء
الواجهة المشتركة وواجهة التنفيذ طريقة الوصف لتحديد فئات C ++: فئة StestObject
{Virtual void proc1 (int x) = 0 ؛ virtual char *func1 (int x) = 0 ؛} ؛ class
ttestobject: stestObject العامة {void proc1 (int x) ؛ char *func1 (int
x) ؛ void proc2 () ؛ int func2 () ؛ void free () ؛} ؛
. وبالمثل ، تتطلب كائنات C ++ وظيفة تصنيع مقابلة.
stdcall esport *createTestObject () {return (StestObject *)
يمكن استخدام رمز Delphi جديد ttestobject.create ؛
من السهل إنشاء مثيل في C ++ ، والحصول على قيمة المؤشر إلى هذا المثيل ، واستخدم هذا المؤشر
قيمة لاستدعاء الأساليب المشتركة في الكائن. بالطبع ، بعد الانتهاء من المعالجة ذات الصلة للكائن ،
لا تنس الاتصال مجانًا لتحرير المساحة المحتلة.