الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف اقوم بعمل shell تضاف الي ال registry عن طريق ملف dll

مغلق
بدأه تغريد في 22 ديسمبر 2006 · 30 رد · 4,905 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

هناك برامج كثيرة تقوم باظهار اوامرها عن الضغط كلك يمين علي اي فلدر او ملف

قد قمت بفعل هذا ولكن

1- لم تظهر الاوامر عن الضخط كلك يمين في خلفية برتشن او ملف

2-عن اختيار مجموعه من الملفات و الفلدرات يتم تنفيز الاوامر علي اما الملفات او الفلدرات

عن دراسة الموضوع اكثر تبين لي ان هناك ملفات dll يقوم المبرمج بصنعها هذة الملفات تتصل بالregistry مثل برنامج winzip

السؤال هو كيف اقوم بعمل مثل هذه الملفات عن طريق vb.net

#2

السلام عليكم

ممكن تجد مرادك في هذا الموضوع

/index.php?showtopic=102857

بالتوفيق والله أعلم

سبحانك اللهم وبحمدك أشهد ان لا اله الا أنت

أستغفرك وأتوب اليك

الهم صلي وسلم وبارك على سيدنا وحبيبنا محمد

#3

هناك العديد من الطرق لأضافة menuitem الي قائمة explorer ومنها

اولا : عن طريق مسجل النظام "الرجستري" كما في هذا الموضوع

/index.php?showtopic=107956

ثانياً : عن طريق استخدام dll او بالاحري Shell Extensions تجدة في هذا الموضوع.

/index.php?showtopic=100395

بالتوفيق ان شاء الله

مواضيع متنوعة

#4
Moudey كتب:
هناك العديد من الطرق لأضافة menuitem الي قائمة explorer ومنها

اولا : عن طريق مسجل النظام "الرجستري" كما في هذا الموضوع

/index.php?showtopic=107956

ثانياً : عن طريق استخدام dll او بالاحري Shell Extensions تجدة في هذا الموضوع.

/index.php?showtopic=100395

بالتوفيق ان شاء الله

الي الاخوة الذين قاموا بالرد علي

انا عاجزة عن الشكر

ولا امتلك غير الدعاء بالغيب

لان دة اول مشلركة لية وكانت سؤل ولم اتوقع هذا الاهتمام

:^)

#5

انا اسفة عن الاقتباس

انا كان قصدي شكر الاخوة الذين ساعدوني

انا اسفة لاني جديدة في المنتدي ولا احسن التعامل مع الاضافات او التعليقات

ولا امتلك غير الدعاء بالغيب للذين ساعدوني

#6

هناك مشكاتين

1- اني لا اعرف غير vb.net ولا شئ غيرة وكل المساعدات من الاخوة تعتمد علي السي شارب !!!

2-الاخوة تتعامل معي علي انني في مستواهم في البرمجة فاتمني التوضيح بالخطوات

#7

السلام عليكــــم :

بأمكانك فعل دلك عند عمل (التحزيم ) لبرنامجك يعني عند عمل Deployment

عندما يتم تنزيل برنامجك Setup عند جهاز اخر فانه يضيف قيم في الريجستري يعمل الاشياء التى طلبتها

فا DotNet موفرة فيه هذه الميزات

سبحان الله وبحمده سبحان الله العظيم

#8

اسف لقد نسيت وضع رابط لتعليم التحزيم وهدا هو الرابط عمل التحزيم

لقد جربت من هنا واشتغل معاي ولكن اول المفروض تعرف كيفية التعامل مع الريجستري قبل برمجة الريجسيتري

وبالتـــوفق إن شاء الله

سبحان الله وبحمده سبحان الله العظيم

#9

السلام عليكم.

لقد قمت بعمل كلاس جديد مع مثال ايضاً بـ VB

ملاحظة :

الكود ترجم علي الفريم ورك 1.1 وطور خارج بيئة Visual Studio اي لم يستخدم IDE في تطوير هذا الكود

وذلك لعدم وجود Visual Studio 2003 لدي.

ارجو ان يعمل لديك.

سأقوم بشرحة عداً ان شاء الله

لاضافة البرنامج الي مسجل النظام يجب تشغيل ملف Test.exe ومن ثم اضغط علي زر Register

يمكنك الاطلاع علي بعض الشرح منة

/index.ph...st&p=510311

بالتوفيق ان شاء الله

ShellExt.zip

تم تعديل هذه المشاركة بواسطة Moudey في 23 ديسمبر 2006 في 11:20

