محمد علاء الدين

برمجة Windows Shell، الدرس الأول

14 ردود في هذا الموضوع

مقدمه

عندما تعلمت البرمجه حفظت بعض الكلمات و هى حدد الهدف، ابحث عن افضل الأدوات للوصول له، تعلم اساسيات الأداوت، اتقنها ان استطعت، ابدء فى محاولة تحقيق الهدف. و من هذا المنطلق كان لابد منى تعريفك بأساسيات ما انت على وشك البدء فى تعلمه. سترى فيما بعد ان ما تقرأه شبيه بقصه قصيره او معلومات نظريه اكثر منها تطبيقيه، لذا لا تمل و لا تنفر و لكن كن مثابرا على التعلم فهذا الدرس اهم من توابعه لما يحتويه من تعاريف و مفاهيم هى اساسيات البرمجه لويندوز بشكل عام و الـ Shell بشكل خاص.

فى هذا الدرس

  1. ما هو Shell.
  2. انواع البيانات داخل لغة C و انواع البيانات الخاصه بويندوز و HRESULT.
  3. الـ GUID و باقى مسمياته.
  4. تقنية COM.
  5. الـ Shell مره اخرى.
  6. الدوت نت و استيراد COM.
  7. مكتبة SmartVisionLib.
  8. التكامل مع افكار من منتدى C++.

لنبدأ على بركة الله.

1 – ما هو Shell

الـ Shell هى كلمه تستخدم داخل نظام التشغيل لتعبر عن الواجه الرسوميه له GUI. اى ان استجابة نظام التشغيل لكل تعاملاتك مع الـ GUI يتم تمريرها اولا إلى الـ Shell، و بالتالى فأنت عندما تتعامل مع GUI الخاصه بويندوز فأنت فعليا تتعامل مع Shell، لذا و حيث ان كل العمليات المتعلقه بالـ GUI يتم تمريرها إلى الـ Shell فنحن نستطيع برمجيا إستخدام الأداوت التى تقدمها لنا Shell للإستجابة لبعض العمليات التى يقوم بها المستخدم داخل الـ GUI الخاصه بويندوز و التى لن نستطيع بل مستحيل عملها من دون Shell.

2 – انواع البيانات داخل لغة C و انواع البيانات الخاصه بويندوز و HRESULT

فى اغلب الأحيان انواع البيانات التى تقدمها لك لغتك لا تفى بإحتياجاتك و حيث ان نظام التشغيل ويندوز قد صنع بلغة الـ C و كما نعلم لغة الـ C هى لغه Functional و ليست OOP و بالتالى لم يستطع مبرمجى ويندوز حينها من صنع انواع بيانات معقده لإستخدامهم و كل ما كان متاح امامهم هو انواع البيانات الإفتراضيه بلغة الـ C و ايضا امكانية عمل structs كنوع بيانات يتكون من مجموعه من المتغيرات، لذا و لحل هذه المشكله قام المبرمجون بعمل ما يسمى اعادة تعريف Aliasing لأنواع البيانات الموجوده فمثلا قد تجد النوع char و هو نفسه بالإسم sbyte.

الهدف من تلك العمليه هو الحصول على نفس النوع بإسم جديد مما يعطينا الفرصه لتغيير اسلوب التعامل معه فمثلا لدينا النوع unsigned int و هو نوع رقم صحيح موجب مكون من 4 بايت و ايضا ستجد ان له اسم بديل و هو HANDLE او HICON او HFILE أو HRESULT.

الإسم نفسه يقوم بتعريفنا مجموعه من المعلومات فعلى سبيل المثال النوع HRESULT كما ذكرنا هو نوع رقم صحيح موجب مكون من 4 بايت لذا يمكنك استخدامه كمتغير رقمى عادى و لكن نظام التشغيل يستخدمه بإسلوب مختلف كما يلى.

اولا يقوم نظام التشغيل بالتعامل مع HRESULT على مستوى البت و لا يتعامل معه على انه وحده واحده مكونه من 4 بايت و بالتالى يستطيع مستخدمه معرفة مجموعه من المعلومات عن عمليه معينه، و شكل الـ HRESULT كما يتعامل معه ويندوز كالتالى:

البت رقم 31 : يمثل نجاح او فشل عملية ما فعندما يكون بواحد دليل على الفشل و عندما يكون بصفر دليل على النجاح

البت رقم 30 : محجوز لإستخدام نظام التشغيل.

