۱۳۸۸ جمعه ۲۱ اسفند Skip Navigation Links
صفحه اصلی
مقالاتExpand مقالات
تازه هاExpand تازه ها
کتاب ها
فروشگاه
اعضا
فروم (سؤال و جواب)
PD on Facebook
 
 
 
کلمه عبور خود را فراموش کرده اید؟
 
 
 دسترسی به رجیستری در NET.
.NET C#
تاریخ ثبت:  ۸۶/۲/۲۳
تعداد نمایش:  ۲۴۷۷
  نویسنده: ابوالفضل حسن الدينف
 
   ۱۶  نفر تا این لحظه به این مقاله امتیاز داده اند.
 
   Bookmark and Share

مقدمه

رجيستري ويندوز، پايگاه داده اي است كه تنظيمات و گزينه هاي انتخابي سيستم عامل ويندوز نسخه هاي 32 بيتي، 64 بيتي و ويندوز موبايل را در خود نگهداري مي كند.اطلاعات و تنظيمات مربوط به سخت افزار سيستم، برنامه هاي نرم افزاري نصب شده و كاربران سيستم در رجيستري ويندوز ذخيره و نگهداري مي شوند.كليه تغييرات اعمال شده از سوي كاربر در پانل تنظيمات، ساختار فايل، خط مشي سيستم و برنامه هاي نصب شده، در رجيستري ويندوز منعكس و ذخيره مي شود.

در اين مقاله سعي بر آن است كه ضمن معرفي رجيستري ويندوز، نحوه برنامه نويسي رجيستري توسط پلتفرم دات نت و زبان برنامه نويسي سي شارپ مورد بررسي قرار گيرد.

ساختار رجيستري ويندوز

رجيستري ويندوز به چند زير بخش منطقي تقسيم شده است.هر يك از اين زير بخش ها كليد ( key ) ناميده مي شوند.نام هر يك از كليدهاي اصلي معمولا با HKEY ( اختصار Handle to Key ) آغاز و با توجه به نوع دسترسي كه API ويندوز به اين كليدها مي دهد، نامگذاري مي شود.در جدول زير زيركليدهاي اصلي رجيستري فهرست شده اند:

توضيحات

فيلد

بخش

اطلاعات مربوط به نوع فايل ها و كامپونت ها

ClassesRoot

HKEY_CLASSES_ROOT

اطلاعات سخت افزاري فعلي

CurrentConfig

HKEY_CURRENT_CONFIG

اطلاعات مربوط به كاربر فعلي

CurrentUser

HKEY_CURRENT_USER

اطلاعات مربوط به ماشين فعلي

LocalMachine

HKEY_LOCAL_MACHINE

اطلاعات پيش فرض مربوط به كابران

Users

HKEY_USERS

 

هر يك از كليدهاي اصلي، به زيركليدهايي تقسيم مي شوند ( به صورت درختي ).هر كليد مي تواند مقاديري از انواع مختلف داشته باشد.انواع مختلف رجيستري در بخش برنامه نويسي به طور كامل شرح داده خواهند شد.كليدهاي ويندوز به مانند مسيرفايل هاي ويندوزي مشخص مي شوند.مثلا HKEY_LOCAL_MACHINE\Software\Microsoft\Windows يك مسير از كليدها را مشخص مي كند كه از HKEY_LOCAL_MACHINE شروع شده به Windows ختم مي شود.مقادير هر زيركليد به صورت مسير نشان داده نمي شوند.در عوض API هاي رجيستري به گونه اي طراحي شده اند كه با گرفتن نام كليد مقادير مربوط به آن را در اختيار قرار مي دهند.

 

مقدمات برنامه نويسي رجيستري ويندوز

API مورد نياز براي برنامه نويسي رجيستري ويندوز در فضاي نام Microsoft.Win32  در نظر گرفته شده اند.اگر بخواهيد به كلاس ها و توابع لازم دسترسي داشته باشيد لازم اين فضاي نام را به مجموعه فضاهاي نام خود (namespace) اضافه كنيد.اين فضاي نام در Object Browser ويژوال استوديو به شكل زير نشان داده شده است.

همانطور كه مشاهده مي كنيد، فضاي نام Microsoft.win32، دو كلاس Registry و RegistryKey را به همراه چند نوع داده شمارشي براي برنامه نويسي رجيستري ويندوز در نظر گرفته است كه در ادامه به شرح مختصر هر يك مي پردازيم.

كلاس Registry

اين كلاس اشياء اصلي كار با رجيستري يعني RegistryKey را ارائه مي دهد.همچين توابع استاتيك لازم براي پردازش جفت هاي كليد/مقدار (key/value) نيز در آن فراهم شده اند.جدول زير شرح مختصري از اعضاي كلاس را در اختيار شما قرار مي دهد:

