سؤال

أعرف أن (VC ++) OCX هو عنصر تحكم ActiveX ، و (VC ++) DLL هو مجموعة من الوظائف. لقد وجدت أن الاتصال من تطبيق VB.NET ، يمكن أن يتصرف التقاط بعض الاستثناءات بشكل مختلف إذا تم إلقاء الاستثناء من داخل OCX أو داخل وظيفة تأتي في DLL.

لذا فإن سؤالي هو: من وجهة نظر تطبيق vb.net ، ما هي الاختلافات الرئيسية بين استخدام ملفات .ocx واستخدام ملفات .dll؟

هل كانت مفيدة؟

المحلول

DLL هي مكتبة مشتركة. إنه كائن مستوى نظام التشغيل - يمكن لأي عملية تحميل DLL ووظائف الاتصال المحددة فيه.

عنصر التحكم ActiveX هو كائن COM يقوم بتنفيذ واجهات محددة تتيح للمضيفين استدعاء أساليبها وتضمينها في واجهة المستخدم الخاصة بهم. هناك بعض المتطلبات الدنيا التي يجب أن يتم فيها تنفيذ التحكم في ActiveX لتضمينه في واجهة المستخدم للتطبيق. نظرًا لأن كائنات COM عادة ما يتم تحميلها ديناميكيًا بواسطة عملية ، يتم تنفيذها كـ DLL. قد يقوم DLL واحد بتنفيذ فئة COM واحدة أو أكثر.

فيما يتعلق بالاستثناءات - لست متأكدًا من الاختلافات التي لاحظتها ، لكن الوظيفة لا تختلف عن وظيفة تم تنفيذها في ملف .exe الرئيسي في العملية. يجب أن ينتشر استثناء تم إلقاؤه بشكل طبيعي وفقًا للقواعد المحددة من قبل بيئة وقت تشغيل لغة البرمجة الخاصة بك.

طريقة ActiveX مختلفة. عادة ، يطلق عليه من خلال شيء يسمى واجهة idispatch. بدلاً من أن تكون مكالمة فرعية بسيطة ، يتم استدعاؤها عن طريق استدعاء طريقة في واجهة Idispatch (Idispatch :: Invoke) ، مع حججها التي تم تنظيمها بطريقة محددة (بشكل أساسي ، يتم تحويلها إلى أنواع قياسية وتعبئتها بطريقة تخفيها الاختلافات في استدعاء الاتفاقيات وأنواع البيانات بين لغة التنفيذ للعملية الرئيسية والتحكم في ActiveX.) Idispatch :: استدعاء واجهة ثم يحدد الطريقة في ActiveX التي يحاول المتصل الوصول إليها وتوجيهها مباشرة.

لا يتم نشر الاستثناءات بشكل عام من خلال واجهة Idispatch. كيف تتعامل بيئة وقت التشغيل مع رموز الخطأ التي يتم إرجاعها بواسطة Idispatch :: Invokeis حتى المنفذ لتقرير ، حقًا. لذلك يمكنك أن تتوقع بشكل معقول عدم استيفاء توقعاتك عند التعامل مع أخطاء وقت التشغيل والاستثناءات التي تم إلقاؤها في عنصر تحكم ActiveX.

نصائح أخرى

يحتوي AN .OCX على COCLasses التي تتبع عقد التشغيل الآلي OLE. يحتوي هذا العقد على طريقة محددة جيدًا لإعادة الأخطاء إلى عميل. كل طريقة تُرجع hresult ، رمز يشير إلى ما إذا كانت الطريقة قد نجحت أم لا. إنه عدد صحيح بسيط ، يتم تعريف رموز الخطأ في ملف رأس Winerror.h SDK. كما يدعم الحصول على معلومات السياق حول الخطأ من خلال واجهة IerrorInfo. يضمن دعم com interop في CLR ترجمة رمز الفشل إلى استثناء مماثل.

لا يوجد مثل هذا المعيار للرمز في C/C ++ DLLS. إذا كان يلقي استثناءً على الإطلاق ، فهو دائمًا ما يكون شيئًا سيئًا مثل AccessViolation. P/Invoke Marshaller يتأكد من أن هذه الاستثناءات يتم اكتشافها وترجمتها. ستحصل دائمًا على القليل من المعلومات المفيدة من هذا الاستثناء الذي يتجاوز "لم ينجح". يجب أن تدع هذه الاستثناءات تنهي البرنامج الخاص بك ، لا يمكنك التعافي منها.

ليس هناك فرق. كلاهما dlls. يمكنك إعادة تسمية DLL إلى أي شيء والاستمرار في تحميلها واستخدامها باستخدام LoadLibrary و GetProcaddress.

في عالم .NET ، فإن DLL ليس مجموعة من الوظائف. إنها مجموعة ، وهي مجموعة من الأنواع - الفصول والوحدات النمطية. من المحتمل أن تحتوي هذه الأنواع أيضًا على وظائف ، ولكن هذا مستوى مختلف من التجريد.

ولكن نظرًا لأنك تتحدث عن هذا بالتزامن مع ملفات OCX ، فسأمنح أنه ربما تشير إلى DLL الذي أنشأته VB6 ، نظرًا لأن .NET لا علاقة له بملفات OCX أو عناصر التحكم ActiveX مباشرة. في هذه الحالة ، كلاهما مجرد كائنات com التي يمكنك تحميلها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top