البت رقم 29 : إذا كان بصفر فهذا الخطأ هو رقم خاص بالمبرمج اما إذا كان صفر فهذا الرقم خاص بمايكروسوفت.

البت رقم 28 : محجوز لإستخدام نظام التشغيل.

البت رقم 27 : محجوز لإستخدام نظام التشغيل.

البت من رقم 26 إلى 16 : يمثل ماهية مرسل الخطأ هل هو نظام التعامل مع الملفات ام هو نظام الحمايه ... إلخ.

البت من رقم 15 إلى 0 : يمثل رقم الخطأ.

الأن كما ترى مع ان HRESULT هو متغير رقمى إلا انه يحتوى على كم ضخم من المعلومات عن عمليه واحده، فإذا افترضنا وجود داله مثل هذه:

unsigned int DoSomeThing();

و داله كتلك

HRESULT DoSomeThing();

اعتقد انك ستقول انه الداله الأولى تعود برقم عادى اما الثانيه تعود برقم من نوع HRESULT و بالطبع انت تعرف الفرق، فإن لم تكن تعرف سأقولها لك ببساطه ان الداله الأولى تعود لك برقم تستطيع التعامل معه لإنه رقم عادى اما الداله الثانيه فهى تعود لك برقم ايضا و لكن ذات اسلوب خاص فى التعامل.

شرح الـ HRESULT من Wikipedia على هذا الرابط

يحتوى نظام التشغيل على عدد لا بأس به من انواع البيانات و لابد منك ان تكون على درايه بهم لتعرف ماهيتهم و كيفية التعامل معهم حتى تستطيع فهم لماذا الداله CreateFile تعود بمتغير من نوع HANDLE و ليس Integer.

داخل الـ SDK الخاصه بويندوز ستجد شرح وافى لهذه الأنواع و ايضا يمكنك الدخول على هذا الرابط و الذى يحتوى على نفس المعلومات.

3 – الـ GUID و باقى مسمياته

سأحكى لك قصه قصيره و اعتقد انها ستقرب الفكره

عندما كنت فى ثانوى داخل الفصل الخاص بى كان يوجد طالب اخر يحمل نفس الإسم الثلاثى لى و عندما أتيت المرحله الأولى من الثانويه العامه قرر هذا الطالب التحويل لأدبى فى حين قررت انا التحويل لعلمى. (اعتقد انك خمنت ماذا حدث) قام الموظف المسئول بتحويلى انا لأدبى بدلا منه و هذا لأنه تعامل بالإسم و ليس الرقم الخاص بكل طالب داخل المدرسه.

الهدف من هذه القصه هو انه لابد من وجود وسيله معينه لتحديد الأشياء المتشابهه و هذه الوسيله بحد ذاتها لابد ان تكون فريده و لا تتكرر و إلا فما الهدف منها.

داخل نظام التشغيل قد يحدث تواجد برنامجين بنفس الإسم او ملفين DLL لهما نفس الإسم فكيف يضمن نظام التشغيل لك انه عندما تريد حذف تطبيق معين ان يتم حذفه هو بدلا من شبيه او كيف يضمن لك عند تسجيل مكتبه جديده الا يتم حذف شبيهتها و وضعها هى.

عند انشاء التطبيقات (و هذا يشمل اى تطبيق مهما كان امتداده يكفى انه تنفيذى اى يمكن تنفيذه بوسيلة ما) يتم وضع رقم فريد لا يتكرر ابدا مره اخرى لهذا التطبيق و الذى به يستطيع نظام التشغيل تحديده هو عن غيره حتى وان تشابه هذا التطبيق مع غيره فى كل شئ. هذا الرقم ذات حجم 128 بت و يحمل الإسم GUID و هو اختصاؤ لـ Globally Unique IDentifier.

هذا النوع ليس مثل باقى الأنواع التى شرحناها بالأعلى حيث انه مكون من مجموعه من المتغيرات و شكله كالتالى داخل الـ VB.Net:

	Public Structure GUID
Public Data1 As UInteger
Public Data2 As UShort
Public Data3 As UShort
Public Data4 As ULong
End Structure

حجم المتغير الأول 4 بايت و هو رقم صحيح موجب و الثانى و الثالث هما متغيران 2 بايت و هما رقمين صحيحين موجبين اما الأخير فهو متغير رقمى 8 بايت و هو رقم صحيح موجب. ستجد مختلف الأشكال لتعريف اخر عنصر على حسب اللغه و الإسلوب التى تتبعه و فى الأغلب يتم تمثيله بمصفوفه مكونه من 8 عناصر من نوع بايت موجب.

