بالنسبة لموضوع ال com بعض الاجزاء انقلها إليكم من بعض المقالات التى حفظتها و هى للاستاذ هانى الاتاسى لا اعلم إذا كانت المقالات ما تزال فى المنتدى
اقتباسقبل أن تطرق لمعنى COM يجب أن تعرف ما هو ال Component . ما معنى كلمة Component : هي عبارة عن قطعة برمجية تقوم بعمل ما، وأي برنامج يستطبع استخداك هذا الكومبوننت. ومن ميزت ال component أنها متضمنة لجميع أعمالها داخليا وبالتالي من السهر تغييرها.. الفكرة طبعا رائعة ، لأنها تسمح لك بكتابة component مرة واحدة واستخدامها أكثر من مرة في برامج مختلفة. ومن ثم يمكنك تحسين هذه ال component فقط عن طريق تطوير الكود ووضعها محل السابقة. ولكن من أجل أن يعمل هذا بشكل صحيح يجب أن تكون هناك مقاييس معينة من أجل أن تعرف البرامج كيف يمكن أن تنشئ ال component وكيف يمكن استدعائها وغير ذلك من الأمور .بالنسبة إلى COM كما تعلم هي Component Object Model .. وهي عبارة مقياس وضعته ميكروسوفت من أجل بناء ال components .. إذا COM هي عبارة فقط عن مواصفات من أجل بناء قطعة من الكود متوافقة. هذا يعني أن COM هي ليست لغة برمجة أو مكتبة library أو حتى مترجم .. لكن هي تمنحك موصفات ثابتة من أجل بناء components تستطيع أن تتحدث مع بعضها بغض النظر عن اللغة التي تم تطويرها بها ..
بالمختصر .. COM عبارة عن قوانين وإذا اتبعت هذه القوانين في بنائك لاحدى ال components فسوف تستطيع هذه أن تعمل مع باقي ال COM Components بغض النظر عن اللغة المبرمجة بها ..
قد تتخربط بين مفهوم COM و Static Library : الوضع هنا مختلف لأن ال static library تحتاج إلى اعادة ترجمة مشروعك عند تغيير المكتبة ..
ماذا عن COM و Dynamic Library : هنا المفهوم متقارب حتى أن COM في النهاية تنتج لك ملفات DLL أو EXE لكن الفرق بينهما أن COM تقوم بتعريف مواصفات ثابتة من أجل تطوير ال component .. طبعا إذا أردت أن تعمل قطعة من برنامجك adabtable بحيث فقط تعمل معك فالأسل صنعها عن طريق Synamic Library ..
مفهوم ال Proxy .. هو ماتتميز به COM أيضا .. كما تعلم من أجل استدعاء تابع في مكتبة ديناميكية فأنت تستدعي LoadLibrary وهذا الAPI يقوم بتحميل المكتبة في نفس ال Process وبعدها تستطيع استخدامها .. لكن ال COM ممكن أن تعمل بغض النظر عن توضعها فقد تكون في نفس ال Process أو في Process آخر أو حتى في جهاز آخر .. وال COM Engine مسؤولة عن عملية نقل الاستدعاء من موقع إلى آخر بشمل شفاف .. أي أن المستدعي لن يعرف أين تتوضع الcomponent التي يستدعيها .. هذه العملية تتم أن ال COM Engine تقوم بانشاء كود اسمه Stub و كود اسمه Proxy يتخاطبان مع بعضهما ..
ال COM في عالم هندسة البرمجيات تجمع بين المصطلحين :
Polymorphism: وهي امكانية الوصول إلى الكائن الحقيقي عن طريق معرفة مؤشر لكائن أب . وهي تماما كما في ال virtual في السي++
Proxy: وهي امكانية الوصول إلى الكائن بغض النظر عن توضعه الفيزيائي فقد يكون في process آخر أو في جهاز آخر او حتى في شبك أخرى ..
ببساطة ال COM صنعت من أجل المفهومين السابقين طبعا مع مفاهيم أخرى مثل ال Reuse و ال Encapsulation ولكن هذه كلها مفاهيم تنطبق على كلاسات . بعض المفاهيم الأخرى التي يجب أن تتواجد في COM هي ال Reference Counting وال Class Factory .. وسوف نتطرق لها لاحقا ..
ببساطة تصور أنك صنعت class ووضعته في مكتبه خارجية .. هذا الكلاس يحتوي على توابع ثابتة .. ولديك طبعا برنامج يقوم باستدعاء هذه التوابع بعد أن يطلب بناء كائن لها (عملية البناء تتم عن طريق ال class factory الذي يجب بنائه مع ال class السابق) أي أنك لن تستدعي new من أجل بناء كائن لك ..
الآن ماذا لو أحببت تغيير الكود للclass الموجود في مكتبة خارجية فما عليك سوا اعادة ترجمة المكتبة ونسخها فوق القديمة ليستمر البرنامج بالعمل على الكود الجديد من غير أن يجس أي فرق .. أما لو كانة هذه ال class موجودة داخل برنامجك فالأمر يقتضي عملية ترجمة كاملة للبرنامج .. وهذا أمر لا نريده في معظم الأحيان
توجد عدة طرق من أجل بناء COM في السي++ ويفضل أن نبدأ ببنائها من الصفر باستخدام كود سي++ ومن بعدها نقوم باستخدام ال ATL
تم تعديل هذه المشاركة بواسطة win98_eg في 5 نوفمبر 2003 في 02:22
Technical Lead Developer
اللهم قنى شر الجهل و الجهلاء
( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}
