نموذج كائن المكون
نموذج كائن المكون ( COM ) هو تقنية واجهة ثنائية لمكونات البرامج من مايكروسوفت والتي تتيح استخدام الكائنات بطريقة محايدة للغة بين لغات البرمجة المختلفة وسياقات البرمجة والعمليات والآلات .
يُعد COM أساسًا لتقنيات مكونات مايكروسوفت الأخرى الخاصة بالمجال بما في ذلك OLE و OLE Automation و ActiveX و COM+ و DCOM بالإضافة إلى تطبيقات مثل DirectX و Windows shell و UMDF و Windows Runtime و Browser Helper Object .
تُمكّن تقنية COM من استخدام الكائنات عندما تكون واجهة الكائن فقط معروفة، وليس تنفيذه الداخلي. يقوم مُنفِّذ المكون بتعريف واجهات منفصلة عن التنفيذ.
يتم دعم سياقات البرمجة المتعددة بالاعتماد على الكائن في الجوانب التي يصعب تنفيذها كآلية مستقلة. ويتم دعم الاستخدامات المتعددة للكائن من خلال إلزام كل كائن بتدمير نفسه تلقائيًا عبر عدّ المراجع . كما يوفر كل كائن إمكانية الوصول إلى واجهاته (على غرار تحويل الأنواع ).
تتوفر واجهة COM فقط في نظام التشغيل مايكروسوفت ويندوز وواجهة برمجة التطبيقات (API) الخاصة بـ Core Foundation 1.3 من Apple والإصدارات الأحدث . [ 1 ] ولا تُنفذ الأخيرة سوى جزء من واجهة COM الكاملة. [ 2 ]
بمرور الوقت، يتم استبدال COM بتقنيات أخرى مثل Microsoft .NET وخدمات الويب (مثل WCF ). ومع ذلك، يمكن استخدام كائنات COM في لغة .NET عبر COM Interop .
تتشابه تقنية COM مع تقنيات المكونات الأخرى مثل SOM و CORBA و Enterprise JavaBeans ، على الرغم من أن لكل منها نقاط قوة وضعف.
على عكس لغة C++ ، توفر COM واجهة ثنائية مستقرة للتطبيقات (ABI) لا تتأثر باختلافات المُصرّفات. [ 3 ] وهذا ما يجعل استخدام COM مفيدًا لمكتبات C++ الكائنية التوجه التي ستستخدمها برامج عميلة مُصرّفة عبر مُصرّفات مختلفة.
تاريخ
تم تقديم تقنية تبادل البيانات الديناميكي (DDE) في عام 1987، وكانت واحدة من أوائل تقنيات الاتصال بين العمليات في نظام التشغيل ويندوز . [ 4 ] [ 5 ] وقد سمحت بإرسال واستقبال الرسائل فيما يسمى بالمحادثات بين التطبيقات.
قام توني ويليامز، الذي شارك في تصميم COM، بتوزيع ورقتين داخل مايكروسوفت تبنتا مفهوم مكونات البرمجيات: بنية الكائنات: التعامل مع المجهول - أو - سلامة النوع في مكتبة فئات قابلة للتوسيع ديناميكيًا [ 6 ] في عام 1988، وحول الوراثة: ما تعنيه وكيفية استخدامها [ 7 ] في عام 1990. وقد شكلت هذه الأوراق أساس العديد من الأفكار الكامنة وراء COM.
تم بناء إطار عمل ربط وتضمين الكائنات (OLE)، وهو أول إطار عمل قائم على الكائنات من مايكروسوفت، على أساس DDE وصُمم خصيصًا للمستندات المركبة . تم تقديمه مع برنامجي Word و Excel في عام 1991، ثم أُضيف لاحقًا إلى نظام التشغيل Windows، بدءًا من الإصدار 3.1 في عام 1992. ومن أمثلة المستندات المركبة جدول بيانات مُضمن في مستند Word. فعند إجراء أي تغييرات على جدول البيانات في Excel، تظهر هذه التغييرات تلقائيًا في مستند Word.
في عام ١٩٩١، قدمت مايكروسوفت تقنية Visual Basic Extension (VBX) مع إصدار Visual Basic 1.0. تُعدّ VBX إضافةً مُغلّفةً على شكل مكتبة ارتباط ديناميكي (DLL) تُمكّن من وضع الكائنات رسوميًا في نموذج ومعالجتها عبر الخصائص والأساليب . وقد تمّ لاحقًا تكييف هذه التقنية للاستخدام في لغات أخرى مثل Visual C++ . كما دُمجت تقنية OLE 1.0 في نظام التشغيل Windows 3.1 .
في عام ١٩٩٢، أصدرت مايكروسوفت OLE 2 مع نموذج الكائنات الأساسي الجديد COM. كانت واجهة التطبيق الثنائية (ABI) الخاصة بـ COM مطابقة لواجهة MAPI ABI (التي صدرت عام ١٩٩٢)، ومثلها، استندت إلى MSRPC ، وفي النهاية إلى DCE/RPC من Open Group . تم إنشاء COM ليحل محل DDE، نظرًا لأن تصميم المحادثة النصية ورسائل ويندوز لم يكن مرنًا بما يكفي للسماح بمشاركة ميزات التطبيق بطريقة قوية وقابلة للتوسيع. وقد قدم COM معرّف UUID .
في عام 1994، طُرحت تقنية التحكم المخصص OLE (OCX)، القائمة على COM، كخليفة لتقنية VBX. وفي الوقت نفسه، صرّحت مايكروسوفت بأن OLE 2 ستُعرف ببساطة باسم "OLE". وقد دُمجت تقنية OLE 2.0 في نظامي التشغيل Windows NT 3.5 و Windows 95. [ 8 ]
في أوائل عام 1996، وجدت مايكروسوفت استخدامًا جديدًا لتقنية OCX ، وهو توسيع إمكانيات متصفح الويب الخاص بها. أعادت مايكروسوفت تسمية بعض أجزاء OLE المتعلقة بالإنترنت إلى ActiveX ، ثم أعادت تسمية جميع تقنيات OLE تدريجيًا إلى ActiveX، باستثناء تقنية المستندات المركبة المستخدمة في مايكروسوفت أوفيس .
وفي وقت لاحق من عام 1996، قامت مايكروسوفت بتوسيع نطاق COM ليعمل عبر الشبكة باستخدام DCOM . [ 9 ]
في عام 1997، تم دمج دعم COM في نظام التشغيل Windows CE . [ 10 ]
التقنيات ذات الصلة
MSRPC
تعتمد لغة تعريف واجهة COM على لغة تعريف واجهة DCE/RPC الغنية بالميزات، مع إضافات موجهة للكائنات. وتُستخدم MSRPC ، وهي تطبيق مايكروسوفت لـ DCE/RPC، كآلية الاتصال الأساسية بين العمليات لخدمات Windows NT ومكوناتها الداخلية، مما يجعلها خيارًا بديهيًا كأساس.
DCOM
يُوسّع DCOM نطاق COM من مجرد دعم مستخدم واحد مع تطبيقات منفصلة تتواصل على سطح مكتب Windows، إلى تفعيل الكائنات التي تعمل ضمن سياقات أمان مختلفة، وعلى أجهزة مختلفة عبر الشبكة. وقد أُضيفت إلى ذلك ميزات ضرورية لتحديد المستخدمين المصرح لهم بإنشاء الكائنات وتفعيلها واستدعائها، ولتحديد هوية المستخدم المُستدعي، بالإضافة إلى تحديد التشفير المطلوب لأمان المكالمات.
كوم+
قدمت مايكروسوفت خادم معاملات مايكروسوفت (MTS) في نظام التشغيل ويندوز NT 4 لتزويد المطورين بدعم للمعاملات الموزعة ، وتجميع الموارد، والتطبيقات غير المتصلة، ونشر الأحداث والاشتراك فيها، وإدارة أفضل للذاكرة والمعالج (الخيوط)، بالإضافة إلى وضع ويندوز كبديل لأنظمة التشغيل الأخرى على مستوى المؤسسات.
أُعيد تسمية DCOM إلى COM+ في نظام التشغيل Windows 2000، وتم دمج مجموعة الميزات في نظام التشغيل بدلاً من سلسلة الأدوات الخارجية التي توفرها MTS. في الوقت نفسه، قللت مايكروسوفت من أهمية DCOM ككيان منفصل. وأصبحت المكونات التي تستخدم COM+ تُعالج بشكل مباشر من خلال طبقة COM+ المضافة، ولا سيما من خلال دعم نظام التشغيل لخاصية الاعتراض. في الإصدار الأول من MTS، كانت خاصية الاعتراض مُضافة بشكل غير مباشر - حيث كان تثبيت مكون MTS يُعدّل سجل Windows لاستدعاء برنامج MTS، وليس المكون مباشرةً.
تضمنت أنظمة التشغيل Windows 2000 تحديثات لوحة التحكم الخاصة بخدمات المكونات لتكوين مكونات COM+.
من مزايا COM+ إمكانية تشغيله ضمن "مجموعات مكونات". فإذا تمت برمجته بشكل صحيح، يمكن تجميع نسخ المكون وإعادة استخدامها في استدعاءات جديدة لروتين تهيئته دون الحاجة إلى إخراجه من الذاكرة. كما يمكن توزيع المكونات (استدعاؤها من جهاز آخر). وقد وفر كل من COM+ و Microsoft Visual Studio أدوات تسهل إنشاء وكلاء من جانب العميل، لذا فرغم استخدام DCOM لإجراء الاستدعاء عن بُعد، كان الأمر سهلاً على المطورين. كما قدم COM+ آلية أحداث للمشترك/الناشر تُسمى أحداث COM+ ، ووفر طريقة جديدة للاستفادة من MSMQ (تقنية توفر مراسلة غير متزامنة بين التطبيقات) مع مكونات تُسمى المكونات المُرتبة في قائمة الانتظار . وتُوسع أحداث COM+ نموذج برمجة COM+ لدعم أحداث الربط المتأخر (انظر الربط المتأخر ) أو استدعاءات الأساليب بين الناشر أو المشترك ونظام الأحداث.
.شبكة
.NET هي تقنية المكونات الخاصة بمايكروسوفت والتي تحل محل COM. تخفي .NET العديد من تفاصيل إنشاء المكونات وبالتالي تسهل عملية التطوير.
توفر .NET أغلفة لعناصر تحكم COM شائعة الاستخدام.
يمكن لـ .NET الاستفادة من COM+ عبر System.EnterpriseServicesمساحة الاسم، وقد تم تكرار العديد من الخدمات التي توفرها COM+ في .NET. على سبيل المثال، System.Transactionsتوفر مساحة الاسم فئةً TransactionScopeتُتيح إدارة المعاملات دون الحاجة إلى COM+. وبالمثل، يمكن استبدال المكونات المُدرجة في قائمة الانتظار بـ Windows Communication Foundation (WCF) باستخدام بروتوكول MSMQ .
يوجد دعم محدود للتوافق مع الإصدارات السابقة. يمكن استخدام كائن COM في .NET من خلال تطبيق غلاف قابل للاستدعاء في وقت التشغيل (RCW). [ 11 ] يمكن استخدام كائنات NET التي تتوافق مع قيود واجهة معينة في كائنات COM عن طريق استدعاء غلاف قابل للاستدعاء في COM (CCW). [ 12 ] من كلا جانبي COM و.NET، تظهر الكائنات التي تستخدم التقنية الأخرى ككائنات أصلية. انظر COM Interop .
يُسهّل WCF العديد من تحديات التنفيذ عن بُعد في COM. على سبيل المثال، يسمح بنقل الكائنات بشفافية حسب القيمة عبر حدود العمليات أو الأجهزة بسهولة أكبر.
بيئة تشغيل ويندوز
بيئة تشغيل ويندوز ( WinRT ) هي واجهة برمجة تطبيقات (API) تعتمد على COM، وإن كانت نسخة محسّنة منها. وبفضل بنيتها الشبيهة بـ COM، تدعم WinRT التفاعل من سياقات برمجة متعددة، إلا أنها واجهة برمجة تطبيقات أصلية غير مُدارة. تُخزّن تعريفات واجهة برمجة التطبيقات في ملفات ".winmd"، المُشفّرة بتنسيق بيانات تعريف ECMA 335، وهو نفس تنسيق بيانات تعريف سطر الأوامر الذي يستخدمه .NET مع بعض التعديلات. يتيح هذا التنسيق تقليل الحمل الزائد بشكل ملحوظ مقارنةً بـ P/Invoke عند استدعاء WinRT من تطبيقات .NET.
نانو كوم
Nano-COM هي مجموعة فرعية من COM تركز على جوانب واجهة التطبيق الثنائية (ABI) الخاصة بـ COM، والتي تُمكّن من استدعاء الدوال والأساليب عبر الوحدات/المكونات المُجمّعة بشكل مستقل. يمكن التعبير عن Nano-COM في ملف رأس C++ قابل للنقل. تُوسّع Nano-COM واجهة التطبيق الثنائية الأصلية لبنية التعليمات الأساسية ونظام التشغيل لدعم مراجع الكائنات المُحددة النوع ، بينما تركز واجهة التطبيق الثنائية التقليدية على الأنواع الذرية والهياكل والمصفوفات واتفاقيات استدعاء الدوال.
يُعرّف ملف رأس Nano-COM أو يُسمّي ثلاثة أنواع على الأقل:
- GUID - يحدد نوع الواجهة
- HRESULT – رموز نتائج الأساليب مثل S_OK و E_FAIL و E_OUTOFMEMORY
- IUnknown – النوع الأساسي لمراجع الكائنات؛ وظائف افتراضية مجردة لدعم
dynamic_cast<T>اكتساب أنواع واجهات جديدة وحساب المراجع على غرارshared_ptr<T>
تُعرّف العديد من استخدامات Nano-COM وظيفتين لمعالجة مخازن الذاكرة المخصصة بواسطة المُستدعى كنتائج:
- <NanoCom>Alloc – يتم استدعاؤها بواسطة تطبيقات الأساليب لتخصيص مخازن مؤقتة خام (وليست كائنات) يتم إرجاعها إلى المستدعي
- <NanoCom>Free – يتم استدعاؤها بواسطة مستدعي الأساليب لتحرير المخازن المؤقتة التي خصصها المستدعى عند عدم استخدامها
تتجنب بعض تطبيقات Nano-COM مثل Direct3D وظائف التخصيص وتقتصر على استخدام المخازن المؤقتة التي يخصصها المتصل فقط.
لا يوجد لدى Nano-COM مفهوم للفئات أو الشقق أو الترتيب أو التسجيل وما إلى ذلك. بدلاً من ذلك، يتم تمرير مراجع الكائنات ببساطة عبر حدود الوظائف وتخصيصها عبر بنيات اللغة القياسية (مثل newعامل C++).
تُستخدم تقنية Nano-COM حاليًا كتقنية ABI الأساسية لـ DirectX / Direct3D / DirectML .
حماية
في متصفح إنترنت إكسبلورر
بما أن عنصر تحكم ActiveX (أي مكون COM) يعمل كشفرة برمجية أصلية، دون حماية من بيئة معزولة ، فإن القيود المفروضة على وظائفه قليلة. وقد أدى استخدام مكونات ActiveX، كما هو مدعوم في Internet Explorer ، في صفحات الويب إلى مشاكل تتعلق بالإصابة بالبرامج الضارة . وقد أدركت مايكروسوفت هذه المشكلة منذ عام 1996 عندما صرّح تشارلز فيتزجيرالد قائلاً: "لم ندّعِ قطّ أن ActiveX آمن بطبيعته". [ 13 ] وتقوم الإصدارات اللاحقة من Internet Explorer بتنبيه المستخدم قبل تثبيت عنصر تحكم ActiveX، مما يسمح له بمنع التثبيت.
كمستوى من الحماية، يتم توقيع عنصر تحكم ActiveX بتوقيع رقمي لضمان الأصالة.
من الممكن أيضًا تعطيل عناصر تحكم ActiveX تمامًا، أو السماح لعدد قليل منها فقط.
فساد العمليات
يُعزز الدعم الشفاف لخوادم COM خارج العملية سلامة البرمجيات من حيث عزل العمليات . وهذا مفيد لفصل الأنظمة الفرعية للتطبيقات الكبيرة إلى عمليات منفصلة. يحد عزل العمليات من تأثير تلف الحالة في عملية ما على سلامة العمليات الأخرى، لأنها تتواصل فقط عبر واجهات محددة بدقة. وبالتالي، لا يلزم إعادة تشغيل سوى النظام الفرعي المتأثر لاستعادة حالته الصحيحة. لا ينطبق هذا على الأنظمة الفرعية داخل العملية نفسها، حيث يمكن لمؤشر معطوب في نظام فرعي أن يُتلف الأنظمة الفرعية الأخرى عشوائيًا.
ملزم
يدعم COM عبر روابط في عدة لغات برمجة، مثل C و C++ و Visual Basic و Delphi و Python [ 14 ] [ 15 ] ، بالإضافة إلى العديد من سياقات البرمجة النصية لنظام Windows. يتم الوصول إلى المكونات عبر أساليب الواجهة . يتيح ذلك الاستدعاء المباشر داخل العملية، وعبر الوصول إلى نظام COM/DCOM الفرعي بين العمليات وأجهزة الكمبيوتر.
نظام الكتابة
فئة مشتركة
تُنفّذ فئة COM، أو الفئة المشتركة ، واجهة واحدة أو أكثر. ويتم تعريفها بواسطة مُعرّف فئة يُسمى CLSID وهو GUID ، ومُعرّف برمجي قابل للقراءة يُسمى ProgID. ويتم إنشاء الفئة المشتركة باستخدام أحد هذين المُعرّفين.
واجهة المستخدم
كل واجهة COM توسع IUnknownالواجهة، والتي تعرض طرقًا لحساب المراجع وللوصول إلى الواجهات الأخرى للكائن - على غرار تحويل النوع ، المعروف أيضًا باسم تحويل النوع.
يتم تحديد الواجهة بواسطة معرف الواجهة (IID)، وهو معرف فريد عالمي (GUID).
توفر الواجهة المخصصة ، أي شيء مشتق منها IUnknown، وصولاً مبكراً مرتبطاً عبر مؤشر إلى جدول الأساليب الافتراضية الذي يحتوي على قائمة بمؤشرات إلى الدوال التي تُنفذ الدوال المُعلنة في الواجهة، بالترتيب الذي تم الإعلان عنها به. وبالتالي، فإن تكلفة الاستدعاء داخل العملية تُقارن بتكلفة استدعاء أسلوب افتراضي في لغة C++.
يتم توفير خاصية الإرسال، أو ما يُعرف بالوصول المتأخرIDispatch ، من خلال التنفيذ . وتتيح خاصية الإرسال الوصول من نطاق أوسع من سياقات البرمجة مقارنةً بالواجهة المخصصة.
على غرار العديد من لغات البرمجة كائنية التوجه، يوفر COM فصلًا بين الواجهة والتنفيذ. ويبرز هذا التمييز بشكل خاص في COM حيث لا يمتلك الكائن واجهة افتراضية. يجب على العميل طلب واجهة للوصول إليها. يدعم COM تطبيقات متعددة لنفس الواجهة، مما يتيح للعملاء اختيار التطبيق الذي يرغبون باستخدامه.
مكتبة الأنواع
تُعرّف مكتبة أنواع COM بيانات تعريف COM، مثل الفئات المشتركة والواجهات. ويمكن تعريف المكتبة كلغة تعريف واجهة (IDL)، وهي لغة برمجة مستقلة عن لغات البرمجة. تشبه IDL لغة C++ مع إضافة صيغة لتعريف الواجهات والفئات المشتركة. كما تدعم IDL السمات بين قوسين قبل التصريحات لتعريف بيانات تعريف مثل المعرّفات والعلاقات بين المعاملات.
يتم تجميع ملف IDL باستخدام مُجمِّع MIDL. عند استخدامه مع لغتي C/C++، يُنشئ مُجمِّع MIDL ملف رأس يحتوي على structتعريفات تُطابق جداول الدوال الافتراضية (vtbls) للواجهات المُعلنة، وملف C يحتوي على تعريفات مُعرِّفات GUID للواجهات . كما يُمكن لمُجمِّع MIDL إنشاء شفرة مصدر C++ لوحدة وسيطة. تحتوي هذه الوحدة الوسيطة على نماذج أولية للأساليب لتحويل استدعاءات COM إلى استدعاءات إجراءات عن بُعد ، مما يُتيح استخدام DCOM للاتصال خارج العملية.
يمكن لـ MIDL إنشاء مكتبة أنواع ثنائية (TLB) يمكن استخدامها بواسطة أدوات أخرى لدعم الوصول من سياق آخر.
أمثلة
يُعلن كود IDL التالي عن فئة مشتركة باسم SomeClass والتي تُنفذ واجهة باسم ISomeInterface .
coclass SomeClass { [ default ] interface ISomeInterface ; };هذا يعادل من الناحية المفاهيمية كود C++ التالي حيث ISomeInterface عبارة عن فئة افتراضية بحتة ، أو ما يُعرف بالفئة الأساسية المجردة.
class ISomeInterface {}; class SomeClass : public ISomeInterface { };في لغة C++، يتم إنشاء كائنات COM عبر دالة CoCreateInstance التابعة لنظام COM الفرعي ، والتي تأخذ مُعرّف الفئة (CLSID) ومُعرّف الكائن (IID). يمكن إنشاء كائن SomeClass كما يلي:
ISomeInterface * interface_ptr = NULL ; HRESULT hr = CoCreateInstance ( CLSID_SomeClass , NULL , CLSCTX_ALL , IID_ISomeInterface , ( void ** ) & interface_ptr );عد المراجع
يستخدم كائن COM عدّ المراجع لإدارة دورة حياة الكائن. ويتحكم العملاء في عدّ المراجع للكائن من خلال طريقتي `resource` IUnknownAddRefو`resource` Release. وتتولى كائنات COM مسؤولية تحرير ذاكرتها عندما ينخفض عدّ المراجع إلى الصفر. توفر بعض بيئات البرمجة (مثل Visual Basic ) عدّ المراجع تلقائيًا لتبسيط استخدام الكائنات. في لغة C++، يمكن استخدام المؤشر الذكي لأتمتة إدارة عدّ المراجع.
فيما يلي إرشادات حول متى يجب استدعاء AddRef و Release :
- تقوم الدالة التي تُرجع مرجعًا للواجهة (عبر قيمة الإرجاع أو عبر مُعامل "out") بزيادة عدد الكائنات المُرجعة
- يتم استدعاء دالة Release قبل أن يتم استبدال مؤشر الواجهة أو يخرج عن النطاق
- إذا تم إنشاء نسخة على مؤشر مرجعي للواجهة، فسيتم استدعاء AddRef
- يتم استدعاء الدالتين AddRef و Release على الواجهة التي تتم الإشارة إليها (وليس واجهة مختلفة لنفس الكائن) لأن الكائن قد يطبق عدادات مرجعية لكل واجهة من أجل تخصيص الموارد الداخلية فقط للواجهات التي تتم الإشارة إليها.
بالنسبة للكائنات البعيدة، لا تُرسل جميع استدعاءات عدّ المراجع عبر الشبكة. يحتفظ الوكيل بمرجع واحد فقط على الكائن البعيد ويحتفظ بعدّ المراجع المحلي الخاص به.
لتبسيط تطوير تطبيقات COM لمطوري لغة C++، قدمت مايكروسوفت مكتبة ATL (مكتبة القوالب النشطة) . توفر ATL نموذجًا عالي المستوى نسبيًا لتطوير تطبيقات COM، كما أنها تُغني مطوري تطبيقات عميل COM عن الحاجة إلى إدارة عدّ المراجع مباشرةً، وذلك من خلال توفير أنواع مؤشرات ذكية . تشمل المكتبات واللغات الأخرى المتوافقة مع COM: فئات مايكروسوفت الأساسية ، ودعم COM في مُصرّف VC ، [ 16 ] وVBScript ، و Visual Basic ، وECMAScript ( JavaScript )، و Borland Delphi .
سياق البرمجة
COM هو معيار ثنائي مستقل عن اللغة يسمح باستخدام الكائنات في أي سياق برمجي قادر على الوصول إلى واجهاته الثنائية.
برنامج عميل COM مسؤول عن تمكين النظام الفرعي COM، وإنشاء كائنات COM وحساب مراجعها، والاستعلام عن الكائنات للواجهات المدعومة.
يدعم مُصرّف Microsoft Visual C++ امتدادات للغة C++، تُعرف باسم سمات C++ ، [ 17 ] وهي مصممة لتبسيط تطوير COM وتقليل التعليمات البرمجية النمطية المطلوبة لتنفيذ خوادم COM في C++. [ 18 ]
تخزين بيانات التعريف النوعية
في الأصل، كان يُشترط تخزين بيانات تعريف مكتبة الأنواع في سجل النظام. وكان عميل COM يستخدم معلومات السجل لإنشاء الكائنات.
تم تقديم تقنية COM غير المسجلة (RegFree) مع نظام التشغيل Windows XP للسماح بتخزين بيانات تعريف مكتبة الأنواع كبيان تجميع، إما كمورد في الملف التنفيذي أو في ملف منفصل يتم تثبيته مع المكون. [ 19 ] يتيح ذلك تثبيت إصدارات متعددة من المكون نفسه على نفس الحاسوب، في مجلدات مختلفة. كما يسمح بنشر XCOPY . [ 20 ] تدعم هذه التقنية خوادم EXE COM بشكل محدود [ 21 ] ولا يمكن استخدامها مع مكونات النظام مثل MDAC و MSXML و DirectX و Internet Explorer .
أثناء تحميل التطبيق، يبحث مُحمِّل Windows عن ملف البيان. [ 22 ] إذا كان موجودًا، يُضيف المُحمِّل معلومات منه إلى سياق التنشيط. [ 20 ] عندما يُحاول مُصنِّع فئة COM إنشاء مثيل لفئة، يتم التحقق أولًا من سياق التنشيط لمعرفة ما إذا كان بالإمكان العثور على تطبيق لـ CLSID. فقط في حالة فشل البحث، يتم فحص سجل النظام . [ 20 ]
يمكن إنشاء كائن COM دون معلومات مكتبة الأنواع، ويكفي مسار ملف DLL وCLSID. يستطيع العميل استخدام دالة COM DLL DllGetClassObjectمع CLSID وIID_IClassFactory لإنشاء نسخة من كائن المصنع . ثم يستخدم العميل كائن المصنع CreateInstanceلإنشاء نسخة أخرى. [ 23 ] هذه هي نفس العملية التي يستخدمها النظام الفرعي COM. [ 24 ] إذا أنشأ كائنٌ تم إنشاؤه بهذه الطريقة كائنًا آخر، فسيفعل ذلك بالطريقة المعتادة (باستخدام سجل النظام أو بيان التعريف). ولكنه يستطيع إنشاء كائنات داخلية (قد لا تكون مسجلة أصلًا)، وتوزيع مراجع لواجهاتها، مستخدمًا معرفته الخاصة.
التنسيق
يمكن إنشاء كائن COM واستخدامه بشفافية من داخل نفس العملية (داخل العملية)، أو عبر حدود العمليات (خارج العملية)، أو عن بُعد عبر الشبكة (DCOM). تستخدم الكائنات خارج العملية والكائنات البعيدة عملية تحويل البيانات إلى تسلسل لترتيب استدعاءات الدوال وقيم الإرجاع عبر حدود العمليات أو الشبكة. هذه العملية غير مرئية للعميل، الذي يصل إلى الكائن كما لو كان كائنًا محليًا داخل العملية.
عملية ربط الخيوط
في لغة COM، تُعالج عملية تعدد الخيوط من خلال مفهوم يُعرف باسم "الشقق" . [ 25 ] يوجد كل كائن COM في شقة واحدة فقط، قد تكون أحادية الخيط أو متعددة الخيوط. توجد ثلاثة أنواع من الشقق في COM: شقة أحادية الخيط (STA) ، وشقة متعددة الخيوط (MTA) ، وشقة محايدة للخيوط (NA). تمثل كل شقة آليةً لمزامنة الحالة الداخلية للكائن عبر خيوط متعددة. يمكن أن تتكون العملية من عدة كائنات COM، بعضها يستخدم STA والبعض الآخر يستخدم MTA. جميع الخيوط التي تصل إلى كائنات COM موجودة في شقة واحدة. يتم تحديد الشقة المناسبة لكائنات COM والخيوط أثناء التشغيل، ولا يمكن تغييرها.
| نوع الشقة | نموذج الخيوط | وصف |
|---|---|---|
| شقة ذات مسار واحد [ 26 ] (STA) | شقة | يُخصص خيط واحد لتنفيذ وظائف الكائن. أما استدعاءات الوظائف من الخيوط الخارجية، فيتم تجميعها وإضافتها تلقائيًا إلى قائمة الانتظار بواسطة النظام (عبر نظام مراسلة ويندوز). وبذلك، يوفر وقت تشغيل COM تزامنًا لضمان اكتمال تنفيذ كل استدعاء وظيفة للكائن قبل استدعاء وظيفة أخرى. |
| شقة متعددة الخيوط [ 27 ] (MTA) | حر | لا يوفر وقت تشغيل COM أي تزامن، ويُسمح لعدة سلاسل عمليات باستدعاء أساليب الكائن في وقت واحد. يجب أن يتعامل الكائن مع التزامن لمنع حدوث مشاكل نتيجة الوصول المتزامن من عدة سلاسل عمليات. كما يتم تنظيم استدعاءات كائن MTA من سلسلة عمليات في STA. |
| شقة محددة ديناميكيًا | كلاهما | يختار الخادم تلقائيًا نوع STA أو MTA عند إنشاء الكائن ليتوافق مع نوع وحدة المعالجة الخاصة بالخيط المُستدعي. [ 28 ] قد يكون هذا مفيدًا لتجنب تكاليف المعالجة الإضافية عند الوصول إلى خوادم MTA بواسطة خيط STA. |
| شقة محايدة للخيوط (NA) | حيادي | شقة خاصة بدون أي خيوط مُخصصة. عندما يستدعي خيط STA أو MTA كائن NA في نفس العملية، فإن الخيط المُستدعي يغادر شقته مؤقتًا وينفذ التعليمات البرمجية مباشرةً في NA دون أي تبديل للخيوط. [ 29 ] لذلك، يمكن اعتبار NA بمثابة تحسين لاستدعاءات الأساليب بين الشقق بكفاءة. |
تخضع الخيوط والكائنات التابعة لنفس الوحدة لقواعد الوصول نفسها. لذا، تُنفَّذ استدعاءات الدوال داخل الوحدة نفسها مباشرةً دون أي تدخل من COM. أما استدعاءات الدوال بين الوحدات المختلفة فتتم عبر عملية التنسيق، مما يستلزم استخدام الوكلاء والبدائل.
الانتقادات
تعقيد
تعتبر تقنية COM معقدة نسبياً، خاصة بالمقارنة مع تقنيات المكونات الحديثة مثل .NET.
ضخ الرسائل
عند تهيئة وحدة معالجة مركزية (STA)، يتم إنشاء نافذة مخفية تُستخدم لتوجيه الرسائل بين الأقسام والعمليات. يجب تحديث قائمة انتظار الرسائل في هذه النافذة بانتظام. يُعرف هذا التركيب باسم " مضخة الرسائل ". في الإصدارات السابقة من ويندوز، قد يؤدي عدم القيام بذلك إلى حدوث حالات تعطل على مستوى النظام. وتزداد هذه المشكلة تعقيدًا بسبب بعض واجهات برمجة تطبيقات ويندوز التي تُهيئ COM كجزء من تنفيذها، مما يتسبب في تسريب تفاصيل التنفيذ. [ 30 ]
عد المراجع
قد يُسبب عدّ المراجع داخل COM مشاكل إذا تمت الإشارة إلى كائنين أو أكثر بشكل دائري . يجب أن يُراعي تصميم التطبيق هذا الأمر حتى لا تُصبح الكائنات يتيمة. قد تبقى أيضًا مراجع نشطة للكائنات إذا تم استخدام نموذج "مستقبل الأحداث" في COM. بما أن الكائن الذي يُطلق الحدث يحتاج إلى مرجع للكائن الذي يتفاعل معه، فلن يصل عدّ مراجع الأخير إلى الصفر أبدًا. عادةً ما يتم كسر حلقات المراجع باستخدام إما إنهاء خارج النطاق أو الهويات المنفصلة. في تقنية الإنهاء خارج النطاق، يُعرّض الكائن دالةً، عند استدعائها، تُجبره على إسقاط مراجعه إلى الكائنات الأخرى، وبالتالي كسر الحلقة. في تقنية الهويات المنفصلة، يُعرّض تطبيق واحد كائنين منفصلين من كائنات COM (يُعرفان أيضًا بالهويات). يُنشئ هذا مرجعًا ضعيفًا بين كائنات COM، مما يمنع حدوث حلقة مرجعية. [ 31 ]
جحيم ملفات DLL
نظرًا لأن مكونات COM المُدمجة تُنفذ في ملفات DLL، ولأن التسجيل لا يسمح إلا بإصدار واحد لكل CLSID، فقد تتعرض في بعض الحالات لمشكلة " DLL Hell ". تعمل ميزة COM غير المُسجلة على حل هذه المشكلة بالنسبة للمكونات المُدمجة؛ إلا أن هذه الميزة غير متاحة للخوادم غير المُدمجة.
انظر أيضاً
- اصطلاح الاستدعاء – آلية استدعاء الدوال في الحواسيب
- البنية التحتية للغة المشتركة – مواصفات مفتوحة لبيئات التشغيل
- دي-باص – برنامج وسيط موجه للرسائل في لينكس
- واجهة الوظائف الخارجية – واجهة لاستدعاء الوظائف من لغات برمجة أخرى
- محرك اتصالات الإنترنت – إطار عمل لإجراءات الاتصال عن بُعد
- استدعاء الأساليب عن بُعد في جافا – واجهة برمجة تطبيقات جافا
- أطر عمل KDE – مجموعة من المكتبات وأطر العمل البرمجية لإطار عمل Qt
- تشويه الأسماء – تقنية في بناء المترجمات
- كائن قابل للنقل (حوسبة) – كائن في البرمجة الموزعة
- SWIG – أداة برمجة مفتوحة المصدر
- نموذج كائنات النظام – إطار عمل برمجي - صفحات تعرض أوصافًا مختصرة لأهداف إعادة التوجيه
ملحوظات
- ↑ "أرشيف الوثائق" . developer.apple.com .
- ↑ "المكونات الإضافية و COM من مايكروسوفت" . شركة أبل. تم الاطلاع عليه في 5 أكتوبر 2010 .
- ↑ منتدى مايكروسوفت: التوافق الثنائي بين إصدارات Visual C++
- ↑ "حول بيئة سطح المكتب الموزعة للشبكة - تطبيقات ويندوز" . Microsoft.com . 30 مايو 2018.
- ↑ "تقنية تنفيذ التعليمات البرمجية تستفيد من تبادل البيانات الديناميكي" . McAfee.com . 27 أكتوبر 2017.
- ↑ ويليامز، توني (29 ديسمبر 1988). "هندسة الكائنات: التعامل مع المجهول - أو - سلامة النوع في مكتبة فئات قابلة للتوسيع ديناميكيًا" . أبحاث مايكروسوفت . مؤرشف من الأصل (ملف DOC) في 16 أغسطس 2000.
- ↑ ويليامز، توني (29 مارس 1990). "حول الميراث: معناه وكيفية استخدامه" . أبحاث مايكروسوفت . مؤرشف من الأصل (ملف DOC) في 16 أغسطس 2000.
- ↑ ويندوز المتقدم (دليل المطور لواجهة برمجة تطبيقات Win32 لنظام التشغيل ويندوز NT 3.5 وويندوز 95)
- ↑ براون، نينا؛ كيندل، تشارلي (11 مارس 1998). "draft-brown-dcom-v1-spec-03 - بروتوكول نموذج كائنات المكونات الموزعة -- DCOM/1.0" . Ietf Datatracker . تم الاطلاع عليه في 29 أغسطس 2019 .
- ↑ "نموذج اتصالات مايكروسوفت ويندوز سي إي" . techshelps.github.io . تم الاطلاع عليه بتاريخ 28 فبراير 2026 .
- ↑ rpetrusha (19 أبريل 2023). "غلاف قابل للاستدعاء في وقت التشغيل" . msdn.microsoft.com .
- ↑ rpetrusha (15 سبتمبر 2021). "COM Callable Wrapper" . msdn.microsoft.com .
- ↑ ستاينبرغ، جيل (1 مارس 1997). "المكونات المتنافسة تجعل أعضاء اللجنة صعبين" . جافا وورلد . تم الاسترجاع في 16 يوليو 2020 .
- ↑ "فهرس توثيق win32com" . docs.activestate.com .
- ↑ "Python and COM" . www.boddie.org.uk .
- ↑ "دعم COM للمترجم" . MSDN . مايكروسوفت. 3 أغسطس 2021.
- ↑ مايكروسوفت MSDN: مرجع سمات لغة C++
- ↑ مجلة MSDN: سمات لغة C++: اجعل برمجة COM سهلة للغاية مع ميزة جديدة في Visual Studio .NET
- ↑ "بيانات التجميع" . MSDN . تم الاطلاع عليه في 5 نوفمبر 2009 .
- 1 2 3 ديف تمبلين. "تبسيط نشر التطبيقات باستخدام ClickOnce وCOM بدون تسجيل" . مجلة MSDN . تم الاطلاع عليه في 22 أبريل 2008 .
- ↑ "كيفية استخدام خادم COM خارج العملية بدون ملف tlb الخاص به" . تم الاطلاع عليه بتاريخ 16 أبريل 2011 .
- ↑ "مفاهيم التطبيقات المعزولة والتجميعات المتجاورة" . MSDN . تم الاطلاع عليه في 5 فبراير 2016 .
- ↑ أرخيبوف، ميخائيل (1 أبريل 2005). "COM بدون تسجيل" . مدونات MSDN . تم الاطلاع عليه في 29 أبريل 2016 .
- ↑ "نقطة دخول DllGetClassObject (COM)" . MSDN .
إذا عثر استدعاء دالة CoGetClassObject على كائن الفئة المراد تحميله في مكتبة DLL، فإن CoGetClassObject تستخدم دالة DllGetClassObject المصدرة من مكتبة DLL.
- ↑ مايكروسوفت MSDN: العمليات، والخيوط، والوحدات
- ↑ مايكروسوفت MSDN: شقق أحادية الخيوط
- ↑ مايكروسوفت MSDN: الشقق متعددة الخيوط
- ↑ مايكروسوفت MSDN: فهم نماذج ترابط COM واستخدامها
- ↑ كودغورو: فهم شقق COM ( مؤرشف في 24 مايو 2021، على موقع Wayback Machine)
- ↑ بروم، كريس. "الشقق والضخ في منطقة CLR" . مدونة كريس بروم . تم الاطلاع عليه في 26 يونيو 2025 .
- ↑ وولف، مايك (31 مارس 2022). "العيب القاتل في عدّ المراجع: المراجع الدائرية" . لم يعد محددًا . تم الاسترجاع في 26 يونيو 2025 .
مراجع
- "COM: مقدمة موجزة (عرض تقديمي)" (رابط مباشر لملف PowerPoint (PPT)) . تم الاطلاع عليه في 7 مارس 2006 .
- بوكس، دون (1998). أساسيات الاتصالات . أديسون-ويسلي. رقم ISBN 978-0-201-63446-4.
- تشابل، ديفيد (1996). فهم ActiveX و OLE . مطبعة مايكروسوفت. ISBN 978-1-57231-216-6.
- "دمج خدمات COM+ ونقلها إلى WCF" . تم الاطلاع عليه بتاريخ 15 أبريل 2010 .
روابط خارجية
- نموذج كائن المكون على MSDN
- مقابلة مع توني ويليامز، المخترع المشارك لتقنية COM (بث فيديو عبر الإنترنت، أغسطس 2006)
- معلومات: الفرق بين عناصر تحكم OLE وعناصر تحكم ActiveX من مايكروسوفت
- مواصفات تنسيق بيانات TypeLib (غير رسمية) مع أداة تفريغ مفتوحة المصدر.
- قاموس المصطلحات COM / DCOM (archive.org)
- هندسة البرمجيات القائمة على المكونات
- التواصل بين العمليات
- واجهات برمجة تطبيقات مايكروسوفت
- نماذج الكائنات
- وسيط طلب الكائنات
- البرمجة الكائنية التوجه