الـ GUID مثله مثل اغلب الأنواع داخل نظام التشغيل و هذا من حيث الإسم فيوجد له العديد من الأسماء و كلها تشير إليه منها IID و CLSID و UUID و MID و غيرهم و سيتم شرح معنى المسمى فى وقته إلا لو كان لديك فضول و تريد القراءه عنهم فيمكنك الدخول على هذا الرابط و الذى يحتوى على شرح الـ GUID من داخل Wikipedia.

4 - تقنية COM

فى الماضى عندما صنع نظام التشغيل ويندوز قامت مايكروسوفت بتقديم تقنيه جديده اسمتها DDE او Dynamic Data Exchange و التى كانت تتيح تخاطب البرامج فيما بينها اى ارسال بيانات و استقبالها بمعنى انه اصبح فى استطاعة برنامج ان ينتظر قيمه معينه من برنامج اخر حتى يتم عمله بناءا على هذه القيمه.

كانت الـ DDE ثوره فعليه وقتها و لكنها كانت محدودة الإمكانيات و ايضا كميه البيانات المرسله و المستقبله كانت محدوده بحجم معين و هذا ادى إلى تطويرها لتنتقل إلى الجيل التالى.

بسبب قصور و عيوب DDE اصبح من الضرورى وجود بديل اكفأ و افضل و من هنا جائت OLE او Object Linking and Embedded قامت OLE بما عجزت عنه اختها DDE حيث اتاحت الفرصه بين البرامج بأن يحتووا بعضهم البعض بمعنى بانك تستطيع استضافة نسخه من برنامج معين ليعمل داخل برنامج اخر كما اتاحت ما عجزت عنه DDE و هو امكانيه ارسال و استقبال كميه غير محدوده من البيانات بين التطبيقات.

و حتى و مع امكانيات OLE الهائله كان لزاما على مبرمجى ويندوز تطوير OLE لتتناسب مع الإحتياجات الجديده لهم و حيث ان OLE 1 كانت مبنيه فوق DDE لذا قام مبرمجى ويندوز بإعادة بناء OLE لتتناسب مع المتطلبات الجديده و من هنا جائت OLE 2.0.

عملية ادماج برنامج داخل اخر كما رأينا مع OLE 1 جعلت المبرمجين يحتاجوا لوسيله تخاطب بين البرنامج الحاوى و يسمى server و البرنامج المحتوى عليه و يسمى client.

عندما فكروا فى الوسيله وجدوا انها لابد من ان تكون ديناميكيه بشكل كافى حتى يستطيع أى برنامجين من التخاطب و من يحدد هذه الوسيله لابد من ان يكون البرنامج الخادم او الـ client. و لكن كيف ستكون هذه الوسيله و كيف سيتم اخبار البرنامج الخادم بها.

حينها قام المبرمجين بعمل ما يسمى بـ vtbl او virtual table و هو عبارة عن مصفوفه من الدوال تتيح لكل من البرنامج الخادم و البرنامج المتضمن ان يتخاطبوا سويا و ايضا تتيح لنظام التشغيل ان يتخاطب مع كلاهما. هذه هى فكرة ميلاد COM.

المشكله مع الـ vtbl هو انه لا مرجع له بمعنى ان هذا البرنامج يحتوى على مجموعه من الدوال و هذا اخر يحتوى على مجموعه اخرى كيف سيعلم نظام التشغيل بتلك الدوال و ايضا بأنها خاصه بذلك البرنامج.

من هنا جاءت فكرة ما يسمى بالـ Interface (لا تجعل المسمى يخدعك فشتان ما بين هذه و الأخرى فى الـ OOP). حيث الـ Interface هى مجرد حاويه لمجموعه من الدوال بترتيب معين لا يتغير، هذه الحاويه تأخذ رقم وحيد لا يتكرر (GUID) و يتم تسجيل بياناتها داخل مسجل نظام التشغيل، حيث يستطيع نظام التشغيل و البرامج ان يتعاملوا معها فى اى وقت.