Public Fields

 

Name

Description

ClassesRoot

Defines the types (or classes) of documents and the properties associated with those types. This field reads the Windows registry base key HKEY_CLASSES_ROOT.

CurrentConfig

Contains configuration information pertaining to the hardware that is not specific to the user. This field reads the Windows registry base key HKEY_CURRENT_CONFIG.

CurrentUser

Contains information about the current user preferences. This field reads the Windows registry base key HKEY_CURRENT_USER

DynData

Contains dynamic registry data. This field reads the Windows registry base key HKEY_DYN_DATA.

LocalMachine

Contains the configuration data for the local machine. This field reads the Windows registry base key HKEY_LOCAL_MACHINE.

PerformanceData

Contains performance information for software components. This field reads the Windows registry base key HKEY_PERFORMANCE_DATA.

Users

Contains information about the default user configuration. This field reads the Windows registry base key HKEY_USERS.

Public Methods

 

Name

Description

Equals 

Overloaded. Determines whether two Object instances are equal. (Inherited from Object.)

GetHashCode 

Serves as a hash function for a particular type. GetHashCode is suitable for use in hashing algorithms and data structures like a hash table. (Inherited from Object.)

GetType 

Gets the Type of the current instance. (Inherited from Object.)

GetValue

Retrieves the value associated with the specified name, in the specified registry key. If the name is not found in the specified key, returns a default value that you provide, or a null reference (Nothing in Visual Basic) if the specified key does not exist.

ReferenceEquals 

Determines whether the specified Object instances are the same instance. (Inherited from Object.)

SetValue

Overloaded. Sets the value of a name/value pair in a registry key.

ToString 

Returns a String that represents the current Object. (Inherited from Object.)

 

كلاس RegistryKey

اين كلاس سطح كليد رجيستري ويندوز را بيان مي كند.تمامي عملياتي كه براي ايجاد، ويرايش و حذف كليدها و مقادير، مورد نياز هستند، توسط توابع اين كلاس فراهم مي شوند.همچين با استفاده از توابع اين كلاس مي توان كليدها و مقادير را براي نمايش دادن، پيمايش كرد.جداول زير اعضاي كلاس را به سادگي تمام نشان مي دهند:

Public Properties

 

Name

Description

Name

Retrieves the name of the key.

SubKeyCount

Retrieves the count of subkeys of the current key.

ValueCount

Retrieves the count of values in the key.

Public Methods

 

Name

Description

Close

Closes the key and flushes it to disk if its contents have been modified.

CreateObjRef 

Creates an object that contains all the relevant information required to generate a proxy used to communicate with a remote object. (Inherited from MarshalByRefObject.)

CreateSubKey

Overloaded.  

DeleteSubKey

Overloaded. Deletes the specified subkey. The string subkey is not case-sensitive.

DeleteSubKeyTree

Deletes a subkey and any child subkeys recursively. The string subkey is not case-sensitive.

DeleteValue

Overloaded. Deletes the specified value from this key.

Equals 

Overloaded. Determines whether two Object instances are equal. (Inherited from Object.)

Flush

Writes all the attributes of the specified open registry key into the registry.

GetAccessControl

Overloaded. Returns the access control security for the current registry key.

GetHashCode 

Serves as a hash function for a particular type. GetHashCode is suitable for use in hashing algorithms and data structures like a hash table. (Inherited from Object.)

GetLifetimeService 

Retrieves the current lifetime service object that controls the lifetime policy for this instance. (Inherited from MarshalByRefObject.)

GetSubKeyNames

Retrieves an array of strings that contains all the subkey names.

GetType 

Gets the Type of the current instance. (Inherited from Object.)

GetValue

Overloaded. Retrieves the value associated with the specified name.

GetValueKind

Retrieves the registry data type of the value associated with the specified name.

GetValueNames

Retrieves an array of strings that contains all the value names associated with this key.

InitializeLifetimeService 

Obtains a lifetime service object to control the lifetime policy for this instance. (Inherited from MarshalByRefObject.)

OpenRemoteBaseKey

Opens a new RegistryKey that represents the requested key on a remote machine.

OpenSubKey

Overloaded. Retrieves the specified subkey.

ReferenceEquals 

Determines whether the specified Object instances are the same instance. (Inherited from Object.)

SetAccessControl

Applies Windows access control security to an existing registry key.

SetValue

Overloaded. Sets the value of a name/value pair in the registry key. Depending on the overload, the registry data type is determined from the type of data being stored or from a specified RegistryValueKind.

ToString

Overridden. Retrieves a string representation of this key.

Explicit Interface Implementations

 

Name

Description

System.IDisposable.Dispose

Performs a Close on the current key.

 

 

نوع داده شمارشي RegistryValueKind

همانطور كه در شرح ساختار رجيستري ويندوز اشاره شد، هر يك از زيركليدهاي رجيستري مقاديري از انواع داده مختلف اختيار مي كنند.انواع داده هاي اين مقادير را به همراه توضيحات در جدول زير نمايش داده ايم:

 

 

Member name

Description

Binary

Specifies binary data in any form. This value is equivalent to the Win32 API registry data type REG_BINARY. 

DWord

Specifies a 32-bit binary number. This value is equivalent to the Win32 API registry data type REG_DWORD. 

ExpandString

Specifies a null-terminated string that contains unexpanded references to environment variables, such as %PATH%, that are expanded when the value is retrieved. This value is equivalent to the Win32 API registry data type REG_EXPAND_SZ. 

MultiString

Specifies an array of null-terminated strings, terminated by two null characters. This value is equivalent to the Win32 API registry data type REG_MULTI_SZ. 

QWord

Specifies a 64-bit binary number. This value is equivalent to the Win32 API registry data type REG_QWORD. 

String

Specifies a null-terminated string. This value is equivalent to the Win32 API registry data type REG_SZ. 

Unknown

Indicates an unsupported registry data type. For example, the Microsoft Win32 API registry data type REG_RESOURCE_LIST is unsupported. Use this value to specify that the SetValue method should determine the appropriate registry data type when storing a name/value pair. 

 

بررسي انواع شمارشي ديگر ارائه شده در فضاي نام Microsoft.Win32 را به عهده خوانندگان مي گذاريم چرا كه اهميت كمتري دارند.

 

آغاز برنامه نويسي رجيستري:

اينك بحث اصلي اين مقاله را پي مي گيريم و آن اين است كه چگونه مي توان رجيستري را برنامه نويسي كرد.براي اينكه به ساده ترين شكل ممكن به هدف فوق نائل شويم، عمليات كار با رجيستري را به زيربخش هايي تقسيم كرده و هر بخش را به صورت جداگانه توضيح مي دهيم.

·         پيمايش يك زيركليد و نمايش تمام زيركليدهاي آن

·         نمايش تمامي مقادير يك زيركليد

·         ايجاد زيركليد جديد

·         حذف زيركليد

·         ايجاد مقدار جديد براي يك زيركليد

·         حذف مقداري از مقادير يك زيركليد

توضيح : سورس كدي كه به همراه اين مقاله ارائه شده است، نسخه شبيه سازي شده برنامه Registry Editor (Regedit) ويندوز مي باشد كه تمامي عمليات ذكر شده در بالا را به صورت كامل پياده سازي كرده است.هر يك از زيربخش هاي بالا با نمونه كدهايي از برنامه مذكور توضيح داده خواهند شد.

 

پيمايش يك زير كليد و نمايش تمام زيركليدهاي آن:

همانطور كه اشاره شد رجيستري ويندوز داراي پنج زيركليد اصلي است كه اين زيركليدها به صورت اعضاي استاتيك در كلاس Registry قرار داده شده اند.با توجه به اينكه زيركليدهاي كدام يك از اين پنج زيركليد مي بايست پيمايش شوند، زيركليد اصلي خود را انتخاب كنيد.سپس زيركليدي(هايي) از آن را كه براي پيمايش مورد نياز است، باز كنيد.به نمونه اي از كدهاي برنامه كه پيمايش زيركليدها را به عهده دارد توجه كنيد:

دقت كنيد كه كلاس RegistryKey سازنده اي ندارد كه بتوان از آن نمونه سازي كرد.زيركليدي كه قرار است شيئي از اين كلاس به آن اشاره كند، توسط كلاس Registry برگردانده مي شود.در قدم اول مي بايست زيركليد اصلي مشخص شود (كليدهاي پنج گانه اصلي) سپس زيركليدهاي آن بنا به نياز باز شوند:

براي باز كردن يك زيركليد، تابع OpenSubKey كلاس RegistryKey را فراخواني كنيد.دقت داشته باشيد كه اگر بخواهيد بعد از باز كردن كليد، زيركليد جديدي به آن اضافه كنيد بايد آرگومان دوم اين تابع را كه از نوع بولين است به مقدار true ست كنيد تا كليد را با قابليت اضافه كردن زيركليد جديد (نوشتن در آن) باز كند.نكته مهم ديگر اين است كه هر زيركليد بعد از استفاده، حتما بايد با فراخواني تابع Close بسته شود.براي اين منظور از ساختار using زبان سي شارپ استفاده كرده ايم كه به صورت خودكار اين تابع را با اتمام حوزه using، فراخواني مي كند.

