تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
عمل امتداد ملفات خاص بك
#1
السلام عليكم ورحمة الله وبركاته


من المنتدى القديم
اعداد : الأخ رغيد الطيب .
عنوان الموضوع : عمل امتداد ملفات خاص بك .




نحتاج في كثير من الاحيان الى جعل برامجنا تتعامل مع نوع معين من الملفات كما هو الحال مع معظم البرامج المتخصصة فمثلاً الورد يفتح ملفات النوع Doc و الرسام ملفات bmp وهكذا ....
وما نسعى اليه هنا هو كيفية انشاء نوع خاص ببرامجنا وسوف نناقش معاً آلية العمل الذي يقوم به نظام التشغيل لفتح ملف بواسطة برنامج معين ثم سوف اقدم بعد ذلك اجراء بسيط يقوم باضافة نوع جديد من الملفات الى نظام بحيث لايتجاوز الامر سطراً واحداً في برنامجك !! ....

اولاً كوننا مبرمجون يجعلنا لا نكتفي بمعرفة الكود اللازم لتسجيل نوع جديد (وهو موجود بكثرة في منتدانا) ولكن يتوجب علينا فهم طبيعة ما يحدث عندما يقوم المستخدم بالنقر المزدوج على احد الملفات الى ان يتم فتح الملف بواسطة البرنامج المحدد والطريقة في الواقع بسيطة حيث انك اذا نقرت على احد ملفات الورد (ذات الامتداد doc) فانه اولاً يقوم نظام التشغيل بالبحث في الريجيستري عن لاحقة الملف الذي ثم النقر عليه ويكون البحث منصباً على المفتاح الاساسي HKEY_CLSSSES_ROOT وذلك بالبحث عن مفتاح يكون اسمه "doc." ...... واذا لم يجد هذا المفتاح فانه مباشرة يعرض مربع الحوار (فتح بواسطة) .... اما اذا وجد المفتاح فانه ينظر في القيمة التي داخله واذا كان برنامج الورد الذي تستخدمه هو من النوع xp كما في حالتي انا فسوف يجد ان قميته هي "Word.Document.8" والتي تعني ان بيانات الملف الذي يفتح هذا النوع من الملفات doc موجودة في المفتاح Word.Document.8 فيقوم نظام التشغيل بالبحث عن هذا المفتاح كي يتعرف على البرنامج الذي يجب ان يشغله لفتح هذا النوع من الملفات وعندما يجده يبدء بقرائة البيانات من داخله واليك بعض التفصيل فيما يجب ان يحتويه هذا المفتاح ....

ان افضل طريقة لفهم ما يتم شرحه هنا ان تقوم بفتح الريجيستري وتتبع الخطوات التي اوضحها هنا فمثلاً ابحث عن المفتاح .doc وسوف تجد بمجرد ان تختارة انه يعرض لك في القئمة اليمنى من الريجيستري اسم المفتاح الذي يجب ان تبحث فيه وهو في مثالنا Word.Document.8 ثم قم بالنقر على هذا المفتاح ماذا ستجد ؟ ... سوف تجد مباشرة في يمين الشاشة في القيمة المسماه (Defalut) او القيمة الافتراضية عبارة كهذة "مستند Microsoft Word" وهذة العبارة هي التي تظهر عندما تقوم بالنقر على اي ملف ثم اختيار خصائص فانه سوف يتم عرض نوع الملف وبجواره هذا التعليق والذي يفيد بان نوع هذا الملف هو ملف ورد وكذلك الحال بالنسبة لاي نوع آخر من الملفات كملفات الرسام تجد ان نوعها يوجد به تعليق مثل "صورة نقطية" وبهذا نكون قد عرفنا اين يمكن وضع تعليق على نوع ملفاتك الجديد ويمكنك جعلها مثلاً "برنامج فلان للتحرير النصوص" ....

طبعاً هذا فقط عبارة نوع الملف ولكن يوجد الكثير داخل المفتاح Word.Document.8 قم الان بالنقر على علامة الجمع الموجودة بجواره لتمديده ورؤية المفاتيح التي بداخله سوف تجد مفاتيح عدة والتي تهمنا منها اتنان هما المفتاح Default Icon و المفتاح Shell ...