مواضيع متنوعة

#10

شكرا علي الاهتمام

اخي moudey

الملف المرفق سابقا يعمل معي علي vb.net 2003 و framework 1.1

وفي كل الي بتمني

ولكن انا مش فهمه اي حاجة كيف صنع علي vb.net2003

مع الملاحظة انه لم يظهر اي شئ عند الضغط كلك يمين في خلفية فلدر او برتشن

كما هو الحال مع الامر paste الذي يظهر دائما عند الضغط كلك يمين في الخلفية في اي مكان دون اختيار اي ملف او فلدر

ارجوا اتساع صدر الاخوة لي انا عرفة اني امشي ببطئ شديد

#11

تفضل اخي الكريم هذا تعديل جديد

حيث تم اضافة menu item الي قائمة Right-Click in a Directory Window اسفل Properties

بالتوفيق ان شاء الله

ShellExt.zip

مواضيع متنوعة

#12

يا اخي moudey التعديل الذي قمت بة لم يجل اوامر البرنامج تظهر عن الضغط كلك يمين في خلفية الفلدر دون اختيار ملف او فلدر

المهم كيف فعلت هذا نريد الشرح نرجوك

قم بشرح ما فعلت بالخطوات نرجوك

#13

السلام عليكم.

اختي الكريمة وضحي لي هل عمل مك الكود السابق ام لا واي نظام تشغيل تستخدمية

في المرفقات شرح لكيفة استخدام كلاس ShellExt

اما شرح عمل الكلاس فييتطلب وقت وانا الان في اختبارات الترم الاول وعندما انتهي منها سوف اقوم بشرحة ان شاء الله

Shell_Extensions_ContextMenuHandler.zip

مواضيع متنوعة

#14

السلام عليكم

اخي moudey

الكلاس ShellExt يعمل معي لا توجد مشاكل معه

اما الكلاس الثاني Shell_Extensions_ContextMenuHandler.zip لا يعمل

اتمني اول ما تلاقي وقت فاضي تقوم بالشرح

لان الموضوع هام جدا بالنسبة لي ومتوقف علية اشياء كثيرة

ربنا معاك في الامتحانات

ولو عاوز اي حاجة في المزاكرة اوعي تسألني لاني مشعرفة اي حاجة في اي حاجة !

#15

اخي moudey

فعلا الكلاس ShellExt يقوم بعمل كل الي بحلم بة ويعمل علي نظامي بيسر وسهملة

أموووووووووووووووووووت وعرف ازاي عملتة بال vb.net

#16
تغريد كتب:
الكلاس ShellExt يعمل معي لا توجد مشاكل معه

اما الكلاس الثاني Shell_Extensions_ContextMenuHandler.zip لا يعمل

الكلاس الموجود في ملف Shell_Extensions_ContextMenuHandler.zip هو نفسة كلاس ShellExt لم يتغير شيئ.

الروابط التالية من ميكروسوف توضح الكلاسات المستخدمة مع كلاس ShellExt من خلال مسجل النظام

http://msdn.microsoft.com/library/default....mmandString.asp

http://msdn.microsoft.com/library/default....hellextinit.asp

في القريب العاجل سأقوم بشرحة إن شاء الله

مواضيع متنوعة

#17

اخي الكريم

الكلاس Test[1].SoftWin.ShellExtensions عند عملها تتطلب framework 2.0.507

والframework التي اعمل عليها framework 1.1 وليس هناك وقت لتنزيل framework 2.0.507 فالسرعه داخل البيوت في مصر ضعيفه جدا

علي فكرة الروابط التي كتبتها من msdn قد قرأتها من قبل ولم افهم اي شئ !!!

انا عندي مكتبة msdn كاملة ولكن لم افهم !!!

عندما تقوم بالشرح نرجوا شرح الكلاس ShellExt التي عملت معي علي framework 1.1 واعطت النتائج التي اريدها

أشكرك علي الرد المستمر معي

وانا في انتظار الشرح .......................

#18

السلام عليكم.

ملف ShellExtLib.vb

فيما يلي الـ Interface والخاص بأستيراد مقابض قائمةContextMenu عند الضغط كليك يمين علي الملف او المجلد او داخل المجلد بمستعرض الويندوز.