براي پيمايش يك زيركليد، تابع GetSubKeyNames از كلاس RegistryKey را فراخواني كنيد كه آرايه اي رشته اي از نام زيركليدهاي كليد انتخاب شده را برمي گرداند.

 

نمايش تمامي مقادير يك زيركليد:

براي اين منظور پس از اينكه كليد مورد نظر را باز كرديد، تابع GetValueNames را فراخواني كنيد تا آرايه اي رشته اي از نام تمامي مقادير زيركليد را در اختيار شما قرار دهد.

پس از اينكه نام مقدار را به دست آورديد، توابع GetValueKind و GetValue را به ترتيب براي تعيين نوع وارزش داده فراخواني كنيد.

 

ايجاد زيركليد جديد:

ايجاد زيركليد جديد با فراخواني تابع  CreateSubKey به همراه نام زيركليد جديد، امكان پذير است.دقت كنيد كه براي اين منظور حتما مي بايست كليد پدر، با قابليت ايجاد زيركليد باز شده باشد كه قبلا به آن اشاره شد.

 

حذف زيركليد:

براي حذف يك زيركليد دو تابع در كلاس RegistryKey در نظر گرفته شده اند : DeleteSubKey و DeleteSubKeyTree. تابع اول در مواردي به كار مي رود كه زيركليد حذف شونده، خود زيركليدهاي ديگري نداشته باشد.تابع دوم نيز براي حذف زيركليد به همراه تمامي زيركليدهاي آن به عنوان يك شاخه از درخت رجيستري به كار مي رود.اگر اطمينان داشته باشيد كه زيركليد حذف شونده، زيركليدهاي ديگري ندارد تابع اول و در غير اينصورت تابع دوم را فراخواني كنيد.

 

ايجاد مقدار جديد براي يك زيركليد

براي ايجاد مقدار جديد، ابتدا زيركليد مربوطه را باز كنيد.توجه داشته باشيد كه با استفاده از نوع داده شمارشي RegistryValueKind مي توانيد نوع داده اي را كه قصد ايجاد كردنش را داريد مشخص كنيد.در غير اينصورت به صورت پيش فرض نوع داده رشته اي  (string) ايجاد خواهد شد.براي ايجاد مقدار، تابع SetValue را فراخواني كنيد.آرگومان هاي اين تابع علاوه بر نوع مقدار، نام و ارزش داده ايجاد شونده براي زيركليد مي باشند.

 

حذف مقداري از مقادير يك زيركليد

مشابه عمليات قبلي، براي حذف مقداري از مقادير زيركليد مي بايست به زيركليد مورد نظر و نام مقدار دسترسي داشته باشيد.براي حذف مقدار، تابع DeleteValue را فراخواني كنيد.

 

در پايان يادآور مي شويم كه در اين مقاله فقط عمليات برنامه نويسي رجيستري ويندوز شرح داده شده است.چنانچه در زمينه واسط كاربر و يا بخش هاي ديگر سورس كد ارائه شده سوالي داشته باشيد، مي توانيد از طريق بخش پيغام و سوال با نويسنده ارتباط برقرار كنيد.

سورس کد مثال فوق: Registry_Src.zip

 

  کیفیت مقاله ارائه شده از نظر شما   
برای دادن رتبه به این مقاله می بایست Login کرده باشید.
  درباره نویسنده
ابوالفضل حسن الدينف
Member of Barid Development Team, ERP Solutions
همه مقاله های نوشته شده توسط این کاربر (۱۱)
 
  پیام جدید
صفحه ۱ - پیامهای اصلی ۱ تا ۴ از مجموع ۴ پیام اصلی
اولین قبلی بعدی

 عنوان فرستنده تاریخ
 
پیشنهادی برای تسریع در کارها عباس مسلمی ۸۷/۶/۲۳
پاسخ به: پیشنهادی برای تسریع در کارها ابوالفضل حسن الدينف ۸۷/۶/۲۳
 
يادداشت براي خوانندگان محترم ابوالفضل حسن الدينف ۸۶/۳/۲۲
 
تشکر اسماعیل سنگری فر ۸۶/۳/۱۰
پاسخ به: سینا اوجی ۸۷/۹/۱۷
 
تشکر کاوش حسینی ۸۶/۲/۲۴
اولین قبلی بعدی

Copyright © 2006 - 2010 All Rights Reserved.
Please direct your questions or comments to