المفتاح Default Icon :
يحتوي على مسار الملف الذي يملك ايقونة برنامجك بحيث تصبح مفاتك لها ايقونة خاصة وهذا مهم جداً فمثلاً ترى ان ملفات الصوت لها يونة خاصة بينما ملفات قواعد بيانات الاكسس لها ايقونة مميزة لها وبذى يسهل تمييز الملفات من ايقوناتها مباشرة ... وملف الايقونة يمكن ان يكون احد ثلاثة انواع اما ملف Ico عادي وتجد الكثير منها مع برنامج الفيجوال في المجلد Graphics ثم Icons .... ويمكن ان تكون ملف DLL حيث ان هذة الملفات يمكن ان تحتوي على اكثر من ايقونة واحدة ويتم تحديد الايقونة التي نريدها عن طريق الرقم مثلاً :



PHP كود :
C:\Windows\System32\Shell32.dll,

ويعني السطر السابق ان ايونةالبرنامج موجودة في الملف Shell32.dll في الموقع الرابع لان الترقيم يبدء من الصفر ...

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

هذا كان لتحديد ايقونة لمفاتك اما الان سوف نستعرض محتويات المفتاح Shell وهي الاهم ..
نلاحظ جميعاً اننا اذا نقرنا على اي ملف بالزر الايمن فان تظهر قائمة تحتوي على اوامر ثابثة في كل الملفات وهي في الجزء الاسفل كالامر حذف و اعادة تسمية وخصائص و ... و .... و .... بينما القسم الاعلى نجد فيه اوامر تختلف من ملف الى آخر مثلاً نجد في ملفات الرسام الامر فتح و عرض وطباعة بينما نجد في ملفات الصوت wav امر جديد مثل تسجيل و تشغيل وهناك اشياء ثابتة ايضاً .... وكل ذلك موجود في القسم shell حيث انك اذا فتحته تجد مفاتيح اخرى مثل :
open وقميتة "فتح"
Print وقيمته "طباعة"
وغيرها اي ان الاسم Open هو اسمة في الريجيستري اما الاسم فتح فهو الذي سوف يظهر في القائمة اليمنى يعني كتجربة بسيطة غير الكلمة فتح الى العبارة "سبحان الذي هدانا لهذا" ثم اذهب الى اي ملف ورد في جهازك وانقر بالزر الايمن وسوف ترى ان الامر فتح اختفى واصبح مكانه العبارة التي كتبناها واذا نقرت عليها يتم فتح الورد كما كان الامر سابقاً اي ان الذي غيرناه هو الاسم فقط وانما العمل ظل كما كان سابقاً ... (قم الان باعادة الوضع كما كان سابقاً واعيد الكلمة فتح) ...

لاحظ الان ان داخل كل مفتاح من المفاتيح المحتواه داخل Shell يوجد بها مفتاح باسم Command اي انه داخل المفتاح Open يوجد مفتاح command وكذلك الحال داخل المفتاح Print يوجد ايضا command ووظيفة هذا المفتاح ان يحتوي على القيمة التي تدل على البرنامج الذي نريد تشغيله اي انه ماذا نريد ان يحصل اذا نقرنا على الامر فتح .... مباشرة يتم تشغيل البرنامج الموجود داخل الـ Command التابع للمفتاح Open .... واذا نظرنا في قمية الكوماند التابع للفتاح open في مثالنا (برنامج الورد) فاننا سوف نجد فيه مسار برنامج الورد متبوعاً بالعلامة %1 وهي علامة مهمة جداً واذا حذفتها فان الملف لن يعمل ....

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

واكرر انك اذا لم تكن واثقاً مما تفعل انصح بتجاهل الجزء السابق لاننا سوف نقوم بكل ماسبق برمجياً دون الحاجة الى فتح الريجستري وقد كان ذلك للفائدة فقط ...
الان سوف نتعرف على الاجراء الذي سوف يقوم بتسجيل نوع الملفات الجديد في النظام ... والامر الذي سوف نتسخدمه هو NewFileType وهذا الامر يحتوي على ثلاثة بارميترات فقط وهي كالتالي :