<ComImport(), Guid("000214E4-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
Friend Interface IContextMenu

' مسؤلة عن ايجاد مقبض القائمة واضافة عنصر قائمة
  <PreserveSig()> Function QueryContextMenu( _
	 ByVal hMenu As IntPtr, _
	 ByVal indexMenu As Integer, _
	 ByVal idCmdFirst As Integer, _
	 ByVal idCmdLast As Integer, _
	 ByVal uFlags As QueryContextMenuFlags) As Integer

 ' مسؤلة عن الضغط بالماوس علي عنصر القائمة 
Sub InvokeCommand( _
	 ByRef lpici As CMINVOKECOMMANDINFO)

' مسؤلة عن كتابة بيانات في شريط الحالة
Sub GetCommandString( _
	 ByVal idCmd As Integer, _
	 ByVal uType As GetCommandStringFlags, _
	 ByVal pwReserved As Integer, _
	 ByVal pszName As IntPtr, _
	 ByVal cchMax As Integer)
 End Interface

الـ Flags و Structure التالي يستخدم في لللانترفاس السابق IContextMenu

<Flags()> _
Friend Enum MF
  ByCommand = &H0
  ByPosition = &H400
  [Default] = &H1000
  Disabled = &H2
  Enabled = &H0
  Grayed = &H1
  Separator = &H800
End Enum

<Flags()> _
Friend Enum QueryContextMenuFlags
  CMF_NORMAL	 = &H0
  CMF_DEFAULTONLY   = &H1
  CMF_VERBSONLY	= &H2
  CMF_EXPLORE	= &H4
  CMF_NOVERBS	= &H8
  CMF_CANRENAME	= &H10
  CMF_NODEFAULT	= &H20
  CMF_INCLUDESTATIC   = &H40
  CMF_RESERVED	= &HFFFF0000
 End Enum

<Flags()> _
Friend Enum GetCommandStringFlags
  GCS_VERB	 = &H0
  GCS_HELPTEXT	= &H1
  GCS_VALIDATE	= &H2
  GCS_UNICODE	= &H4
End Enum

<Flags()> _
Friend Enum InvokeCommandMask
  CMIC_MASK_HOTKEY   = &H20
  CMIC_MASK_ICON	= &H10
  CMIC_MASK_FLAG_NO_UI  = &H400
  CMIC_MASK_UNICODE   = &H4000
  CMIC_MASK_NO_CONSOLE  = &H8000
  CMIC_MASK_ASYNCOK   = &H100000
  CMIC_MASK_PTINVOKE   = &H20000000
  CMIC_MASK_SHIFT_DOWN  = &H10000000
  CMIC_MASK_CONTROL_DOWN  = &H20000000
End Enum

الـ Interface التالي خاص بارسال اسماء الملفات والمجلدات قبل انشاء القوائم.

<ComImport(), Guid("000214E8-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
Friend Interface IShellExtInit
   Sub Initialize(ByVal pidlFolder As IntPtr, _
	<MarshalAs(UnmanagedType.Interface)> _
	ByVal lpIDataObject As IDataObject, _
	ByVal hkeyProgID As Integer)
 End Interface

Interface مساعد للـ Interface السابق اذا كنت تستخدم اصدار 2 .NET فقد وتوفر هذا الانترفاس IDataObject في فضاء الاسماء التاليSystem.Runtime.InteropServices.ComTypes

<ComImport(), Guid("0000010e-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
Friend Interface IDataObject

  Sub GetData(ByRef pformatetcIn As FORMATETC, ByRef pmedium As STGMEDIUM)

  Sub GetDataHere(ByRef pformatetc As FORMATETC, ByRef pmedium As STGMEDIUM)

  <PreserveSig()> Function QueryGetData(ByRef pformatetc As FORMATETC) As Integer

  Sub GetCanonicalFormatEtc(ByRef pformatectIn As FORMATETC, ByRef pformatetcOut As FORMATETC)

  Sub SetData(ByRef pformatetc As FORMATETC, ByRef pmedium As STGMEDIUM, _

  <MarshalAs(UnmanagedType.Bool)> ByVal fRelease As Boolean)

  Function EnumFormatEtc(ByVal dwDirection As DATADIR) As <MarshalAs(UnmanagedType.Interface)> Object
  Function DAdvise(ByRef pformatetc As FORMATETC, ByVal advf As Integer, _
	<MarshalAs(UnmanagedType.Interface)> ByVal pAdvSink As Object) As Integer

  Sub DUnadvise(ByVal dwConnection As Integer)

  Function EnumDAdvise() As <MarshalAs(UnmanagedType.Interface)> Object

End Interface

الـ Flags Structure التالي يستخدم في لللانترفاس السابق

<Flags()> _
Friend Enum DATADIR
  DATADIR_GET	= 1
  DATADIR_SET	= 2
End Enum

<Flags()> _
Friend Enum TYMED
  TYMED_HGLOBAL	= 1
  TYMED_FILE	 = 2
  TYMED_ISTREAM	= 4
  TYMED_ISTORAGE	= 8
  TYMED_GDI	 = 16
  TYMED_MFPICT	= 32
  TYMED_ENHMF	= 64
  TYMED_NULL	 = 0
End Enum

<Flags()> _
Friend Enum DVASPECT
  DVASPECT_CONTENT   = 1
  DVASPECT_THUMBNAIL   = 2
  DVASPECT_ICON	= 4
  DVASPECT_DOCPRINT   = 8
End Enum

<EditorBrowsable(EditorBrowsableState.Never)> _
Friend Structure FORMATETC
  Dim cfFormat As Short
  Dim ptd As Integer
  Dim dwAspect As DVASPECT
  Dim lindex As Integer
  Dim tymed As TYMED
End Structure

<EditorBrowsable(EditorBrowsableState.Never)> _
Friend Structure STGMEDIUM
  Dim tymed As TYMED
  Dim data As Integer
  <MarshalAs(UnmanagedType.IUnknown)> _
  Dim pUnkForRelease As Object
End Structure

كل ما فعلناه الان هو استيراد مكونات shell objects الخاص بـ ContextMenuHandler بالويندوز.

سنستخدم API التالي .

DragQueryFile مسؤل عن ايجاد الملفات والمجلدات التي تم تحديدها.

Friend Declare Ansi Function DragQueryFile Lib "shell32" Alias "DragQueryFileA" ( _
	 ByVal hDrop As Integer, _
	 ByVal iFile As Integer, _
	 ByVal lpszFile As StringBuilder, _
	 ByVal cch As Integer _
  ) As Integer

SHGetPathFromIDList مسؤل عن ايجاد مسار المجلد عند الضغط كلك يمين في خلفية المجلد.

Friend Declare Function SHGetPathFromIDList Lib "shell32" ( _
   ByVal pidl As IntPtr, _
   ByVal path As StringBuilder _
  ) As Integer

InsertMenu مسؤل عن اضافة عنصر قائمة الي قائمة ContextMenu

Friend Declare Ansi Function InsertMenu Lib "User32" Alias "InsertMenuA" ( _
   ByVal hMenu As IntPtr, _
   ByVal nPosition As Integer, _
   ByVal wFlags As MF, _
   ByVal wIDNewItem As Integer, _
   ByVal lpNewItem As String _
  ) As Long

--------------------------

بقي شرح استخدام تلك الاجراءات

وغداً ان شاء الله ساكمل الشرح

مواضيع متنوعة

#19

السلام عليكم

شكرأ شكرأ شكرأ شكرأ شكرأ شكرأ شكرأ شكرأ اخي moudey

نحن في الانتظار لاستكمال الشرح ...

والله عنده حسن الثواب

#20

الماف المرفق مثال بسيط جداً علي كيفية اضافة عنصر قائمة.

ارجو الاطلاعلية و هل عمل عندك ام لا.

وارجو محاولة فهم الاجراءات في ملف ShellCommand حتي اكمل الشرح ان شاء الله

والله الموفق.

ShellCommand.zip

مواضيع متنوعة

#21

بارك الله فيك اخي الكريم

لقد فهمت الكود داخل ShellCommand.vb

ولكن البرنامج لا يحتوي علي ملف .exe

فقمت بالضغط علي جميع الملفات .cmd

وقامت الاخيره بانشاء ملف ShellCommand.dll

ولم يظهر اي شئ في القوائم

المهم

اني بدأت افهم ونرجوا استكمال الشرح

#22

اذاً تم انشاء ملف ShellCommand.dll وهذا يدل علي ان الكود ليس بة مشاكل مع اصدار دوت نت 1.1.

الحمد لله انكي فهمت الكود الان.

لايهمم اذا كان الملف dll ام exe.

اولا : يتم عمل build للمشروع من خلال ملف build.bat وينتج عنة ملف بأسم ShellCommand.dll

وهذا يسمي انشاء مشروع من خللا سطر الاوامر والخاص بـ كومبيلر الفيجوال بيسك. وليس من خلال IDE اي Visual Studio

ثانياً : يتم تسجيل الملف ShellCommand.dll من خلال ملف Reg.bat

والغاء التسجيل قم بالنقر علي ملف Unreg.bat

اذا لم تظهر القائمة بأسم Shell Command في المستعرض قومي بتغير قيمة Guid هذة

 <ComVisible(True), Guid("ACD2EEF8-5B96-4d8b-9F2F-2A514F050B4F")> _ 
const ClassId as string  = "{ACD2EEF8-5B96-4d8b-9F2F-2A514F050B4F}"

الي

 <ComVisible(True), Guid("BCD2EEF8-5B96-4d8b-9F2F-2A514F050B4F")> _ 
const ClassId as string  = "{BCD2EEF8-5B96-4d8b-9F2F-2A514F050B4F}"

ثم قومي بعمل build للمشروع ومن ثم تسجيلة.

بعد التسجيل انظر هل تمت الاضافة ام لا.

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

HKEY_CLASSES_ROOT\Directory\Background\shellex\ContextMenuHandlers

فأذا وجد هذا المفتاح

Shell Command وامامة هذة القيمة التي قمنا بتغيرها {BCD2EEF8-5B96-4d8b-9F2F-2A514F050B4F}

فقد تم تسجيل الكلاس.

ملاحظة

في بعض الحالات يجب عمل تسجيل خروج او اعادة تشغيل للويندوز بعد عملية تسجيل الكلاس.

تم تعديل هذه المشاركة بواسطة Moudey في 27 ديسمبر 2006 في 21:28

مواضيع متنوعة

#23

في المرفقات الشرح النهائي ارجو ان يكون الشرح واضح ووفي

بالتوفيق ان شاء الله

ShellExtMenu.zip

مواضيع متنوعة

#24

انا عاجزة عن شكرك اخي moudey

قمت بتحميل الشرح

الشرح اكثر من رائع

سوف اقوم بتنفيذة ان شاء الله

أفعل الخير... فأن لم يلاقي أهله... فأنت أهله

#25

السلام عليكم

اخي moudey

أشكر حضرتك علي تعبك معي

انا جلست علي الكميوتر لمدة يومين وفي الاخر لم احصل علي اي شئ

شرح الكلاس جميل ولكن بعد كتابة الكود كما قد شرحت وبعد مقارنتة بالملفات المرفقة

حدث الاتي

1- لم يستجيب للامر RegAsm <اسم الملفا> /codebase من خلال ال Command Prompt وظهرت رسالة خطا

2- الكلاس التي قمت بارسالها الي لم تعمل علي الجهاز حتي بعد تغير <ComVisible(True), Guid(" وكذلك

const ClassId as string =

قمت بالزهاب ال HKEY_CLASSES_ROOT\Directory\Background\shellex\ContextMenuHandlers

ولم اجد القيمة التي قد اشرت اليها

3- الكلاس الوحيد الي اشتغل معي هو ShellExt الذي يحتوي علي ملف exe وانت قلت انه مثل الكلاس ShellCommand

بس الاول اشتغل وظهر في القائمة والثاني لم يظهر حتي بعد التغيرات التي قد اشرت اليها !!!!!

الموضوع مهم جدا جدا بالنسبة لي فارجوك تابع معي

المهم اني عرفت الدوال المستخدمة وحاولت استخدامها

وحاولت كتابة الكود بطريقة اخري من داخل برنامج ويندوز عادي exe حتي اتجنب Command Prompt وحتي يمكن التغير فية بسهولة ولكن وقفت عند اول مطب

قمت بكتابة

Public Declare Ansi Function InsertMenu Lib "User32" Alias "InsertMenuA" ( _

ByVal hMenu As IntPtr, _

ByVal nPosition As Integer, _

ByVal wFlags As MF, _

ByVal wIDNewItem As Integer, _

ByVal lpNewItem As String _

) As Long ) As Long

ثم من داخل اجراء الضغط علي الزر كتبت

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim d As IntPtr

InsertMenu(d, 5, MF.String, 5, "gada ahmad")

End Sub

طبعا كتبت Public Enum MF كما هو في الشرح تماما

المشكلة هي ال d

كيف ارسل الي الدلة InsertMenu المقبض الخاص بالنافذة المراد التعامل معها

كل الي محتجالة الان هو عند الضغط علي زر في نافذة البرنامج بتاعي تظهر ال item في ال ContextMenu للويندوز

ارجوك استمر معي في هذا البرنامج

السؤال الان هو كيف ارسل المقبض الخاص للقائمة الي الدالة InsertMenu ؟

shell.rar

هذا الموضوع مغلق.

مواضيع مشابهة