كل شئ فى هذه الحياه قابل للتغير حتى البرامج التى نصنعها و لكن من وجهة نظر الـ Interfaces الخاصه بـ COM و التى يتم تسجيل بياناتها بنظام التشغيل انه قد تنتهى الحياه و لكن الـ Interface تظل كما هى بمجرد خروجها من عند المبرمج اصبح محرم عليه ان يفكر حتى ان يلمسها (مش انه يفكر يعدلها). و لكن المبرج يريد تطوير برنامجه و هذه الـ Interface جزء لا يتجزاء منه فماذا يفعل؟؟ فى هذه الحاله لابد من ان يصنع واحده جديده فإن كان يحتاج الدوال القديمه فلابد ان يضع الدوال القديمه اولا داخل الـ Interface الجديده يليها الدوال الجديده. هذا الإسلوب يسمى بوراثة الواجهات (مره اخرى لا تجعل المسمى يخدعك فوراثة واجهات COM مختلفه اختلاف جذرى عن وراثة الواجهات داخل الـ OOP).

ايضا ظهرت مشكله اخرى و مضمونها ان هذه الـ Interface كودها التنفيذى موجود ببرنامج معين حيث يتم تحميله بالذاكره، متى سيعلم نظام التشغيل انه تم الإنتهاء منها و لابد من تحرير الذاكره الخاصه بها، ايضا بإفتراض اننا نتعامل مع Interface و التى هى تطوير لواحده اخرى كيف نستطيع الحصول على احداهما من الأخرى و من هنا قامت مايكروسوفت بحل المشكله بعمل ما يسمى بـ IUnknown.

هذه الواجهه تعتبر هى قلب COM و شكلها كالتالى (طبعا ده كود مجازى جدا).

	Public Interface IUnknown
Function AddRef() As ULong
Function Release() As ULong
Function QueryInterface(ByRef riid As REFIID, ByRef obj As Object) As HRESULT
End Interface

قامت مايكروسوفت بعمل هذه الواجهه و امرت كل المبرمجين الذين سيقوموا بعمل واجهات خاصه بهم ان يقوموا بوراثة هذه الواجهه اولا (معنى كلمة وراثه اى وضع محتويات دوال الـ IUnknown قبل دوال المبرمج).

عندما تقوم بتحميل نسخه من الواجهه داخل مساحة عمل برنامجك فإنه يتم تحميلها بالذاكره مره واحده فقط مهما كانت عدد النسخ التى قمت بإنشائها منها، و ليعرف نظام التشغيل متى انتهيت من عملك معها لابد منك ان تقوم ببعض العمل.

هذا العمل يتمثل فى استدعائك للداله AddRef الموجوده داخل الواجهه التى قمت بإنشائها هذه الداله كل ما تفعله هى انها تقوم بزيادة عداد داخلى بواحد و تعنى ان المبرمج قد قام بإنشاء نسخه جديده، و تقوم بالرجوع بعدد النسخ المنشأه من هذه الفئه.

عندما تنتهى من النسخه التى قمت بإنشائها من الواجهه فقط قم بإستدعاء الداله Release و التى تقوم بإنقاص العداد الداخلى بواحد ثم تقوم بالعوده بعدد النسخ الحاليه.

عندما يصل عدد النسخ الخاصه بالواجهه 0 يقوم نظام التشغيل بتحرير الذاكره المحجوزه لهذه الواجهه.

نقطه هامه اخرى و هى انه اذا قمت بإنشاء نسخه من واجهه داخل داله، لا تتوقع انقاص العداد الداخلى للواجهه بواحد بمجرد الخروج من الداله، لابد من استدعاء Release و إلا لن يتم تحرير الذاكره الخاصه بهذه الواجهه ابدا إلا عند انتهاء غلق البرنامج.

نأتى الأن للداله QueryInterface و التى هى مختلفه قليلا فى عملها عن الاخرين حيث تقوم هذه الداله بإحضار لك نسخه من واجهه اخرى اذا كانت مدعومه من قبل هذه الواجهه طبعا تطلب منك معاملين اولهما الـ REFIID و الذى هو احد اسماء GUID بالإضافه إلى انه يجب تمريره بالمرجع و يعبر عن الـ GUID للواجهه التى تريد الحصول عليها اما المعامل الأخر فهو Byref و يعود لك بنسخة الواجهه الجديده او يترك الكائن الذى تم تمريره كما هو لا شئ و عندما تنتهى الداله من عملها تعود لك بـ HRESULT و الذى يحتوى على مجموعه من المعلومات التى تحدد لك ما اذا تمت عملية احضار الواجهه بنجاح ام بفشل.

نعود الأن لنتكلم عن OLE 2.

عندما الحت الحاجه لتطوير OLE 1 استدعى الأمر اعادة برمجتها من جديد و هو ما ادى إلى ميلاد COM ثم OLE 2 و التى بنيت على COM على عكس اختها التى كانت مبنيه على DDE الإصدار الجديد من OLE له عدة اسماء مثل OLE 2 او OLE+ او OLE Automation او Automation.

مع ظهور OLE 2 ظهرت واجهه اخرى فى اهميتها مثل اهمية الواجهه IUnknown و هى IDispatch.

عندما سئل المبرمجين عن سبب ابتكارهم لهذه الواجهه كانت اجابتهم ان الواجهات التى نصنعها كلها تحتوى على مجموعه من الدوال و لإستدعاء احداهما يقوم نظام التشغيل بتحديد مكان الداله داخل الـ vtable مباشرة و من ثم يقوم بتنفيذها هذا الإسلوب يسمى بالربط المبكر او Early Binding حيث لابد منك كمبرمج كتابة اسم الداله داخل الكود ليدل ذلك على استدعائها و هذا الأمر لا يوجد فيه اى نوع من انواع الديناميكيه فماذا يحدث ان اردت استدعاء داله معينه بعد تحويل البرنامج لنسخه تفيذيه او ماذا يحدث اذا اردت معرفة عدد الدوال الموجوده بكائن معين (واجهه معينه). بمعنى ادق ماذا يحدث اذا اردت التعامل مع الكائن بدون معرفة اى بيانات عنه وقت تصميم البرنامج و مع ذلك استطيع التعامل معه و استدعاء الدوال الخاصه به. هذه المشكله تسمى بالربط المتأخر او Late Binding و هى التى اوجدت IDispatch.

الـ IDispatch هى واجهه ترث الواجهه IUnknownو ايضا تتيح لك كمبرمج 4 دوال اخرى و شكلها كالتالى:

	Public Interface IDispatch
Inherits IUnknown

Function GetTypeInfoCount(ByRef pctinfo As UInteger) As ULong
Function GetTypeInfo(ByVal iTInfo As Integer, ByVal mlcid As LCID, ByRef ppTInfo As ITypeInfo) As HRESULT
Function GetIDsOfNames(ByRef riid As REFID, ByRef rgszNames As String, ByVal cNames As UInteger, ByVal mlcid As LCID, ByRef rgDispId As Long) As ULong
Function Invoke(ByVal dispIdMember As Long, ByVal mlcid As LCID, ByVal wFlags As UShort, ByRef pDispParams As DISPPARAMS, ByRef pVarResult As Object, ByRef pExcepInfo As EXCEPINFO, ByRef puArgErr As UInteger) As ULong
End Interface

لن اتكلم عن هذه الواجهه كثيرا و كل ما سأخبرك به هو انها تتيح لك استدعاء دوال واجهه لا تعرفها و لا تعرف اسماء الدوال التى بها.

بعد ظهور الواجهه IDispatch اصبح يوجد لدينا 3 انواع من الواجهات داخل برامجنا و هما واجهات تعتمد على IUnknown و واجهات تعتمد على IDispatch و اخرى تعتمد على كلاهما و لكل منهم اسم فالأولى تنسب للواجهه IUnknown و تدعم فقط الربط المبكر و الثانيه تنسب للواجهه IDispatch و تدعم فقط الربط المتأخر اما الثالثه فتأخذ اسم Dual Interface و تدعم كل من الربط المبكر و المتأخر.

اتى الإصدار الجديد من OLE بالعديد من الإمكانيات الجديده و المذهله مثل السحب و الإلقاء للملفات و تقنية الـ ActiveX و العديد من الإمكانيات الأخرى. و لكن على صعيد اخر كانت COM محدوده بالحهاز الحالى بمعنى انك لا تستطيع انشاء نسخه من واجهه موجوده على جهاز اخر و من هنا تم تطوير COM إلى واحده اخرى و هى DCOM او Distributed COM.

مع ظهور DCOM أصبح امكانية التعامل مع الواجهات على مستوى اجهزه اخرى ممكن و لكن هذا ادى إلى ظهور تقنيه اخرى تعمل مع DCOM جنبا إلى جنب و هى MTS او Microsoft Transaction Services و التى تتيح لك استخدام موارد جهاز اخر و التعامل معها ثم تحريرها.

و لكن حتى مع ظهرو DCOM و وجود كل تلك التقنيات فكانت امكانيات نظام التشغيل كلها موجهه ناحية برامج GUI و كان دعم برامج الإنترنت متمثل فى شكل لغة الـ ASP و كانت امكانياتها محدوده و من هنا جائت الدوت نت لتحل تلك المشكله و بعض المشاكل الأخرى.