codeTonguerogramPath اسم برنامجك ومساره
Extension الامتداد
Description وصف النوع الجديد

يتبع في الجزء الثاني ...
متغيب
الرد }}}
تم الشكر بواسطة: تنمية المعرفة
#2
والشفرة اختصاراً ستكون كالتالي :

PHP كود :
code:Sub NewFileType(ProgramPath As StringByVal Extension As StringDescription As String)
   
Dim W As Object
   Dim E 
As String
 
   Set W 
CreateObject("Wscript.shell")
 
   If 
Left(Extension1) <> "." Then
      E 
"." Extension "\"
   Else
      E = Extension & "
\"
      Extension = Mid(Extension, 2)
   End If
 
   W.regwrite "
HKCR\" & E, Extension & " File"
   W.regwrite "
HKCR\" & Extension & " File\", Description
   W.regwrite "
HKCR\" & Extension & " File\Default Icon\", ProgramPath
   W.regwrite "
HKCR\" & Extension & " File\Shell\Open\Command\", ProgramPath & " %1"
   W.regwrite "
HKCR\" & Extension & " File\Shell\", "Open"
End Sub 

وهذا الاجراء هو الذي يقوم بالعمل ويمكنك ان تضعه داخل برنامجك الذي تريد تسجيله ولكي تستدعي هذا الامر يمكن ان نكتب التالي :

PHP كود :
code:NewFileType "C:\data\Test.exe" "rgd" "Rgheed Special Files" 

في السطر السابق سوف نكون قد اضفنا نوع جديد من الملفات وامتداده هو rgd ويقوم بتشغيله البرنامج Test.exe ووصف هذا النوع من الملفات هو Rgheed Special Files وطبعاً ايقونه سوف تكون ايقونة البرنامج test.exe .....

طبعاً هذا جميل جداً ويمكنك ان تضعه في الحدث Load التابع للفورم بحيث يقوم بالتسجيل عند تشغيل الفورم ... لكن ما الذي تغير الان بعد الاضافة ؟؟؟

اذا قمت بانشاء ملف جديد وجعلت امتداده rgd فسوف تلاحظ ان الملف اصبح يحمل ايقونة برنامجك وانك اذا نقرت عليه مزدوجاً سوف تجد ان برنامجك قد عمل مباشرة ولكن البرنامج يعمل بالشكل الاعتيادي فما الفرق اذا عندما انقر على البرنامج الاصلي او على احد الملفات التابعة له ؟؟؟
في الواقع انه في البرامج الاخرى تجد انك اذا نقرت على اختصار البرنامج الموجود في القائمة ابدء يعمل البرنامج ( مثلاً المفكرة ) ولكنها تكون خالية اي لا تحتوي على ملف مفتوح بينما عندما ننقر على ملف من النوع txt فان المفكرة تعمل مباشرة لكن مع فرق بسيط هو انها ليست خالية بل ان الملف الذي نقرت عليه قد تم عرض محتوياته داخلها ...

اذاّ كيف عرفت المفكرة اننا نقرنا على ملف معبن ثم قامت بعرضه بينما عندما نقرنا على البرنامج فقط بدون ملف txt تم فتح المفكرة ولكنها لم تعرض شيئاً ؟؟ ...

الذي يحدث هو ان الفيجوال يحتوي على امر معرف فيه هو command وهذا الامر اذا نقرنا على البرنامج مباشرة تكون قيمته "" بينما اذا نقرنا على ملف تابع لبرنامجنا مثل الملف rgd في مثالنا السابق فان هذا الامر تكون قيمته هي اسم الملف المنقور عليه ... فاذا كنا نريد ان نضع محتويات الملف الذي ننقر عليه داخل مربع نص نقوم بالتالي :


PHP كود :
code:Private Sub Form_Load()   Dim F As Integer   Dim S As String    NewFileType "C:\data\Test.exe""rgd""Rgheed Special Files"    If Command <> "" Then       F FreeFile      Open Command For Binary As F      S spcae(LOF(F))      Get #F, 1, S      Close F       Text1.Text = S   End IfEnd Sub 

