[size=large]کار با رجیستري در ویژوال بیسیک - قسمت اول
رجیستري چیست ؟
سیستم عامل ویندوز تنظیمات سخت افزاري و نرم افزاري خود را بطور
مرکزي در یک بانک اطلاعاتی با ساختار سلسله مراتبی ذخیره می کند
که رجیستري نام دارد . رجیستري جایگزینی براي بسیاري از فایلهاي
است که در نسخه هاي اولیه ویندوز COM و SYS ،INI پیکربندي
موجود بود . رجیستري ، سیستم عامل را با مهیا کردن اطلاعات موردنیز
ها ، کنترل می کند . component شدن load براي اجراي برنامه ها و
رجیستري شامل انواع مختلفی از اطلاعات می باشد مثل :
- اطلاعات سخت افزارهاي نصب شده روي سیستم
- اطلاعات درایورهاي نصب شده روي سیستم
- اطلاعات برنامه هاي نصب شده روي سیستم
- اطلاعات پروتکلهاي شبکه اي مورد استفاده در سیستم
ساختار رجیستري شامل چندین مجموعه رکورد است که داده هاي این
رکوردها توسط بسیاري از برنامه ها و اجزاي سیستم عامل خوانده و یا
نوشته می شود .
اجزاي رجیستري
اجزاي تشکیل دهنده رجیستري عبارتند از :
هاي موجود در ریشه یک folder ها همانند subtree : Subtree – 1
می باشد : subtree درایو هارد هستند . رجستري ویندوز داراي پنج
شامل تمام داده هاي پیکربندي : HKEY_LOCAL_MACHINE -
،SAM ،Hardware : است key براي کامپیوتر می باشد و شامل 5
System و Software ،Security
شامل داده هاي مربوط به تنظیمات سیستم عامل : HKEY_USERS -
و محیط ویندوز desktop است مثل تنظیمات user براي هر
شامل داده هاي کاربر فعلی سیستم : HKEY_CURRENT_USER -
شامل اطلاعات پیکربندي نرم افزار : HKEY_CLASSES_ROOT -
و داده هاي کلاسهاي متناظر با فایل OLE است مثل داده هاي
شامل اطلاعات مورد نیاز براي : HKEY_CURRENT_CONFIG -
تنظیمات داریورهاي سخت افزاري و غیره
هاي روي هارد subfolder ها و folder ها همانند Key : key – 2
هاي نرم افزاري یا سخت افزاري می object متناظر با key هستند . هر
قراردارند . key هایی هستند که درون یکسري key ها subkey . باشد
داراي سه entry است . هر entry داراي یک یا چند key هر : Entry – 3
بخش می باشد :
Name - نام
یکی از انواع داده هاي زیر entry مقدار هر : Data Type - نوع داده اي
است :
،REG_EXPAND_SZ ،REG_SZ ،REG_DWORD
، REG_BINARY
،REG_MULTI_SZ
REG_FULL_RESOURCE_DESCRIPTOT
Value - مقدار
!Error
نکته 1 : براي مشاهده رجیستري و اعمال تغییرات در آن ( لطفاً اگر هیچ
تجربه اي در تنظیم کردن رجیستري ندارید اطلاعات آنرا تغییر ندهید ) ،
موجود در ویندوز regedt32.exe و یا regedit.exe می توانید از برنامه
وارد کنید . Run استفاده کنید . براي اینکار کافیست نام برنامه را در کادر
نکته 2 : در قسمت دوم این مقاله کلاسی براي خواندن و نوشتن از/به
رجیستري در ویژوال بیسیک خواهم نوشت و سپس نمونه اي از
کاربردهاي نوشتن یکسري اطلاعات خاص در رجیستري را خواهیم دید .
کار با رجیستري در ویژوال بیسیک - قسمت دوم
را Registery.bas براي کار با رجیستري در ویژوال بیسیک کلاس
مطابق مطالب زیر ایجاد کرده و در پروژه هاي خود از آن استفاده کنید :
1 - تعریف ثابتهاي مورد نیاز : براي نوشتن این کلاس نیاز به تعریف
چهار دسته ثابت داریم :
هاي رجیستري : entry هاي data type - ثابتهاي مربوط به تعریف
Global Const REG_SZ As Long = 1
REG_DWORD As Long = 4 Global Const
هاي رجیستري key - ثابتهاي مربوط به تعریف
H80000000& = Global Const HKEY_CLASSES_ROOT
H80000001& = Global Const HKEY_CURRENT_USER
H80000002& = Const HKEY_LOCAL_MACHINE Global
H80000003& = Global Const HKEY_USERS
- ثابتهاي مربوط به خطاهاي کار با رجیستري
Global Const ERROR_NONE = 0
ERROR_BADDB = 1 Global Const
Global Const ERROR_BADKEY = 2
3 = Global Const ERROR_CANTOPEN
Global Const ERROR_CANTREAD = 4
5 = Global Const ERROR_CANTWRITE
Global Const ERROR_OUTOFMEMORY = 6
7 = Global Const ERROR_INVALID_PARAMETER
Global Const ERROR_ACCESS_DENIED = 8
ERROR_INVALID_PARAMETERS = 87 Global Const
Global Const ERROR_NO_MORE_ITEMS = 259
- ثابتهاي متفرقه
H3F& = Global Const KEY_ALL_ACCESS
Const REG_OPTION_NON_VOLATILE = 0 Global
هاي مورد نیاز : براي کار با رجیستري از توابع Api کردن Declare - 2
استفاده می کنیم . این توابع عبارتند از : Advapi32.dll کتابخانه
key مربوط به یک handle آزاد کردن : RegCloseKey - تابع
ByVal ) "Declare Function RegCloseKey Lib "advapi32.dll
hKey As Long) As Long
key در رجیستري ( اگر key ساخت یک : RegCreateKeyEx - تابع
قبلا وجود داشته باشد ، این تابع آنرا باز می کند ) :
"Declare Function RegCreateKeyEx Lib "advapi32.dll
Alias "RegCreateKeyExA" (ByVal hKey As Long, ByVal
Reserved As Long, ByVal lpSubKey As String, ByVal
lpClass As String, ByVal dwOptions As Long, ByVal
samDesired As Long, ByVal lpSecurityAttributes As Long,
lpdwDisposition As Long) As Long ,phkResult As Long
key باز کردن یک : RegOpenKeyEx - تابع
"Declare Function RegOpenKeyEx Lib "advapi32.dll
Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal
ulOptions As Long, ByVal lpSubKey As String, ByVal
samDesired As Long, phkResult As Long) As Long
ي یک نام data و type استخراج : RegQueryValueExLong - تابع
باز شده key متناظر با یک
Declare Function RegQueryValueExString Lib
advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey "
As String, ByVal As Long, ByVal lpValueName
lpReserved As Long, lpType As Long, ByVal lpData As
lpcbData As Long) As Long ,String
Declare Function RegQueryValueExLong Lib
advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey "
As String, ByVal As Long, ByVal lpValueName
lpReserved As Long, lpType As Long, lpData As Long,
Long) As Long lpcbData As
Declare Function RegQueryValueExNULL Lib
advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey "
As String, ByVal As Long, ByVal lpValueName
lpReserved As Long, lpType As Long, ByVal lpData As
lpcbData As Long) As Long ,Long
یک کلید باز value ذخیره یک مقدار در فیلد : RegSetValueEx - تابع
Declare Function RegSetValueExString Lib
advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As "
String, ByVal Reserved As Long, ByVal lpValueName As
,Long, ByVal dwType As Long, ByVal lpValue As String
ByVal cbData As Long) As Long
advapi32.dll" " Declare Function RegSetValueExLong Lib
Alias "RegSetValueExA" (ByVal hKey As Long, ByVal
String, ByVal Reserved As Long, ByVal lpValueName As
cbData As dwType As Long, lpValue As Long, ByVal
Long) As Long
پاك کردن یک کلید و کلیه اطلاعات مرتبط با : RegDeleteKey - تابع
آن
Lib &Private Declare Function RegDeleteKey
advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As "
(String Long, ByVal lpSubKey As
key حذف مقدار یک : RegDeleteValue - تابع
Lib &Private Declare Function RegDeleteValue
advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As "
(String Long, ByVal lpValueName As
3 - توابع کمکی : براي نوشتن توابع اصلی کار با رجیستري نیاز به
نوشتن توابع کمکی زیر است :
با توجه به نوع داده یک کلید ، مقدار موجود در : SetValueEx - تابع
آنرا در یک متغیر ذخیره می کند :
,Public Function SetValueEx(ByVal hKey As Long
sValueName As String, lType As Long, vValue As
Variant) As Long
Long Dim lValue As
Dim sValue As String
Select Case lType
is string Case REG_SZ ' type of value
sValue = vValue
sValueName, ,SetValueEx = RegSetValueExString(hKey
lType, sValue, Len(sValue))x ,&0
value is Double word Case REG_DWORD ' type of
lValue = vValue
sValueName, ,SetValueEx = RegSetValueExLong(hKey
lType, lValue, 4)x ,&0
End Select
End Function
سایز و نوع داده اي یک داده را که باید : QueryValueEx - تابع
خوانده شود مشخص می کند .
Function QueryValueEx(ByVal lhKey As Long, ByVal
szValueName As String, vValue As Variant) As Long
Dim cch As Long
As Long Dim lrc
Dim lType As Long
Dim lValue As Long
String Dim sValue As
,&lrc = RegQueryValueExNULL(lhKey, szValueName, 0
cch)x ,&lType, 0
Select Case lType
For strings '
:Case REG_SZ
String(cch, 0)x = sValue
,&lrc = RegQueryValueExString(lhKey, szValueName, 0
lType, sValue, cch)x
If lrc = ERROR_NONE Then
cch)x ,vValue = Left$(sValue
Else
vValue = Empty
End If
For DWORDS '
:REG_DWORD Case
,&lrc = RegQueryValueExLong(lhKey, szValueName, 0
lValue, cch)x ,lType
If lrc = ERROR_NONE Then vValue = lValue
Case Else
other data types not supported all'
lrc = -1
Select End
:QueryValueExExit
QueryValueEx = lrc
Function Exit
:QueryValueExError
Resume QueryValueExExit
Function End
4 - توابع اصلی : توابع مربوط به پاك کردن یک کلید از رجیستري ،
ساخت یک کلید جدید در رجیستري و مقداردهی به یک کلید :
این تابع یک کلید از رجیستري را حذف می کند . : DeleteKey - تابع
داراي دو پارامتر ورودي است :
،HKEY_CLASSES_ROOT که یکی از مقادیر Location
HKEY_CURRENT_USER
است . HKEY_USERS و یا HKEY_LOCAL_MACHINE ،
که نام کلیدي است که باید از رجیستري حذف شود . این KeyName
Key1\SubKey هایی نیز باشد مثلا 1 subkey کلید ممکنست شامل
,Public Function DeleteKey(lPredefinedKey As Long
sKeyName As String)x
Dim lRetVal As Long
RegDeleteKey(lPredefinedKey, sKeyName)x = lRetVal
value DeleteKey = lRetVal ' return function
End Function
را از کلید حذف می کند . entry این تابع یک : DeleteValue - تابع
و KeyName ،Location : داراي سه پارامتر ورودي است
را مشخص می کند . value که نام آن ValueName
,Public Function DeleteValue(lPredefinedKey As Long
x(sKeyName As String, sValueName As String
Dim lRetVal As Long
As Long Dim hKey
lRetVal = RegOpenKeyEx(lPredefinedKey, sKeyName, 0,
hKey)x ,KEY_ALL_ACCESS
lRetVal = RegDeleteValue(hKey, sValueName)x
hKey)x) RegCloseKey
DeleteValue = lRetVal
End Function
این تابع یک کلید جدید ایجاد می کند . داراي : CreateNewKey - تابع
KeyName و Location : دو پارامتر ورودي است
,Public Function CreateNewKey(lPredefinedKey As Long
sNewKeyName As String)x
Dim hNewKey As Long
Dim lRetVal As Long
lRetVal = RegCreateKeyEx(lPredefinedKey,
,vbNullString ,&sNewKeyName, 0
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,
lRetVal)x ,hNewKey ,&0
RegCloseKey (hNewKey)x
CreateNewKey = lRetVal
Function End
را تنظیم می entry یک data این تابع پارامتر : SetKeyValue - تابع
،KeyName ،Location : کند . داراي 5 پارامتر ورودي است
ValueType و ValueSetting ،ValueName
,Public Function SetKeyValue(lPredefinedKey As Long
sKeyName As String, sValueName As String,
As Long)x vValueSetting As Variant, lValueType
Dim lRetVal As Long
Dim hKey As Long
RegOpenKeyEx(lPredefinedKey, sKeyName, 0, = lRetVal
KEY_ALL_ACCESS, hKey)x
SetValueEx(hKey, sValueName, lValueType, = lRetVal
vValueSetting)x
hKey)x) RegCloseKey
SetKeyValue = lRetVal
End Function
را برمی گرداند . entry این تابع فیلد داده یک : QueryValue - تابع
و KeyName ، Location : داراي سه پارامتر ورودي است
ValueName
,Public Function QueryValue(lPredefinedKey As Long
sKeyName As String, sValueName As String)x
Dim lRetVal As Long
As Long Dim hKey
Dim vValue As Variant
sKeyName, 0, ,lRetVal = RegOpenKeyEx(lPredefinedKey
KEY_ALL_ACCESS, hKey)x
vValue)x ,lRetVal = QueryValueEx(hKey, sValueName
QueryValue = vValue
RegCloseKey (hKey)x
End
Function
کار با رجیستري در ویژوال بیسیک - قسمت سوم
به یک برنامه File Association ساخت یک انتصاب فایل یا
در این درس می خواهم با استفاده از کلاسی که در درس قبل معرفی شد
تابعی بسازیم که توسط آن بتوانیم فایلهاي با پسوندي مشخص را به
یک برنامه اختصاص دهیم . بعبارت دیگر تابعی بنویسیم که اطلاعات
را توسط برنامه xxx لازم براي باز شدن فایلهایی با پسوند
در رجیستري ثبت کند . MyApp.exe
,Public Sub CreateAssociation(***tension As String
sApplication As String, sAppPath As String)x
String Dim sPath, sAppExe As
***tension, & "." CreateNewKey
HKEY_CLASSES_ROOT
***tension, & "." ,HKEY_CLASSES_ROOT SetKeyValue
REG_SZ ,"Document." & "", sApplication
& CreateNewKey sApplication
,"Document\shell\open\command."
HKEY_CLASSES_ROOT
& SetKeyValue HKEY_CLASSES_ROOT, sApplication
Document", REG_SZ " & Document", "", sApplication."
x"1% " & sPath = sAppPath
exe"x." & sAppExe = sApplication
&HKEY_CLASSES_ROOT, sApplication SetKeyValue
REG_SZ ,Document\shell\open\command", "", sPath."
CreateNewKey
"
Software\Microsoft\Windows\CurrentVersion\Explorer \Fi
***tension, HKEY_CURRENT_USER & ".\leExts
,SetKeyValue HKEY_CURRENT_USER
"
Software\Microsoft\Windows\CurrentVersion\Explorer \Fi
***tension, "Application", sAppExe, REG_SZ & ".\leExts
& sAppExe & "\CreateNewKey "Applications
shell\open\command", HKEY_CLASSES_ROOT\"
"\HKEY_CLASSES_ROOT, "Applications SetKeyValue
sPath, REG_SZ ,"" ,"shell\open\command\" & sAppExe &
End Sub
کاربرد این تابع بصورت زیر است :
CreateAssociation("xxx","MyApp","c:\MyApp.exe")x
کار با رجیستري در ویژوال بیسیک - قسمت چهارم
اجرا شدن یک برنامه در هنگام راه اندازي سیستم
فرض کنید می خواهیم برنامه اي بنویسیم که هر بار در هنگام راه
startup اندازي سیستم بطور خودکار اجرا شود. البته نمی خواهم در
ویندوز دیده شود .
رجیستري قرار دهیم StartUp براي این کار باید برنامه موردنظر را در
. به این ترتیب که در یکی از کلیدهاي زیر یک مقدار رشته اي
ایجاد کنیم و آدرس برنامه را در آن وارد کنیم : (String Value) جدید
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windo
ws\CurrentVersion\Run
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Win
dows\CurrentVersion\Run
و مسیرش MyApp براي مثال اگه اسم برنامه مورد نظر
است باید بصورت زیر عمل کرد : C:\Windows\MyApp.exe
,SetKeyValue HKEY_LOCAL_MACHINE
SOFTWARE\Microsoft\Windows\CurrentVersion\Run", "
REG_SZ ,""MyApp", "C:\MyApp.exe
نکته : البته دو تا راه دیگر براي اینکار وجود دارد که برخی تروجان ها هم
از این روشها استفاده می کنند تا روي سیستم باقی بمانند :
و دیگري استفاده run = و نوشتن نام فایل جلوي win.ini یکی استفاده از
. explorer.exe و نوشتن نام برنامه جلوي خط system.ini از [/size]