خبرة نظام التشغيل ويندوز مع تطبيقات سطح المكتبه قويه بشكل كبير و مع ظهور تقنية الدوت نت اصبحت هناك تطبيقات الويب و لديك كل ما تحتاج لتبدع (لا تحتوى الدوت نت على كل شئ و لكن مع امكانية استيراد واجهات COM اصبح الأمر ممكنا).

طبعا فيما بعد ستظهر احتياجات اخرى يصعب على الدوت نت تخطيها و الذى سيؤدى لظهور تقنيات جديده و هكذا دواليك.

5 – الـ Shell مره اخرى

تعرفنا فى اول الدرس على مفهوم الـ Shell بشكل نظرى بحت و حانت الأن الفرصه للتعرف عليها بشكا اكثر واقعيه من جانبنا كمبرمجين.

كما ذكرنا بالاعلى الـ Interface هى عبارة عن حاويه لمجموعه من دوال تم تعريفها داخل تطبيق معين.

الـ Shell هو مجموعه من الواجهات و الدوال التى تخدم تلك الواجهات. الكود التنفيذى لتلك الواجهات و الدوال يوجد داخل المكتبه Shell32.dll و المكتبه shfolder.dll و المكتبه shlwapi.dll و بعض المكتبات الأخرى.

عند عمل تطبيق يستخدم تلك الواجهات للتعامل مع GUI الخاصه بويندوز لابد منك ان تسجله داخل Registry. ستجد ان اغلب الواجهات تم تسجيلها تحت المسار HKEY_CLASSES_ROOT\Interface.

الكود الإفتراضى لواجهات Shell او COM او اى واجهات اخرى يتم كتابته داخل فئات هذه الفئات يتم تسجيلها ايضا داخل مسجل النظام Registry و تستطيع ايجادها تحت المسار HKEY_CLASSES_ROOT\CLSID.

عندما نقوم بعمل فئه تستخدم الـ Shell لابد من تسجيل داخل المسار التالى HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved

و يكون عنوان الـ KeyValue هو GUID الخاص بالفئه و قيمته هى اسم يعبر عن هذا الـ GUID او اى وصف تختاره.

6 – الدوت نت و استيراد COM

تحتوى الدوت نت على كم هائل من الفئات بعضها Native و الأخر مبنى على الـ IL، و لكن من الجميل ان نستطيع عمل واجهات COM من لغات اخرى و استيرادها هنا لتسريع تنفيذ البرنامج او حتى لأن تلك الواجهات صنعت من قبل ظهور الدوت نت.

تحتوى الدوت نت على مجال اسماء هو System.Runtime.InteropServices و System.Runtime.InteropServices.ComTypes و اللذان يحتويان على مجموعه من الفئات و المواصفات الذين يجعلوا استيراد واجهات COM ممكن. بالطبع لن اقوم بذكرهم هنا فالدروس القادمه ستفى بالغرض و لكن توجد بعض المواصفات و بعض الفئات التى واجب شرحها هنا لتكرارها فى كل الدروس القادمه و هم:

CoClassAttribute : هذه المواصفه تقوم بتصدير الفئه كـ COM Class اى يتم وضع GUID لها و وضعه داخل مسجل النظام.

COMException : هذه الفئه هى الإستثناء الذى يظهر فى حالة فشل داله من الدوال التى تعود بـ HRESULT.

ComImportAttribute: يتم استخدام هذه المواصفه مع الفئات و الواجهات التى تريد ان تعلم الدوت نت انه سيتم استيرادها من COM.

ComVisibleAttribute: يتم تحديدها على الفئات او الواجهات التى تريد او لا تريد تصديرها لـ COM.

FieldOffsetAttribute: عندما تقوم بعمل فئه او تركيب معين و تريد تحديد ترتيب متغير معين استخدم هذه المواصفه معه و مرر لها الـ Index الذى تريده لهذا المتغير.

GuidAttribute: استخدم هذه المواصفه مع عناصر برنامجك لتحديد GUID لذلك العنصر.

InterfaceTypeAttribute : تستخدم هذه المواصفه مع الواجهات الخاصه بنا لتحديد نوعها اذا كانت IUnknown او IDispatch او Dual.

Marshal : هذه الفئه تحتوى على مجموعه كبيره من الدوال التى تساعد فى التعامل مع COM و ايضا فى تحويل انواع بيانات COM إلى الدوت نت و العكس.

MarshalAsAttribute: هذه المواصفه تستخدم مع المتغيرات و ايضا المعاملات و القيم المعاده للدوال (فى تعريف الداله) لجعل النوع الخاص بذلك العنصر يحاكى النوع الذى تختاره من المواصفه.