ما عملناه في السطر السابق هو اننا قمنا بالتأكد من ان المتغير Command ليس فارغاً (حيث انه اذا كان فارغاً فان هذا يعني انه ثم النقر على البرنامج وليس على ملف تابع له) واما اذا كان غير فارغ فمعناه اننا نقرنا على ملف تابع له وبالتالي فان اسم الملف الذي نقرنا عليه موجود في المتغير Command لذى قمنا بعدها بفتح الملف ثم قرأة كل محتوياته الى داخل المتغير S وبعدها قمنا بعرض المتغير S في مربع النص Text1 وبالتالي فان جميع محتويات الملف ثم عرضها ....
ان المفاهيم السابقة مهمة جداً لنا كمبرمجين حيث انه يجب علينا ان نتعامل مع الملفات بشكل اكثر احترافية ... كما اني اود ان انوه الى ان وظائف الامر Command ليس فقط عرض اسم الملف الذي تم النقر عليه وانما تمرير توابع الى داخل برنامجنا بحيث يقوم البرنامج بالتصرف بحسب العامل الذي مرر اليه بواسطة الامر Command ونحن هنا كان التابع المرر الى برنامجنا هو اسم الملف الذي تم النقر عليه لذى فان برنامجنا الان يقوم باحد سلوكين اعتماداً على قيمة Command ... السلوك الاول هو ان يعمل بشكل اعتيادي في حالة ان الامر Command كان خالياً ... والسلوك الآخر هو عرض محتويات الملف اذا كان الامر Command غير خالي (اي انه يحتوي على اسم الملف) ....

ويمكن بالطبع جعل التابع Command يمرر قيم اخرى تتحكم في سلوك برنامجنا وبالتالي يجب على البرنامج ان يقوم بالفحص اعتماداً على قيمة Command ثم تقرير العمل او السلوك المطلوب من البرنامج بعدها ....

اتمنى ان تصل اليكم الفكرة ..... اخوكم رغيد ....
متغيب
الرد }}}
تم الشكر بواسطة: Ahmed_Mansoor , Ahmed_Mansoor , Fantastico , العيد1403
#3
درس رائع..جزاك الله كل خير
الرد }}}
تم الشكر بواسطة: حميد
#4
بارك الله فيك وزادك من علم الدين والدنيا
الرد }}}
تم الشكر بواسطة:
#5
مشكور أخي على الشرح الرائع و المميز
الرد }}}
تم الشكر بواسطة: Ahmed_Mansoor
#6
موضوع ممتاز شكرا لكل من شارك في نشره
لقد ذكر الأستاذ أنه :  يمكن بالطبع جعل التابع Command يمرر قيم اخرى تتحكم في سلوك برنامجنا
كيف يمكن ذلك وما هي المعلومات الاخرى التي يمكن الحصول عليها
سؤال آخر أتمنى من الأساتذة المناقشة فيه
بعض الملفات يمكن فتح مجموعة منها معا مرة واحدة
مثلا الملفات الصوتية يمكنك تحديد مجموعة ملفات صوتية ثم إضغط Enter ستجد أن البرنامج المشغل يعمل مرة واحدة ويضع الملفات المحددة في قائمة التشغيل
لكن في ملفات أخرى يتم تشغيل البرنامج عدة مرات كل ملف على حده أو مرة واحدة لكن لملف واحد فقط ولا يقوم بتمريرها معا مرة واحدة الى البرنامج المشغل
<يعطيك العافية>
الرد }}}
تم الشكر بواسطة:
#7
(19-10-12, 10:29 AM)Ahmad Jawad كتب :
هل يوجد مثال للتطبق عليه وتعديل
الرد }}}
تم الشكر بواسطة:
#8
شكرا على موضوع الرائع
الرد }}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  كيفية عمل امتداد خاص بك و جعل برنامجك الافتراضي لهذا الامتداد-ادخل وشوف المزيد بالصور Aly El-Haddad 7 5,970 10-09-17, 01:27 AM
آخر رد: تنمية المعرفة
  من المنتدى القديم - عمل امتداد ملفات خاص بك RaggiTech 1 2,790 14-10-12, 01:46 PM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم