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

^| تعامل مع الريجستري |^

مغلق
بدأه عبد الله فتحي في 18 يونيو 2004 · 10 رد · 10,508 مشاهدة · في قسم الدروس والمواضيع المتميزة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

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

التجميع Assembly mscorlib

--->>> تفرع الأسماء Namespace Microsoft.Win32

------>>>>>> الفئة Class Registry

------>>>>>> الفئة Class Registrykey

في البداية فإننا نقوم بإنشاء كائن من الفئة Class Registrykey كالتالي:

Dim Key As Microsoft.Win32.RegistryKey

بعد ذلك سيكون كل تعاملنا مع هذا الكائن Key والذي قمنا باشتقاقه من الفئة Class Registrykey بسطر الكود السابق.

والآن الخطوة التالية هي اختيار المفتاح الرئيسي الذي نريد التعامل معه، وسنقوم باختيار هذا المفتاح من خلال الفئة Class Registry ويكون ذلك كالتالي:

key = Microsoft.Win32.Registry.CurrentUser

كما ترى فإننا قمنا باختيار المفتاح الرئيسي HKEY_CURRENT_USER ولاحظ أنه في أثناء كتابتك للكود السابق يقوم محرر الكتابة بإظهار المفاتيح الرئيسية لاختيار واحدة منها:

بعد أن نختار المفتاح الرئيسي سيكون علينا تحديد ما إذا كنا سنتعامل مع هذا المفتاح الرئيسي نفسه، أو أننا سنتعامل مع مفاتيح متفرعة عن هذا المفتاح الرئيسي ..

في الحالة الأولى سيكون بإمكاننا البدء باستخدام الوظائف ما بين قراءة وكتابة وحذف، وسيتم تنفيذ ذلك على المفتاح الرئيسي..

وأما في الحالة الثانية فسيكون علينا أولاً تحديد المفتاح الفرعي الذي سنتعامل معه ويكون ذلك عن طريق الوظيفة Function OpenSubKey كالتالي:

Function OpenSubKey(name As String, writable As Boolean) As Microsoft.Win32.RegistryKey

ولاحظ أن هذه الوظيفة تقبل معاملين:

الأول name من نوع String ونحدد فيه اسم ومسار المفتاح الفرعي الذي نريد التعامل معه.

والثاني writable من نوع Boolean ونحدد فيه ما إذا كنا سنسمح بالقراءة من والكتابة في هذا المفتاح True، أو أننا سنسمح بالقراءة فقط دون الكتابة False.

ويمكننا تجاهل المعامل الثاني، وفي هذه الحالة سيتم التعامل مع المفتاح على أنه للقراءة فقط ReadOnly.

مثال:

Key = Key.OpenSubKey("Software", True)

هنا اخترنا المفتاح الفرعي Software والموجود تحت المفتاح الرئيسي HKEY_CURRENT_USER تمهيداً للتعامل معه ..

خصائص الفئة Class Registrykey:

تحتوي الفئة Class Registrykey على ثلاث خصائص هي:

Name وتقوم بإعادة اسم المفتاح الذي يتم التعامل معه حالياً.

SubKeyCount وتقوم بإعادة عدد المفاتيح داخل المفتاح الذي يتم التعامل معه حالياً.

ValueCount وتقوم بإعادة عدد القيم الموجودة داخل المفتاح الذي يتم التعامل معه حالياً.

كما هو ظاهر فإن هذه الخصائص الثلاثة للقراءة فقط ReadOnly، ولا يمكن الكتابة إليها.

وظائف الفئة Class Registrykey:

تحتوي الفئة Class Registrykey على وظائف وإجراءات عديدة، سنتناول فيما يلي أهمها بالشرح والتفصيل:

الوظيفة CreateSubKey Function:

وتقوم هذه الوظيفة بإضافة مفتاح جديد إلى الريجستري، كالتالي:

Function CreateSubKey(ByVal subkey As String) As Microsoft.Win32.RegistryKey

وتقبل هذه الوظيفة معامل واحد فقط وهو:

المعامل name من نوع String ونحدد فيه اسم المفتاح الجديد الذي نريد إنشائه.

ولكن أين سيتم إضافة هذا المفتاح ؟

لا أعتقد أنه بإمكانك أن تسأل هذا السؤال بعد كل التوضيح الذي ذكرناه بالأعلى.

لقد قمنا سابقاً باستخدام الوظيفة OpenSubKey لتحديد المفتاح الذي سنتعامل معه .. ومن البديهي هنا أنه سيتم إنشاء هذا المفتاح الجديد بداخله ..

مثال:

key.CreateSubKey("MYPROGRAM")

هنا سيتم إضافة المفتاح الفرعي MYPROGRAM إلى المفتاح الذي نتعامل معه حالياً ..

الإجراء SetValue Sub:

ويقوم هذا الإجراء بإضافة قيمة جديدة إلى الريجستري، كالتالي:

Sub SetValue(name As String, value As Object)

يقبل هذه الإجراء معاملين:

الأول name من نوع String ونحدد فيه اسم القيمة الجديدة التي نريد إنشائها.

الثاني value من نوع Object ونحدد فيه القيمة نفسها.

مثال:

Dim key As Microsoft.Win32.RegistryKey
key = Microsoft.Win32.Registry.CurrentUser
key = key.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Run", True)
key.SetValue("Calc", "calc.exe")

يقوم هذا المثال بإضافة القيمة Calc = calc.exe إلى المفتاح HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run، ويؤدي ذلك إلى تشغيل الآلة الحاسبة عند تسجيل الدخول إلى المستخدم الحالي.

ويمكن الاستفادة من هذا المثال في إمكانية وضع البرنامج الخاص بك في ال StartUp بحيث يتم تشغيله مع بدء تشغيل النظام.

الوظيفة GetValue Function:

وتقوم هذه الوظيفة بإعادة القيمة التي يحملها ال Value أو اسم القيمة الذي نمرره إليها، على النحو التالي:

Function GetValue(ByVal name As String, ByVal defaultValue As Object) As Object

ومن الواضح أن هذه الوظيفة تقبل معاملين:

الأول name من نوع String ونحدد فيه اسم القيمة التي نريد معرفة قيمتها.

الثاني defaultValue من نوع Object ونحدد فيه قيمة افتراضية يتم إرجاعها في حال عدم وجود اسم القيمة المطلوب، ويمكننا التغاضي عن هذا المعامل وعدم ذكره.

في المثال التالي سنحاول معرفة القيمة التي يحملها مدخل قيمة موجود في المسار التالي HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control هذا المدخل اسمه SystemStartOptions وسنقوم بإعادة قيمته في مربع نص TextBox، وفي حال عدم وجود هذا المدخل فإن القيمة العائدة ستكون "notihng":

مثال:

Dim Key As Microsoft.Win32.RegistryKey
Key = Microsoft.Win32.Registry.LocalMachine
Key = Key.OpenSubKey("SYSTEM\ControlSet001\Control", True)
TextBox1.Text = Key.GetValue("SystemStartOptions", "nothing")

الإجراء DeleteSubKey Sub:

ويقوم هذا الإجراء بحذف مفتاح من الريجستري وحذف كل القيم التي بداخله، ولكن يشترط أن لا يحتوي هذا المفتاح على أي مفاتيح متفرعة منه؛ لأنه في هذه الحالة سيكون عليك استخدام الإجراء DeleteSubKeyTree والذي سيأتي شرحه لاحقاً ..

صيغة الإجراء:

Sub DeleteSubKey(ByVal subkey As String, ByVal throwOnMissingSubKey As Boolean)

وكما نرى فإن هذا الإجراء يحتاج إلى تمرير معاملين:

الأول subkey من نوع String وهو المفتاح الذي نريد حذفه.

والثاني throwOnMissingSubKey من نوع Boolean ويكون True في حال الرغبة بإظهار رسالة خطأ عند عدم وجود المفتاح المراد حذفه، وتكون False في حال الرغبة بعدم إظهار رسالة الخطأ هذه.

ملحوظة: يمكننا تجاهل المعامل الثاني تماماً وسيتم التعامل على أنه يحمل القيمة True.

مثال:

Dim Key As Microsoft.Win32.RegistryKey
Key = Microsoft.Win32.Registry.CurrentUser
Key = Key.OpenSubKey("Software", True)
Key.DeleteSubKey("XXX", False)

في المثال السابق نقوم بحذف المفتاح XXX والموجود في المسار التالي HKEY_CURRENT_USER\Software .. طبعاً هذا المفتاح لم يكن موجوداً ولكني قمت بإنشائه سابقاً، ويرجى توخي الحذر في الأوامر الخاصة بالحذف لئلا يتم حذف أي مفاتيح أو قيم مهمة للنظام ..

الإجراء DeleteSubKeyTree Sub:

ويقوم هذا الإجراء بحذف مفتاح من الريجستري وحذف كل القيم التي بداخله وكذلك حذف كل المفاتيح المتفرعة منه، ويجب التأكد قبل استخدام هذا الإجراء لأنه من الممكن أن يؤدي إلى حذف مفاتيح مهمة من الريجستري عن طريق الخطأ ..

صيغة الإجراء:

Sub DeleteSubKeyTree(ByVal subkey As String)

وهنا نجد أن الإجراء يحتاج إلى معامل واحد فقط وهو المعامل subkey من نوع String ويحتوي على المفتاح الذي نريد حذفه.

مثال:

Dim Key As Microsoft.Win32.RegistryKey
Key = Microsoft.Win32.Registry.CurrentUser
Key = Key.OpenSubKey("Software", True)
Key.DeleteSubKeyTree("XXX")

وفي المثال السابق نقوم بحذف المفتاح XXX والموجود في المسار التالي HKEY_CURRENT_USER\Software .. طبعاً سيتم حذف كل المفاتيح والقيم المتفرعة عن هذا المفتاح ..

الإجراء DeleteValue Sub:

ويقوم هذا الإجراء بحذف مسمى قيمة من الريجستري، مع ما تحمله من قيمة ..

صيغة الإجراء:

Sub DeleteValue(ByVal name As String)

هذا الإجراء يحتاج إلى تمرير معامل واحد فقط هو name من نوع String وهو مدخل القيمة الذي نريد حذفه .

مثال:

Dim Key As Microsoft.Win32.RegistryKey
Key = Microsoft.Win32.Registry.CurrentUser
Key = Key.OpenSubKey("Software\XXX", True)
Key.DeleteValue("Color")

في هذا المثال نقوم بحذف القيمة المسماه Color مع ما تحمله من قيمة من المسار التالي HKEY_CURRENT_USER\Software\XXX ..

الوظيفة GetSubKeyNames Function:

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

Function GetSubKeyNames() As String()

وكما هو واضح فإن هذه الوظيفة لا تقبل أية معاملات وإنما هي تتعامل مع المفتاح المفتوح حالياً، وفي المثال التالي سنقوم بمعرفة المفاتيح الفرعية الموجودة في المفتاح HKEY_CURRENT_USER\Software وسنقوم بإضافة هذه المفاتيح في مربع قائمة ListBox:

مثال:

Dim Key As Microsoft.Win32.RegistryKey
Key = Microsoft.Win32.Registry.CurrentUser
Key = Key.OpenSubKey("Software", True)
Dim i As Byte
For i = 0 To Key.GetSubKeyNames.Length - 1
     ListBox1.Items.Add(Key.GetSubKeyNames(i))
Next

الوظيفة GetValueNames Function:

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

Function GetValueNames() As String()

وكما هو واضح فإن هذه الوظيفة لا تقبل أية معاملات وإنما هي تتعامل مع المفتاح المفتوح حالياً، وفي المثال التالي سنقوم بمعرفة القيم الفرعية الموجودة في المفتاح HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run وهو المفتاح الذي يحتوي على برامج بدء التشغيل، ثم نقوم بإضافة هذه القيم في مربع قائمة ListBox:

مثال:

Dim Key As Microsoft.Win32.RegistryKey
Key = Microsoft.Win32.Registry.CurrentUser
Key = Key.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Run", True)
Dim i As Byte
For i = 0 To Key.GetValueNames.Length - 1
ListBox1.Items.Add(Key.GetValueNames(i))
Next

الإجراء Close Sub:

ويقوم هذا الإجراء بإغلاق المفتاح الذي كنا نتعامل معه والذي قمنا بفتحه سابقاً باستخدام الوظيفة OpenSubKey، وبذلك نستطيع أن نقول أن هذا الإجراء هو المقابل العكسي للوظيفة OpenSubKey، ويتم الاستفادة من هذا الإجراء كالتالي:

Sub Close()

وواضح جداً أن هذا الإجراء لا يقبل أية معاملات ولا يُعيد أي قيم ..

وفي المثال التالي سنقوم بمحاولة إنشاء قيمة جديدة في المسار التالي HKEY_CURRENT_USER\Software ولكن المحاولة ستفشل لأننا سنقوم بإغلاق المفتاح قبل محاولة إنشاء القيمة ..

مثال:

Dim Key As Microsoft.Win32.RegistryKey
Key = Microsoft.Win32.Registry.CurrentUser
Key = Key.OpenSubKey("Software", True)
Key.Close()
Key.SetValue("New Value", "Value")

وبالفعل فشلت المحاولة وحصلنا على رسالة الخطأ: Cannot access a closed registry key ( لا يمكن الوصول إلى المفتاح المغلق ) .. والتي تعني عدم إمكانية إنشاء القيمة في المسار الذي حددناه قبل فتحه :)

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

حتى ألقاكم لكم مني خالص التحية

ع . ف . ر

_____________________________________________________________________________________

تم تعديل هذه المشاركة بواسطة عبد الله فتحي في 14 سبتمبر 2005 في 19:31

ani.gif
#2

جزاكم الله كل خير

هل تذكرني ؟؟؟ :)

#4

أهلا بك يا عبد الله و شكرا على الدرس ، كما عودتنا دائما :)

#5

شكراً لكم إخوتي الكرام ..

أخي مصطفى أنت في بالي على الدوام :) ..

جزاك الله خيراً أختي الفلسطينية :) ..

شكراء على الإطراء أحمد ولك وحشة يا باشمهندس :) ..

ani.gif
#7

up

راكان الحنيطي

Be Open Source

opensource-550x4752.gif

#8

شكرا لك أخي على هذه المعلومات القيمة

#9
Accessing the Registry from www.informit.com

فكر بطريقة أخرى

#10

ما هو الريجستري؟وما أهميته وتطبيقاته؟

#11

ياريت وبسرعة جدا جدا برنامج بالفيجوال نت يتعامل مع اجزاء الجهاز ويعرض الcontrol unit

اواكواد لعرض 3*8 decder

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

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