OptionalAttribute: تحدد هذه المواصفه معامل ما على انه اختيارى.

OutAttribute: تحدد هذه المواصفه المعامل على انه يمرر قيمه لخارج الداله فقط.

PreserveSigAttribute: هذه المواصفه يتم تطبيقها على الدوال و الهدف منها هو تثبيت معاملات الدوال و منع الإضافه عليهم او الحذف منهم.

RegistrationServices : تحتوى هذه الفئه على مجموعه من الدوال الخاص بتسجيل الفئات التى نصنعها بمسجل النظام و كذلك حذفها منه.

StructLayoutAttribute: هذه الواصفه يتم تطبيقها على الفئات و التراكيب لتحديد كيفية حجز الذاكره للمتغيرات الموجوده بداخلهم.

7 – مكتبة SmartVisionLib

اغلب الأوقات اقوم بإستخدام واجهات COM و Shell من داخل برامجى لذا منذ فتره ليست بالبعيده شرعت فى تجميع كل الواجهات التى كنت قد استخدمتها داخل مكتبه أعطيتها الإسم SmartVisionLib و هذا الإسم (بدون Lib) هو اسم الشركة التى اطمح فى ان امتلكها ان شاء الله، و استخدم اسمها فى برامجى كدافع لى.

و لكن حتى هذا الوقت لم انتهى منها و بمجرد انتهائى منها سأضعها لكم هنا لنستخدمها بدلا من تعريف الواجهات بأيدينا و حتى هذا الوقت سنقوم بتعريف الواجهات التى سنستخدمها كل درس.

8 – التكامل مع افكار من منتدى C++

منذ فتره قام الأخ وجدى عصام بطرح فكرة مشروع لتقسيم الملفات داخل منتدى الـ C++ و قمت بالعمل على هذا البرنامج لفتره و انا فى الفتره الحاليه اقوم بتجهيز اكواد الـ GUI الخاصه به.

قد تتسأل عن سبب تعريفى لك بهذا الموضوع و الإجابه هى اننى كنت قد قرأت كتاب Visual Basic Shell Programming و فيه قام الكاتب بصنع نوع ملفات جديد تماما و صنع له نظام معين و بعدها قام ببناء نظام Shell كامل (او شبه كامل) له، صراحة الفكره عجبتنى و قلت لنفسى انه بدلا من ان اقوم بصنع نوع ملفات جديد لهذه الدروس سأقوم بإستخدام نوع الملفات الموجود بهذا المشروع حيث انه يحتوى على كل ما نريد.

و الله ولى التوفيق

تم تعديل بواسطه Muhammad alaa
4

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

لقد شرحت كل شئ اريده و نسيت ان اضع معنى كلمة COM و هو Component Object Model و هى تستند إلى مجموعه من التقنيات مثل +OLE و DCOM و MTS.

كل التقنيات المذكوره بالسابق تندرج تحت بند COM لإنها مبنيه عليها.

و الله ولى التوفيق

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

ماشاء الله يامحمد ,, فعلا درس قيم جدا وأتمنى أن تكمله للنهاية ولا تمل

معك حتى الـContextMenu Handlers و Copy & Move Handlers :wink:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

بإذن الله لا كلل و لا ملل حتى اجعل كل عضو يقرأ هذا الدرس يصنع CommonDilaog مثل File وSaveAs و يقوم بعمل Template لهما هذا هو الدرس الاخير

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

لى سؤال يامحمد

هل ستكتب جزء بالسى وجزء بالفيبى حيث أنك ذكرت السى فى كلامك أم ستكتب كل الأكواد باستخدام الفيبى؟

ومتى الدرس الثانى فنحن فى الانتظار؟؟ :wink:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

فى الواقع انا كنت اريد استخدام النسخه التنفيذيه من المشروع الخاص بتقسيم الملفات و لكنى وجدت انه سيأخذ منى وقت اطول مما كنت اريد.

لذا فقد فكرت فى استخدام امتدادات موجوده مع تفهيم القارئ ماهيتها و كيفية التعامل معها.

اما بالنسبه للكود فكل شئ سيكون VB بشكل صرف.

الدرس الثانى اقوم بتجهيزه فى الوقت الحالى و هو عن ContextMenuHandler و بإذن الله من الممكن ان ينتهى على غدا.

و الله ولى التوفيق

تم تعديل بواسطه Muhammad alaa
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكــم ورحمـة الله وبركاتــه ،،

