1、RegOpenKey--取得SubKey的Hkey
VB声明 Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long 参数类型及说明: hKey:Key Handle lpSubKey:SubKey名称或路径 phkResult:若RegOpenKey执行成功,则这一参数返回Subkey的hKey.
返回值: =0,表示成功;≠0,表示失败。[注意这一点与别的API函数不太一样]
e.g: ret = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft", hKey)
*************************************************************************
2、RegCreateKey函数:建立SubKey VB声明 Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long 它的参数用法与RegOpenKey一样。所不同的是RegOpenKey只能打开已经有的SubKey,而RegCreateKey则可以建立SubKey,比较特别的是,如果调用RegCreateKey所建立的SubKey是一个已经存在的SubKey,则它的功能和RegOpenKey相同。由于RegCreateKey的这种特性,有的程序员干脆不用RegOpenKey,而用RegCreateKey来统一代替RegOpenKey。 e.g: ret = RegCreateKey(HKEY_LOCAL_MACHINE, "SOFTWARE\Hongqt", hKey)
*************************************************************************
3、RegClose函数:关闭SubKey Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long 当我们不再存取Registry时,将打开或建立的SubKey关闭是一个比较好的习惯,就正如我们在使用C语言的文件打开函数后必须要关闭一样。 e.g: ret = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft", hKey) .... RegClose hkey
*************************************************************************
4、RegQueryValue--读取某Key的默认值(default value)
VB声明 Declare Function RegQueryValue Lib "advapi32.dll" Alias "RegQueryValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal lpValue As String, lpcbValue As Long) As Long hKey: Key Handle lpSubKey:SubKey名称路径 lpValue:返回读取的Default Value lpcbValue:传入lpValue参数的长度,若成功读取了默认值default value,则返回default value字符串的长度(含chr(0))这个和C语言中字符串的处理相似,都是以chr(0)作为结束符。
返回值: =0,表示成功;≠0,表示失败。 e.g: ret = RegQueryValue(hKey, Subkey, "", lenS)
*************************************************************************
5、RegSetValue--删除某Key的默认值(default value)
VB声明 Declare Function RegSetValue Lib "advapi32.dll" Alias "RegSetValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long hKey:Key Handle lpSubKey:Subkey名称或路径 dwType:数据类型,但在这里只能接受REG_SZ[字符串类型] lpData:所设置的字符串 cbData:lpData字符串的长度,这一长度包括chr(0)字符。 关于dwType的可能取值 Enum ValueType REG_NONE = 0 REG_SZ = 1 REG_EXPAND_SZ = 2 REG_BINARY = 3 REG_DWORD = 4 REG_DWORD_BIG_ENDIAN = 5 REG_MULTI_SZ = 7 End Enum
Dim ret As Long, lenS As Long, S As String ret = RegSetValue(hKey, Subkey, REG_SZ, Value, LenB(StrConv(Value, vbFromUnicode)) + 1) SetDefaultValue = (ret = 0) End Function
*************************************************************************
6、RegQueryValueEx--读取某Key的特定名称的值(Value) Vb声明和参数解释: Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long hkey:Key Handle lpValueName:Value Name lpReserved:保留参数,调用时设置为0即可 lpType:返回读取的数据类型 lpData:返回读取的数据 lpcbData:传入lpData数据的长度,若成功读取数据,则返回所读取的数据的长度。 返回值: =0,表示成功;≠0,表示失败。 说明: 1、 这一函数除了可读取指定名称的值之外,也可以读取default value。如果要读取default value,只需要将 参数lpValueName设置为""[空字符串]即可。 2、lpType 的可能取值 Enum ValueType REG_NONE = 0 REG_SZ = 1 -->字符串 REG_EXPAND_SZ = 2 -->可展开式字符串 REG_BINARY = 3 -->Binary数据 REG_DWORD = 4 -->长整数 REG_DWORD_BIG_ENDIAN = 5 -->BIG_ENDIAN长整数 REG_MULTI_SZ = 7 -->多重字符串 End Enum
e.g: Dim hKey As Long, ret As Long, lenData As Long, typeData As Long Dim Name As String '读取HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run的internat.exe的value. Name="internat.exe" ret=RegOpenKey(HKEY_LOCAL_MACHINE,"Software\Microsoft\Windows\CurrentVersion\Run", hKey) if ret=0 then ret = RegQueryValueEx(hKey, Name, 0, typeData, ByVal vbNullString, lenData)'注意ByVal千万别忘了 end if
*************************************************************************
7、RegEnumValue--列出某Key的所有名称的值
Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, lpReserved As Long, lpType As Long, lpData As Byte, lpcbData As Long) As Long '以下的两个函数是经过王国荣老师改编过的函数,与此相关,也一并列出.并且在我们的例子程序中要用到它们。RegEnumValueAsAny可以传入长整数和字符串;RegEnumValueAsAny2中lpData参数被改成Any后,可以使用Byte数组,由于Byte数组是采用”传地址方式来传递参数的,可以省下复制字符串数据的时间,使得程序变得更加高效。 Declare Function RegEnumValueAsAny Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
lpcbValueName As Long, lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long 参数说明: hKey:Key Handle dwIndex:欲读取之名称的顺序 lpValueName:返回所读取的名称 lpcbValueName:传入lpValueName参数的长度,返回所读取的名称的长度,注意这一长度不含chr(0) lpReserved:保留参数,实际使用时传入ByVal 0即可 lpType:返回所读取的数据类型 lpData:返回所读取的数据 lpcbData:传入lpData,返回所读取的数据长度 返回值: =0,表示成功;≠0,表示失败。
调用例子: ret=0 myindex=0 while ret=0 ret=RegEnumValue(hkey,myindex,Name,ByVal 0, typeData, ByVal vbNullString, lenData) myindex=myindex+1 wend
*************************************************************************
8、RegSetValueEx--设置某Key特定名称的值(Value)
Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long 参数: hKey:Key Handle lpValueName:Value名称 Reserved:保留参数,具体使用时置为0即可 dwType:数据类型 lpData:所设置的数据,注意这一参数被定义成lpData As Any,所以要传入字符串数据时别忘了在参数前加保留字ByVal cbData:数据的长度。注意:如果写入的数据属于REG_SZ、REG_EXPAND_SZ、REG_MULTI_SZ类型时,则这个长度应该包含chr(0)字符。 返回值: =0,表示成功;≠0,表示失败。 e.g: Dim hKey As Long Dim L As Long L = 99999 RegCreateKey HKEY_CURRENT_USER, "Software\SetValue", hKey RegSetValueEx hKey, "LongData", 0, REG_DWORD, L, 4
*************************************************************************
9、RegDeleteValue--删除某Key的某一名称
Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" _ ( _ ByVal hKey As Long, _ ByVal lpValueName As String _ ) As Long '删除一个键值
VC代码示例
1、使用RegOpenKeyEx或RegCreateKeyEx函数打开或创建一个键; 2、如果上一步成功,使用RegQueryValueEx读取子键的值,使用RegSetValueEx设置子键值,使用RegEnumKey获得所有子键,使用RegDeleteKey删除一个键; 3、完成操作后使用RegCloseKey关闭键。 下面这段程序打开HKEY_CURRENT_USER\Software\Zeal SoftStudio\AskPro FTP\LastTime键,然后读取WOL子键的值。
HKEY hkey; char sz[256]; DWORD dwtype, sl = 256;
RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Zeal SoftStudio\\AskPro FTP\\LastTime", NULL, KEY_ALL_ACCESS, &hkey); RegQueryValueEx(hkey, "WOL", NULL, &dwtype, (LPBYTE)sz, &sl); RegCloseKey(hkey); MFC程序可以使用CRegKey类读写注册表。VB中调用API的办法可以参考QA000226 "如何访问Windows系统注册表"。
打开注册键 LONG RegOpenKeyEx( HKEY hKey, // handle to open key
LPCTSTR lpSubKey, // address of name of subkey to open DWORD ulOptions, // reserved =0 REGSAM samDesired, // security access mask PHKEY phkResult // address of handle to open key );
例: HKEY hd; hd=HKEY_LOCAL_MACHINE; char* Regkeyname="SoftWare\\Xy123\\Poker\\"; LONG a=RegOpenKeyEx(hd,Regkeyname,0,KEY_READ, &hd); //成功返回ERROR_SUCCESS,否则返回错误代码
关闭注册键 LONG RegCloseKey( HKEY hKey // handle to key to close ); 例: RegCloseKey(HKEY_LOCAL_MACHINE); OR: RegCloseKey(hd); 建立注册键 LONG RegCreateKeyEx( HKEY hKey, // handle to an open key LPCTSTR lpSubKey, // address of subkey name DWORD Reserved, // reserved =0 LPTSTR lpClass, // address of class string DWORD dwOptions, // special options flag REGSAM samDesired, // desired security access
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // address of key security structure PHKEY phkResult, // address of buffer for opened handle LPDWORD lpdwDisposition // address of disposition value buffer ); 例: char *sclass=""; //类名指定为空 DWORD nbf=0; //接受返回值,指明是建立新键还是打开已有的键.(经试验总是返回REG_OPENED_EXISTING_KEY. LONG II=RegCreateKeyEx(hd,Regkeyname,0,sclass,REG_OPTION_NON_VOLATILE, KEY_READ|KEY_WRITE,NULL,&hd,&nbf);
//REG_OPTION_NON_VOLATILE 指明键永久保留.安全结构指明NULL,自动获得一默认值 //成功返回ERROR_SUCCESS,否则返回错误代码 枚举键值 LONG RegEnumValue( HKEY hKey, // handle to key to query DWORD dwIndex, // index of value to query LPTSTR lpValueName, // address of buffer for value string LPDWORD lpcbValueName, // address for size of value buffer LPDWORD lpReserved, // reserved =NULL LPDWORD lpType, // address of buffer for type code
LPBYTE lpData, // address of buffer for value data LPDWORD lpcbData // address for size of data buffer); 例: DWORD dinx=0; char valuename[70]; //分配数值名称缓冲区 strcpy(valuename,"DeskPattern"); //随便指定哪个键值名 DWORD nsize=69; //数值名称缓冲区大小 DWORD k=REG_SZ; //指明数据类型 unsigned char vari[70]; //分配数值缓冲区 DWORD ncbvari=69; //数值缓冲区大小 dinx=0; //从0开始
while((II=RegEnumValue(hd,dinx,valuename,&nsize,NULL,&k,vari,&ncbvari)) != ERROR_NO_MORE_ITEMS) { dinx++;//索引 +1,准备取下一个值 nsize=69; //恢复原来大小 ncbvari=69; } 成功后返回值0,各变量返回后设置如下: valuename=数值名称,以0结尾;如 : DeskColor nsize=数值名称长度, 9 k=REG_SZ DeskColor 的类型为 REG_SZ vari=键值,32768 DeskColor="32768", ncbvari=键值长度 REG_SZ包括结尾0,=6, 读取键值 LONG RegQueryValueEx( HKEY hKey, // handle to key to query
LPTSTR lpValueName, // address of name of value to query LPDWORD lpReserved, // reserved LPDWORD lpType, // address of buffer for value type LPBYTE lpData, // address of data buffer LPDWORD lpcbData // address of data buffer size ); 例: RegQueryValueEx(hd,valuename,NULL,&k,vari,&ncbvari); 变量定义及成功后各变量设置值同RegEnumValueEx 写键值 LONG RegSetValueEx( HKEY hKey, // handle to key to set value for LPCTSTR lpValueName, // name of the value to set
DWORD Reserved, // reserved DWORD dwType, // flag for value type CONST BYTE *lpData, // address of value data DWORD cbData // size of value data ); 例: strcpy(valuename,"Hello"); unsigned char vari[10]; DWORD k=REG_SZ; strcpy((char*)vari,"1234567") RegSetValueEx(hd,valuename,0,k,vari,7); 成功后在Poker下增加一个键值 Hello : REG_SZ : 1234567 写整型变量: int hi=8; RegSetValueEx(pj,valuename,0,REG_BINARY,(unsigned char*)&hi,sizeof(int));
成功后在Poker下增加一个键值 Hello2 : REG_BINARY :08 00 00 00
void AddEventSource() { HKEY hk; DWORD dwData; UCHAR szBuf[80];
// Add your source name as a subkey under the Application // key in the EventLog registry key.
if (RegCreateKey(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\ \\EventLog\\Application\\SamplApp", &hk)) ErrorExit("Could not create the registry key.");
// Set the name of the message file.
strcpy(szBuf, "%SystemRoot%\\System\\SamplApp.dll");
// Add the name to the EventMessageFile subkey.
if (RegSetValueEx(hk, // subkey handle "EventMessageFile", // value name 0, // must be zero REG_EXPAND_SZ, // value type (LPBYTE) szBuf, // pointer to value data strlen(szBuf) + 1)) // length of value data
ErrorExit("Could not set the event message file.");
// Set the supported event types in the TypesSupported subkey.
dwData = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | EVENTLOG_INFORMATION_TYPE;
if (RegSetValueEx(hk, // subkey handle "TypesSupported", // value name 0, // must be zero REG_DWORD, // value type (LPBYTE) &dwData, // pointer to value data
sizeof(DWORD))) // length of value data ErrorExit("Could not set the supported types.");
RegCloseKey(hk); }
以下代码把注册表自启动shell的键值改写为C:\DK1\ATM\HARP\ExAtmShell.exe:
HKEY hkey; LONG res; DWORD datatype=REG_SZ; unsigned char szvalue[_MAX_PATH]; strcpy((char*)szvalue,"C:\\DK1\\ATM\\HARP\\ExAtmShell.exe");
res =::RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\", 0, KEY_WRITE|KEY_READ, &hkey);
if(res!=ERROR_SUCCESS) { AfxMessageBox("aaa"); return; } res = ::RegSetValueEx(hkey, "Shell", 0, datatype, szvalue, strlen(LPCSTR(szvalue)));
RegCloseKey(hkey); if(res==ERROR_SUCCESS) ::AfxMessageBox("你已经成功地将注册表自启动shell的键值设置为C:\\DK1\\ATM\\HARP\\ExAtmShell.exe"); else ::AfxMessageBox("设定失败:目标位置不存在这样的键!");
|