بشكل عام، هناك ثلاث طرق للبرمجة معًا بين VB وVC: إحداهما هي إنشاء ملف DLL في VC واستدعاء DLL في VB؛ والأخرى هي إنشاء عنصر تحكم ActiveX (.ocx) في VC وإدراجه في VB؛ الآخر هو إنشاء DLL في VC إنشاء خادم ActiveX Automation في VB واستدعاءه في VB. نسبيًا، الطريقة الأولى لديها أقل المتطلبات لمبرمجي VC، ولكنها تتطلب تعاون شركائك، أوصي بهذه الطريقة.
لنتحدث عن برمجة VC++ أولاً. قم أولاً بإنشاء مشروع Win32 DLL في VC++. أضف عدة وظائف إلى هذا المشروع ليتصل بها مستخدمو VB. لكي يتم استدعاء دالة في DLL بواسطة VB، يجب أن تستوفي شرطين: الأول هو أن طريقة الاستدعاء هي stdcall، والآخر هو أنه يجب تصديرها. للقيام بالخطوة الأولى، ما عليك سوى إضافة الكلمة الأساسية __stdcall قبل إعلان الوظيفة. يحب:
عينة __stdcall قصيرة (nLen قصيرة، مخزن مؤقت * قصير)
للقيام بالخطوة الثانية، تحتاج إلى إضافة الأسطر التالية إلى ملف *.def:
صادرات
عينة @1
النموذج هنا هو اسم الوظيفة التي تريد الاتصال بها في VB، ويمثل @1 رقم الوظيفة في مكتبة الارتباط الحيوي (DLL)، وتختلف كل وظيفة عن الأخرى. لاحظ أن أسماء الوظائف هنا حساسة لحالة الأحرف. أما بالنسبة للحاجة إلى نقل كمية كبيرة من البيانات، فيمكنك القيام بذلك، واستخدام مصفوفة لتخزين البيانات في VB، ثم تمرير حجم وعنوان المصفوفة إلى VC (أما عن كيفية البرمجة في VB، فسوف تقديمه أدناه). تمامًا مثل المثال أعلاه، nLen هو حجم المصفوفة والمخزن المؤقت هو عنوان المصفوفة. باستخدام هذين العنصرين، يمكنك معالجته مثل مصفوفة VC. أما بالنسبة لرسومات الإخراج، فيمكنك إنشاء تنسيق WMF أو BMP والسماح لـ VB باستدعاءه. ومع ذلك، أعتقد أنه يمكن أيضًا إخراجه مباشرة إلى النافذة، طالما أن VB يمرر مقابض النافذة hWnd وhDC وموضع رسم النافذة (يجب أن تكون أنظمة الإحداثيات المستخدمة بواسطة VB وVC متسقة) إلى VC. يجب أن تكون خاصية AutoRedraw الخاصة بـ VB False، ويتم استدعاء برنامج رسم VC في حدث Paint.
دعونا نتحدث عن برمجة VB مرة أخرى. إن أسلوب VB لاستدعاء DLL هو نفس أسلوب استدعاء Windows API، والذي يتم تقديمه بشكل عام في كتب VB. في المثال أعلاه، أعلن أولاً عن وظيفة VC:
قم بتعريف نموذج الدالة Lib "mydll.dll" (ByVal nLen كعدد صحيح، المخزن المؤقت كعدد صحيح) كعدد صحيح
هنا mydll.dll هو اسم ملف dll الخاص بك. ربما لاحظت أنه تم الإعلان عن المعلمتين بشكل مختلف، مع إضافة ByVal إلى المعلمة الأولى. القاعدة هي كما يلي: إذا تم الإعلان عن معلمة كمؤشر أو صفيف في VC، فلن تتم إضافة ByVal، وإلا ستتم إضافة ByVal. استدعاء هذه الدالة في VB يستخدم بناء الجملة التالي:
العينة 10، أ(0)
يتم استخدام المصفوفة a() هنا لتخزين البيانات، و10 هو طول المصفوفة. لا يمكن أن تكون المعلمة الثانية هنا a()، ولكن يجب أن تكون أول البيانات التي سيتم تمريرها. هذا هو المفتاح لبرمجة VB.
فيما يلي بعض المشاكل المحتملة التي قد تواجهها. إحدى المشاكل هي أن VB قد يُبلغ عن عدم إمكانية العثور على ملف dll. يمكنك وضع ملف dll في دليل النظام والتأكد من صحة عبارة Declare الخاصة بـ VB. هناك مشكلة أخرى وهي أن VB يُبلغ عن عدم تمكنه من العثور على الوظيفة المطلوبة، وهذا عادةً بسبب عدم تعيين الملف *.def في VC. الموقف الثالث هو أن VB يخبرك أنه لا يمكن إجراء التحويل. قد يكون هذا بسبب عدم إضافة الكلمة الأساسية __stdcall في VC، أو قد يكون نوع معلمات VB وVC غير متناسقين. لاحظ أن int في VC هو 4 بايت (أي ما يعادل VB Long)، في حين أن عدد صحيح VB هو 2 بايت فقط. يجب التأكد من أن عدد المعلمات في VB وVC هو نفسه، وأن عدد البايتات التي تشغلها هو نفسه أيضًا. آخر شيء يجب الانتباه إليه هو أن المصفوفة يجب ألا تتجاوز الحدود الموجودة في VC، وإلا فسوف يتسبب ذلك في تعطل برنامج VB.
1. مزايا استدعاء DLL
باعتبارها أساس نظام التشغيل Windows، تتمتع مكتبة الارتباط الديناميكي (DLL) بأداء تطبيقي فائق:
تعمل ملفات DLL على توسيع ميزات التطبيق. نظرًا لأنه يتم تحميل DLL ديناميكيًا في مساحة عنوان العملية، فيمكن للتطبيق تحديد العمليات التي يجب تنفيذها في وقت التشغيل ثم تحميل التعليمات البرمجية المناسبة لتنفيذ تلك العمليات حسب الحاجة.
يمكن كتابة ملفات DLL بعدة لغات. على سبيل المثال، يتم استخدام لغة VB لكتابة واجهة برنامج التطبيق، ويتم استخدام لغة C++ لكتابة العمليات الأساسية مثل الخوارزميات والاتصالات.
تعمل ملفات DLL على تبسيط إدارة مشاريع البرامج. إذا كانت مجموعات العمل المختلفة تعمل على وحدات مختلفة أثناء تطوير البرامج، فسيكون من الأسهل إدارة المشروع.
DLL يساعد على حفظ الذاكرة. إذا كان هناك تطبيقان أو أكثر يستخدمان نفس ملف DLL، فيجب وضع صفحات DLL في ذاكرة الوصول العشوائي (RAM) مرة واحدة فقط، ويمكن لجميع التطبيقات مشاركة صفحاتها الفردية.
DLL يسهل تقاسم الموارد. يمكن أن تحتوي مكتبات DLL على موارد مثل قوالب الحوار والسلاسل والأيقونات والصور النقطية، ويمكن لتطبيقات متعددة استخدام مكتبات DLL لمشاركة هذه الموارد.
DLL يساعد في توطين التطبيقات. على سبيل المثال، يمكن لتطبيق يحتوي على تعليمات برمجية فقط ولا يحتوي على أي مكونات لواجهة المستخدم تحميل ملف DLL يحتوي على مكونات واجهة المستخدم المترجمة.
تساعد ملفات DLL في حل اختلافات النظام الأساسي. تم تجهيز الإصدارات المختلفة من Windows بوظائف مختلفة، وغالبًا ما يرغب المطورون في استدعاء وظائف جديدة. ومع ذلك، إذا كانت التعليمات البرمجية المصدر تحتوي على استدعاء لوظيفة جديدة، وكان سيتم تشغيل التطبيق على إصدار من Windows لا يوفر هذه الوظيفة، فسوف يرفض مُحمل نظام التشغيل تشغيل العملية. إذا تم حفظ هذه الوظائف الجديدة في ملف DLL، فيمكن للتطبيق تحميلها إلى الإصدارات الأقدم من Windows واستدعاء الوظيفة بنجاح.
2. ابحث عن نقطة دخول ملف DLL
غالبًا ما يواجه المستخدمون الذين يتعاملون مع مكتبات DLL لأول مرة مشكلة: يعمل ملف DLL الذي تم إنشاؤه في بيئة VC بشكل جيد في VC، ولكن عند استدعائه في تطبيق VB، يظهر دائمًا إدخال "خطأ في اصطلاح الاتصال" أو "لم يتم العثور عليه". نقطة "أخطاء. يحدث هذا بشكل رئيسي بسبب الإغفالات التالية.
أولاً، تجدر الإشارة إلى أن تعريف الوظيفة في DLL وتعريف الوظيفة في VB يجب أن يكونا متماثلين تمامًا من حيث الاسم ونوع الإرجاع ونوع المعلمة وعدد المعلمات وما إلى ذلك. انتبه بشكل خاص لمسألة الكتابة بالأحرف الكبيرة.
ثانيا، يجب إضافة وظيفة الإدخال إلى ملف .def الخاص بـ DLL.
وأخيرًا، يجب إضافة الكلمات الرئيسية الخارجية "c" و_stdcall قبل تعريف الوظيفة.
يرجى الرجوع إلى مثال التطبيق لمعرفة التنسيق المحدد.
3. تمرير معلمات الصفيف في DLL
نظرًا لأن مكتبة الارتباط الحيوي (DLL) تُستخدم غالبًا لتنفيذ بعض العمليات ذات المستوى المنخفض، فغالبًا ما تحتاج التطبيقات إلى تمرير كمية كبيرة من البيانات إلى مكتبة الارتباط الحيوي (DLL). في لغة C++، تعتبر المؤشرات هي الخيار الأفضل لعمليات المصفوفة، لكن لا يوجد مفهوم للمؤشرات في لغة VB. يمكن عادة حل هذا بطريقتين.
أولاً، عند الإعلان عن ملف DLL في VB، استخدم byref بدلاً من byval لتمرير مؤشر الصفيف إلى ملف DLL.
بالإضافة إلى ذلك، من خلال إعلان الصفيف كمتغير، يمكنك تمرير الصفيف مباشرةً إلى مكتبة الارتباط الحيوي (DLL).
4. أمثلة التطبيق
يستخدم ما يلي مثالا محددا لتوضيح عملية استدعاء DLL التي تم إنشاؤها في بيئة VC في VB.
قم بإنشاء ملف DLL لمعالجة الإشارات، "SigPro.dll"، والذي يحتوي على دالة "Fourier" لحسابات فورييه.
بيان في VC:
أضف الكود التالي إلى "SigPro.h"،
انسخ رمز الكود كما يلي:
الخارجي "ج"
{
double EXPORT _stdcall Fourier(long int *Sample,int NumSam,int OvertoneOrder,bool SinOrCos);
}
أضف الكود التالي إلى "SigPro.cpp"،
الخارجي "ج"
تصدير مزدوج _stdcall فورييه (طويل int *Sample،int NumSam،int OvertoneOrder،bool SinOrCos)
{
كثافة العمليات أنا؛
نتيجة مزدوجة = 0.0؛
إذا (SinOrCos==صحيح)
{
ل(i=0;i<NumSam;i++)
{
result=result+*(Sample+i)*cos(OvertoneOrder*i*2*3.1415926/NumSam);
}
}
آخر
{
ل(i=0;i<NumSam;i++)
{
result=result+*(Sample+i)*sin(OvertoneOrder*i*2*3.1415926/NumSam);
}
}
result =result*2/NumSam;
نتيجة الإرجاع؛
}
أضف الكود التالي إلى "SigPro.def"،
صادرات
فورييه
بيان الاستدعاء في VB:
الإعلان العام عن وظيفة Fourier Lib "SigPro" (ByRef Sample() As Long، ByVal NumSam كعدد صحيح، ByVal OvertoneOrder كعدد صحيح، ByVal SinOrCos كـ Boolean) كمضاعفة