جزاك الله خيرا على مجهوداتك وزادك علما ونفعنا به أخى محمد

عندى اقتراح بسيط وهو أن يتم تقسيم الدرس الجديد على مرحلتين حيث أنه على حسب علمى بهذا الموضوع درس طويل نسبيا فمثلا فى المرحلة الأولى تشرح الواجهات المستخدمة والوظائف التى تحتويها و فى المرحلة الثانية تشرح قيم مسجل النظام المطلوبة للتسجيل ثم تضع المثال العملى

هذا اقتراح وأنت صاحب الدرس فافعل ما تراه صالحا وفى انتظار دروسك الجميلة :blush:

أعذرنى على كثرة تدخلى لكن عندى سؤال آخر وهو :

ماهى أنواع الـHandlers التى ستقوم بشرحها ?

أتمنى أن تشرح جميع الأنواع (استغلال :D :D )

تم تثبيت الموضوع لأهميته ,,

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

كلامك جميل يا اخ ghost (ممكن اعرف اسمك محمد ايه ؟؟)

بالنسبه للدرس الجديد فهو فعلا مقسوم لدرسين الأول بشرح فيه واجهات COM إللى هنتعرض لها اثناء عملنا حيث سيكون لا داعى من شرحها فى كل مره لذا جعلت لها موضوع مستقل.

الدرس الثانى خاص بالـ ContextMenuHandler و به 4 واجهات اساسيين يتم شرحهم اولا ثم المثال التطبيقى.

بالإضافه إلى ذلك سأقوم بشرح عملية تسجيل الفئات التى نصنعها بمسجل النظام مره واحده فقط فى هذا الدرس و لن نتطرق لها مره اخرى و ذلك لإنى ايضا اقوم بتجهيز بعض الأدوات التى سنستخدمها بكثره فى عملنا و منها تسجيل و إلغاء تسجيل Shell Extensions و انشاء امتدادات جديده و بعض الاداوت الاخرى التى ستسهل لنا عملنا و تجعلنا نركز فى مضمون الدرس بدلا من الدخول فى امور جانيه تجعل القارئ يتشتت.

اعذرنى على كثرة تدخلى لكن عندى سؤال آخر وهو :

ماهى أنواع الـHandlers التى ستقوم بشرحها ?

أتمنى أن تشرح جميع الأنواع

تدخل كما يحلو لك :) و اسأل ما شئت

بالنسبه لأنواع الـ Handler فهى كثيره جدا إن قدرنى الله سأشرحهم كلهم و إن لم يكن فبإذن الله ستكون لديك القدره بعد بضعة دروس على التعامل مع اى من واجهات Shell و ذلك لأنك فهمت طبيعة عملها و الكيفية التى تعمل.

درس الـ COM (اسميه الدرس 1.5) على وشك الإنتهاء اما الدرس الثانى و الخاص بالـ ContextMenu فجارى العمل عليه.

و الله ولى التوفيق

تم تعديل بواسطه Muhammad alaa
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكــم ورحمـة الله وبركاتــه ،،

جزاك الله خيرا أخى محمد

ممكن اعرف اسمك محمد ايه ؟؟

إسمى محمد أحمد محمد المهدى :blush:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

و عليكم السلام و رحمة الله وبركاته

لى الشرف بالتعرف عليك اخى محمد احمد محمد المهدى

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

موضوع جميل يستحق المتابعة فعلا , جزاك الله كل خير , وفى انتظار باقى الدروس...

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

بإذن الله انواع الـ Shell التى سيتم شرحها هى

ContextMenu Handler
Icon Handler
Property sheet Handler
Data Handler
Drag-Drop Handler
Copy Handler
InfoTip Handler
Namespace Handler
Protocol Handler
Explorer Column Handler
Band Objects

و بعض الدروس المتنوعه

و الله ولى التوفيق

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
بإذن الله انواع الـ Shell التى سيتم شرحها هى

ContextMenu Handler
Icon Handler
Property sheet Handler
Data Handler
Drag-Drop Handler
Copy Handler
InfoTip Handler
Namespace Handler
Protocol Handler
Explorer Column Handler
Band Objects

و بعض الدروس المتنوعه

و الله ولى التوفيق

الله يعطيك العافية ويزيدك من علمه :)

بانتظار جديدك ;)

بالتوفيق :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شكرااااااااااااا الله يعطيك العافيه وسلامه

شكرااااااااااااا الله يعطيك العافيه وسلامه

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .