السلام عليكم ورحمة الله وبركاته
كنت قد قرأت منذ زمن على موقع developpez موضوع جميل جدا يتحدث عن الطرق الصحيحة لكتابة مكتبة بالسي يمكن استعمالها على الvb وسأحاول التطرق باختصار وبطريقتي الخاصة لتطبيق عملي للموضوع على vc++2005 مع الvb6
قبل البدء قد يطرح البعض سؤالا مهما : لماذا أعمل مكتبة بالسي ++ ولا أعملها مباشرة بالvb ؟
والجواب باختصار :
- هناك عدة أشياء لا يمكننا عملها على الvb6
- السرعة في الأداء فالسي تمتلك سرعة تنفيذ أكبر
التطبيق ينقسم إلى قسمين : قسم يختص في كتابة المكتبة على الvc++2005
والثاني كتابة كود الاستدعاء على الvb6
نبدأ مباشرة بانشاء مشروع فارغ على الvc++2005
بعدها نقوم باضافة ملف كود للمشروع ونقوم باعطاءه اسم طبعا
نضيف أيضا ملف header بامتداد h وملف آخر .def نعرف فيه المكتبة والدوال الموجودة فيها
في الأخير سيكون لدينا 3 ملفات :
ملف الكود .cpp
ملف header بامتداد .h
وملف تعريف .def
نبدأ بمثال بسيط نحاول به كتابة دالة تقوم بالجمع مثلا نقوم بتعريفها في ملف الهيدر
define EXPORT __declspec (dllexport) EXPORT int __stdcall TestFunction(int x1,int x2);
عرفنا هنا EXPORT والتي تقوم بتصدير الدالة TestFunction والتي ترجع قيمة من النوع int أي Integer
هنا استمعلنا __stdcall كي يتم تصدير الدالة تحت اسم TestFunction وليس باسم آخر (يعني بدون رموز )
في ملف الكود (امتداد cpp)
نكتب كود الدالة التي تقوم بالجمع :D
#include "definition.h"
int __stdcall TestFunction(int x1,int x2)
{
return x1+x2;
}هنا عملنا include لملف الهيدر الذي كتبناه قبل وسميناه مثلا definition.h
ثم قمنا بكتابة كود الدالة التي ترجع لنا مجموع الرقمين x1 وx2
لا ننسى ملف def
نكتب فيه معلومات المكتبة واسم الدالة الموجودة بها
LIBRARY VB_TEST DESCRIPTION EXPORTS TestFunction
الملف يحوي على 3 أسطر أساسية للتعريف
الأول يمثل اسم المكتبة
الثاني غير مهم يمكن وضع وصف للمكتبة فيه
والثالث اسم الدالة او الداول الموجودة في المكتبة
بهذا يمكننا عمل بناء للمكتبة عن طريق build
طبعا مع مراعاة تغيير خاصية المشروع إلى Dynamic Library
طبعا الناتج سيكون موجود في مجلد debug الموجود به المشروع
والناتج سيكون VB_DLL1.dll
الآن نمر إلى كيفية كتابة كود الاستدعاء من الvb6
يجب مراعاة وجود المكتبة اما مع مشروع الvb6 أو في مجلد النظام system32
طبعا المكتبة المنشئة بها دالة اسمها TestFunction موجودة في الملف VB_DLL1.dll ولها 2 برامتر من النوع integer وترجع قيمة من النوع integer أيضا
لذلك نكتب التصريح التالي مثل أي تصريح بدالة API
Private Declare Function TestFunction Lib "VB_DLL1.dll" (ByVal x1 As Integer, ByVal x2 As Integer) As Integer
الدالة الآن جاهزة للاستعمال :D
MsgBox TestFunction(10, 20)
ياترى هل سيكون الناتج 30 ؟ :wub:
بالتوفيق للجميع
