مقدمه
رجيستري ويندوز، پايگاه داده اي است كه تنظيمات و گزينه هاي
انتخابي سيستم عامل ويندوز نسخه هاي 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
ويژوال استوديو به شكل زير نشان داده شده است.
.jpg)
همانطور كه مشاهده مي كنيد،
فضاي نام
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
نوع داده شمارشي
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 قرار داده شده اند.با توجه به اينكه زيركليدهاي
كدام يك از اين پنج زيركليد مي بايست پيمايش شوند، زيركليد اصلي خود را انتخاب
كنيد.سپس زيركليدي(هايي) از آن را كه براي پيمايش مورد نياز است، باز كنيد.به نمونه
اي از كدهاي برنامه كه پيمايش زيركليدها را به عهده دارد توجه كنيد:
.jpg)
دقت كنيد كه كلاس RegistryKey
سازنده اي ندارد كه بتوان از آن نمونه سازي كرد.زيركليدي كه قرار است شيئي از اين
كلاس به آن اشاره كند، توسط كلاس Registry
برگردانده مي شود.در قدم اول مي بايست زيركليد اصلي مشخص شود (كليدهاي پنج گانه
اصلي) سپس زيركليدهاي آن بنا به نياز باز شوند:
.jpg)
براي باز كردن يك زيركليد، تابع
OpenSubKey كلاس RegistryKey
را فراخواني كنيد.دقت داشته باشيد كه اگر بخواهيد بعد از باز كردن كليد، زيركليد
جديدي به آن اضافه كنيد بايد آرگومان دوم اين تابع را كه از نوع بولين است به مقدار
true ست كنيد تا كليد را با قابليت
اضافه كردن زيركليد جديد (نوشتن در آن) باز كند.نكته مهم ديگر اين است كه هر
زيركليد بعد از استفاده، حتما بايد با فراخواني تابع Close
بسته شود.براي اين منظور از ساختار using
زبان سي شارپ استفاده كرده ايم كه به صورت خودكار اين تابع را با اتمام حوزه
using، فراخواني مي كند.
براي پيمايش يك زيركليد، تابع
GetSubKeyNames از كلاس RegistryKey
را فراخواني كنيد كه آرايه اي رشته اي از نام زيركليدهاي كليد انتخاب شده را برمي
گرداند.
نمايش تمامي
مقادير يك زيركليد:
براي اين منظور پس از اينكه كليد مورد نظر را باز كرديد،
تابع GetValueNames را فراخواني
كنيد تا آرايه اي رشته اي از نام تمامي مقادير زيركليد را در اختيار شما قرار دهد.
.jpg)
پس از اينكه نام مقدار را به دست آورديد، توابع
GetValueKind و
GetValue را به ترتيب براي تعيين نوع وارزش داده فراخواني
كنيد.
ايجاد زيركليد
جديد:
ايجاد زيركليد جديد با فراخواني تابع
CreateSubKey به همراه نام زيركليد جديد،
امكان پذير است.دقت كنيد كه براي اين منظور حتما مي بايست كليد پدر، با قابليت
ايجاد زيركليد باز شده باشد كه قبلا به آن اشاره شد.
.jpg)
حذف زيركليد:
براي حذف يك زيركليد دو
تابع در كلاس RegistryKey در نظر
گرفته شده اند : DeleteSubKey و
DeleteSubKeyTree. تابع اول در
مواردي به كار مي رود كه زيركليد حذف شونده، خود زيركليدهاي ديگري نداشته باشد.تابع
دوم نيز براي حذف زيركليد به همراه تمامي زيركليدهاي آن به عنوان يك شاخه از درخت
رجيستري به كار مي رود.اگر اطمينان داشته باشيد كه زيركليد حذف شونده، زيركليدهاي
ديگري ندارد تابع اول و در غير اينصورت تابع دوم را فراخواني كنيد.
.jpg)
ايجاد مقدار
جديد براي يك زيركليد
براي ايجاد مقدار جديد، ابتدا زيركليد مربوطه را باز
كنيد.توجه داشته باشيد كه با استفاده از نوع داده شمارشي
RegistryValueKind مي توانيد نوع داده اي را كه قصد ايجاد
كردنش را داريد مشخص كنيد.در غير اينصورت به صورت پيش فرض نوع داده رشته اي
(string)
ايجاد خواهد شد.براي ايجاد مقدار، تابع SetValue
را فراخواني كنيد.آرگومان هاي اين تابع علاوه بر نوع مقدار، نام و ارزش داده ايجاد
شونده براي زيركليد مي باشند.
.jpg)
حذف
مقداري از مقادير يك زيركليد
مشابه عمليات قبلي، براي حذف مقداري از مقادير زيركليد مي
بايست به زيركليد مورد نظر و نام مقدار دسترسي داشته باشيد.براي حذف مقدار، تابع
DeleteValue را فراخواني كنيد.
.jpg)
در پايان يادآور مي شويم كه در اين مقاله فقط عمليات برنامه
نويسي رجيستري ويندوز شرح داده شده است.چنانچه در زمينه واسط كاربر و يا بخش هاي
ديگر سورس كد ارائه شده سوالي داشته باشيد، مي توانيد از طريق بخش پيغام و سوال با
نويسنده ارتباط برقرار كنيد.
سورس کد مثال فوق: Registry_Src.zip