01-10-12, 11:42 PM
كاتب الموضوع : عبدالله الدوسري
السلام عليكم ورحمة الله وبركاتة ..
الهدف : إدخال بيانات ملف رجستري (reg.) في سجل النظام (بدون ظهور أي رسالة للمستخدم) تثبيت صامت أو بما يسمى الدمج الصامت.
مستوى المقالة: مبتدأ - عادي
هذا الكود يقوم بدمج ملف رجستري (reg.) في سجل النظام (أي أن المفاتيح الفرعية و المفاتيح الموجودة في الملف (reg.) سيتم إضافتها إلى سجل النظام) ( وإذا كانت موجودة مسبقاً سيتم تحديثها )
بدون أن يقوم بإظهار رسالة تأكيد على دمج الملف في الرجستري ورسالة نجاج عملية الدمج
قمت بعمل هذ الكود لتسهيل التجربة ( الكود الذي يعمل بصمت في الأسفل - بعد هذا الكود مباشرتاً )
فعند الضغط على الزر يقوم بفتح نافذة تحدد فيها ملف الرجستري المطلوب دمجة
هذة النافذة يمكنك الإستغناء عنها ووضع مسار الملف مباشرتاً من خلال الكود
بعد عملية الدمج تظهر رسالة بنجاح الدمج
أيضاً هذة الرسالة يمكنك إزالتها
هذا الكود للتجربة مع ظهور نوافذ
كود :
[color=blue]Private Sub[/color] Button1_Click([color=blue]ByVal [/color]sender [color=blue]As [/color]System.Object, [color=blue]ByVal [/color]e [color=blue]As [/color]System.EventArgs) [color=blue]Handles [/color]Button1.Click
[color=blue]Dim [/color]OFD [color=blue]As New[/color] OpenFileDialog
OFD.RestoreDirectory = [color=blue]True[/color]
OFD.Filter = [color=darkred]"Registry File (*.reg) |*.reg|(*.*) |*.*"[/color]
[color=blue]If [/color]OFD.ShowDialog = Windows.Forms.DialogResult.OK [color=blue]Then[/color]
[color=blue]Dim [/color]RegFileName [color=blue]As String[/color] = [color=blue]My[/color].Computer.FileSystem.GetFileInfo(OFD.FileName).Name
[color=blue]Dim [/color]RegFileDirPath [color=blue]As String[/color] = [color=blue]My[/color].Computer.FileSystem.GetFileInfo(OFD.FileName).DirectoryName
[color=blue]Dim [/color]RegProcess [color=blue]As New [/color]Process()
[color=blue]Try[/color]
RegProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
RegProcess.StartInfo.CreateNoWindow = [color=blue]True[/color]
RegProcess.StartInfo.FileName = [color=darkred]"cmd.exe"[/color]
RegProcess.StartInfo.Arguments = [color=darkred]"/C cd "[/color] & RegFileDirPath & [color=darkred]" && regedit.exe /s "[/color] & RegFileName
RegProcess.Start()
RegProcess.WaitForExit(6000)
[color=blue]If Not[/color] RegProcess.HasExited [color=blue]Then[/color]
RegProcess.Kill()
[color=blue]End If[/color]
RegProcess.Close()
MsgBox([color=darkred]"تم إضافة الملف بنجاح" [/color]& vbNewLine & [color=darkred]"هذة الرسالة فقط للتوضيح يمكنك إزالتها من الكود"[/color])
[color=blue]Catch [/color]ex [color=blue]As [/color]Exception
MessageBox.Show([color=darkred]"Unable to update the registry :"[/color] & vbNewLine & ex.Message, [color=darkred]"Registry Update Error"[/color], MessageBoxButtons.OK, MessageBoxIcon.Error)
[COLOR=blue]End Try
End If
End Sub[/COLOR]
'DOS هو برنامج يتعامل بموجة الأوامر cmd.exeبرنامج الـ
'
هذا الكود عند تنفيذة سيعمل بدون ظهور أي نافذة
إلا إذا حدث خطاء في عملية الدمج تظهر لك رسالة الخطاء (يمكنك أيظاً إزالة هذة الرسالة)
الكود مشروح بالكامل
كود :
[color=seagreen] 'هنا يتم وضع اسم ملف الرجستري فقط + إمتداد الملف[/color]
[color=blue]Dim [/color]RegFileName [color=blue]As String[/color] = [color=darkred]"MyTestRegFile.reg"[/color]
'
كود :
[color=seagreen] 'هنا يتم وضع مسار المجلد الذي يحتوي على ملف الرجستري[/color]
[color=blue]Dim [/color]RegFileDirPath [color=blue]As String[/color] = [color=darkred]"C:\Documents and Settings\USER\Desktop"[/color]
'
كود :
[color=seagreen] 'إنشاء كائن لإجراء عملية[/color]
[color=blue]Dim [/color]RegProcess [color=blue]As New[/color] Process()
'
كود :
[color=seagreen] 'شكل النافذة التي ستقوم بالإجراء = مخفية [/color]
RegProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
'
كود :
[color=seagreen] 'لتحديد أن الإجراء سيتم بدون ظهور أي نافذة[/color]
RegProcess.StartInfo.CreateNoWindow = [color=blue]True[/color]
'
كود :
[COLOR=seagreen] 'cmd.exe اسم البرنامج الذي سيقوم بالإجراء
'هذا البرنامج معروف لدى المبرمجين وهو موجود في المجلد
'C:\Windows\System32
'بالكامل cmd.exeعند إنشاء كائن لإجراء عملية لا تحتاج إلى أن تظع عنوان ملف الـ
'لأنة معروف لدى النظام, فقط نكتب اسم الملف[/COLOR]
RegProcess.StartInfo.FileName = [color=darkred]"cmd.exe"[/color]
'
طبعاً ستكون مخفية
كود :
[COLOR=seagreen] 'سيقوم بتنفيذ الأمر النصي المكتوب في الأسفل cmd.exeتعني أنه عند تشغيل ملف الـ Arguments
'DOS هو برنامج يتعامل بموجة الأوامر cmd.exeبرنامج الـ
'هو نفس البرنامج ذو الشاشة السوداء
'[color=red]Arguments[/color] لاحظ الأمر المكتوب في الكود في الأسفل
'-------------------------------
'DOS هو أحد أوامر الـ = /C cd
'يعني أن يقوم بتحديد المجلد الذي ستتم علية العملية
'هي عنوان مسار المجلد الذي يحتوي على ملف الرجستري /C cd الكلمة التي تلي
'-------------------------------
' regedit.exe /s
'هو البرنامج المسؤول عن التعامل مع سجل النظام والمقصود هنا الرجستري regedit.exe
' regedit.exe هذا الرمز يخص البرنامج /s
'هذا الرمز بمثابة أمر يدل على تشغيل الملف الذي يلي هذا الرمز
'الذي نريد دمجة في سجل النظام (RegFileName) الذي يلي هذا الرمز هو اسم ملف الرجستري [/COLOR]
RegProcess.StartInfo.[color=red]Arguments [/color]= [color=darkred]"/C cd " [/color]& RegFileDirPath & [color=darkred]" && regedit.exe /s "[/color] & RegFileName
'
كود :
[color=seagreen] ' تعني إبداء في عمل الإجراء Start[/color]
RegProcess.Start()
'
كود :
' تعني إن يبقى الإجراء لمدة 6000 ملي ثانية WaitForExit
[COLOR=seagreen]'حيث أن كل 1000 ملي ثانية = ثانية واحدة
'ستة ثواني كافية جداً لدمج ملف الرجستري في سجل النظام[/COLOR]
RegProcess.WaitForExit(6000)
'
كود :
[color=seagreen]'هنا سنتحقق من شرط لظمان التخلص من الحيز الذي يستهلة هذا الإجراء من مصادر النظام[/color]
[color=blue]If Not[/color] RegProcess.HasExited [color=blue]Then[/color]
[COLOR=seagreen]'هنا نسأل عن ما إذا قم تم إغلاق الإجراء بعد المدة المحددة
'إذا كان الإجراء لا زال يعمل ستتم عملية إنهاء لهذة العملية
'برمجياً تسمى بقتل الإجراء[/COLOR]
RegProcess.Kill()
[color=blue]End If[/color]
'
كود :
[color=seagreen]'يقوم بتحرير جميع المصادر التي كان يستخدمها هذا الكائن Close[/color]
RegProcess.Close()
'
الكود سيصبح في النهاية هكذا :
كود :
[color=blue]Private Sub[/color] Button1_Click([color=blue]ByVal [/color]sender [color=blue]As[/color] System.Object, [color=blue]ByVal [/color]e [color=blue]As [/color]System.EventArgs) [color=blue]Handles [/color]Button1.Click
[color=blue]Dim [/color]RegFileName [color=blue]As String[/color] = [color=darkred]"MyTestRegFile.reg"[/color]
[color=blue]Dim [/color]RegFileDirPath [color=blue]As String[/color] = [color=darkred]"C:\Documents and Settings\USER\Desktop"[/color]
[color=blue]Dim [/color]RegProcess [color=blue]As New Process[/color]()
[color=blue]Try[/color]
RegProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
RegProcess.StartInfo.CreateNoWindow = [color=blue]True[/color]
RegProcess.StartInfo.FileName = [color=darkred]"cmd.exe"[/color]
RegProcess.StartInfo.Arguments = [color=darkred]"/C cd "[/color] & RegFileDirPath & [color=darkred]" && regedit.exe /s "[/color] & RegFileName
RegProcess.Start()
RegProcess.WaitForExit(6000)
[color=blue]If Not[/color] RegProcess.HasExited [color=blue]Then[/color]
RegProcess.Kill()
[color=blue]End If[/color]
RegProcess.Close()
[color=blue]Catch [/color]ex [color=blue]As [/color]Exception
MessageBox.Show([color=darkred]"Unable to update the registry :"[/color] & vbNewLine & ex.Message, [color=darkred]"Registry Update Error"[/color], MessageBoxButtons.OK, MessageBoxIcon.Error)
[COLOR=blue]End Try
End Sub[/COLOR]
'
مرفق مشروع بالفيجوال ستيديو 2008
تحياتي للجميع ...