VC VB 操作注册表API

来源:百度文库 编辑:神马文学网 时间:2024/04/29 12:29:09
读写注册表API,适用于VC也适用于VB 下面先来看一下这些和操作注册表相关的API函数。 为了方便下面的函数声明以及函数原型都是用C写的,如果要把这些API函数用于VB,只需要把函数名复制到VB带的API文本浏览器里面生成对应于VB的函数声明即可。 1、RegCloseKey()
原型:RegCloseKey(HKEY hKey)
  解释:关闭指定的注册表键,释放句柄。当对一个或多个键或值操作完成以后,需要关闭其键来进行保存操作结果,关闭一个键后,句柄变为非法,此时应释放句柄。 2、RegCreateKeyEx()
原型:LONG RegCreateKeyEx( HKEY hKey, LPCTSTR lpSubKey, DWORD Reserved,
LPTSTR lpClass, DWORD dwOptions, REGSAM samDesired, LPSECURITY_ATTRIBUTES lpSecurityAttributes,
PHKEY phkResult, LPDWORD lpdwDisposition );
  解释:打开指定的键或子键。如果要打开的键不存在的话,本函数会试图建立它。提供该函数是为了向后兼容。所有的WIN32应用程序应使用函数RegCreateKeyEx()。 各参数及返回值的含义如下:
                  hKey为主键值,可以取下面的一些数值:HKEY_CLASSES_ROOT、HKEY_CURRENT_CONFIG、   HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE、HKEY_USER、 HKEY_PERFORMANCE_DATA(WINNT操作系统)、HKEY_DYN_DATA(WIN9X操作系统);·
         参数lpSubKey为一个 指向以零结尾的字符串的指针,其中包含将要创建或打开的子键的名称。子键不可以用反斜线(\)开始。该参数可以为NULL;          参数Reserved为保留值,必须设置为0;          参数lpClass为一个指向包含键类型的字符串。如果该键已经存在,则忽略该参数;          参数dwOptions为新创建的键设置一定的属性。可以取下面的一些数值:
                  REG_OPTION_NON_VOLATILE ,表示新创建的键为一个非短暂性的键(数据信息保存在文件中,当系统重新启动时,数据信息恢复);
                  REG_OPTION_VOLATILE,表示新创建的 键为一个短暂性的键(数据信息保存在内存中),Windows95忽略该数值;
                  REG_OPTION_BACKUP_RESTORE 仅在WINNT中支持,可以提供优先级支持;          ·参数dwOptions为新创建的键设置一定的属性。可以取下面的一些数值:
                  REG_OPTION_NON_VOLATILE ,表示新创建的键为一个非短暂性的键(数据信息保存在文件中,当系统重新启动时,数据信息恢复);
                  REG_OPTION_VOLATILE,表示新创建的 键为一个短暂性的键(数据信息保存在内存中),Windows95忽略该数值;
                  REG_OPTION_BACKUP_RESTORE 仅在WINNT中支持,可以提供优先级支持;   ·参数samDesired用来设置对键访问的权限,可以取下面的一些数 值:
                  KEY_CREATE_LINK,表示准许生成符号键;
                  KEY_CREATE_SUB_KEY 表示准许生成子键;
                  KEY_ENUMERATE_SUB_KEYS 表示准许生成枚举子键;
                  KEY_EXECUTE 表示准许进行读操作;
                  KEY_NOTIFY表示准许更换通告;  
                  KEY_QUERY_VALUE 表示准许查询子键;
                  KEY_ALL_ACCESS 提供完全访问,是上面数值的组合;                   KEY_READ 是下面数值的组合: KEY_QUERY_VALUE、KEY_ENUMERATE_SUB_KEYS、KEY_NOTIFY;   KEY_SET_VALUE 表示准许设置子键的数值;
                  KEY_WRITE 是下面数值的组合:KEY_SET_VALUE、KEY_CREATE_SUB_KEY;
         ·参数lpSecurityAttributes为一个指向SECURITY_ATTRIBUTES结构的指针,确定返回的句柄是否被子处理过程继承。如果该参数为NULL,则句柄不可以被继承。在WINNT中,该参数可以为新创建的键增加安全的描述;   ·参数phkResult为一个指向新创建或打开的键的句柄的指针;   ·参数lpdwDispition指明键是被创建还是被打开的,可以是下面的一些数值:
                  REG_CREATE_NEW_KEY 表示键先前不存在,现在被创建;
                  REG_OPENED_EXISTING_KEY 表示键先前已存在,现在被打开。   如果该函数调用成功,则返回ERROR_SUCCESS。否则,返回值为文件WINERROR.h中定义的 一个非零的错误代码,可以通过设置FORMAT_MESSAGE_FROM_SYSTEM标识调用FormatMessage()函数来获取一个对错误的 总体描述。 3、RegOpenKeyEx()
原型:LONG RegOpenKeyEx(HKEY hKey, LPCTSTR lpSubKey, DWORD ulOptions,
REGSAM samDesired, PHKEY phkResult );
  解释:打开一个指定的键,并返回打开键的句柄。 各参数及返回值的含义如下:
         ·参数hKey的含义同RegCreateKeyEx函数中的hKey参数;          ·参数lpSubKey为一个指向以零结尾的字符串的指针,其中包含子键的名称,可以利用反斜线(\)分隔不同的子键名。如果字符串为空,则根据hKey参数创建一个新的句柄。在这种情况下,并不关闭先前打开的句柄;·参数ulOption保留,通常必须设置为0;          ·参数samDesired的含义同RegCreateKeyEx函数中的samDesired参数;          ·参数phkResult为一个指针,用来指向打开的键的句柄。可以通过RegCloseKey函数关闭这个句柄; ·函数的返回值同RegCreateKeyEx函数的返回值。 4、查询某一个键值:RegQueryValueEx()   原型:LONG RegQueryValueEx(HKEY hKey, LPCTSTR lpValueName, LPDWORD pReserved, LPDWORD lpType,
LPBYTE lpData, LPDWORD lpcbData );
  解释:根据要查询的键的句柄,要返回的查询的数据。   各个参数及返回值的含义如下:   ·参数hKey为当前的一个打开的键的句柄,具体数值同RegCreateKeyEx函数的hKey参数;   ·参数lpVauleName为一个指向非空的包含查询值的名称的字符串指针;   ·参数lpReserved保留,必须为NULL;   ·参数lpType为一个指向数据类型的指针,数据类型为下列类型之一:REG_BINARY 二进制数据、REG_DWORD 32位整数、REG_DWORD_LITTLE_ENDIAN little-endian格式的数据,例如0X12345678以(0X78 0X56 0X34 0X12)方式保存、REG_DWORD_BIG_ENDIAN big-endian格式的数据,例如0X12345678以(0X12 0X34 0X56 0X78)方式保存、REG_EXPAND_SZ 一个包含未扩展环境变量的字符串、REG_LINK 一个Unicode类型的链接、REG_MULIT_SZ 以两个零结尾的字符串、REG_NONE 无类型数值、REG_RESOURCE_LIST 设备驱动资源列表、REG_SZ 一个以零结尾的字符串根据函数使用的字符集类型的不同而设置为Unicode或ANSI类型的字符串;   ·参数lpData为一个指向保存返回值的变量的指针。如果不需要返回值,该参数可以为NULL;   ·参数lpcbData为一个指向保存返回值长度的变量的指针。其中长度以字节为单位。如果数据类型为 REG_SZ、REG_MULTI_SZ或REG_EXPAND_SZ,那么长度也包括结尾的零字符,只有在参数lpData为NULL时,参数 lpcbData才可以为NULL;返回值同RegCreateKeyEx函数的返回值; 5、RegSetValueEx()   原型:LONG RegSetValueEx(HKEY hKey, LPCTSTR lpValueName, LPDWORDDWORD lpReserved, dwType,
const BYTE *lpData, DWORD cbData);
  解释:设置注册表中的一个键值。   各个参数及返回值的含义如下:   ·参数hKey的含义同RegCreateKeyEx函数中的hKey参数;   ·参数lpValueName为一个指向包含值名的字符串指针;Reserved保留,通常必须设置为0;   ·参数dwType确定了设置的值的类型同RegQueryValueKeyEx的lyType参数;   ·参数lpData为一个指向包含数据的缓冲区的指针;   ·参数cbData以字节为单位,指定数据的长度;   返回值同RegCreateKeyEx函数的返回值。 6、RegDeketeKey()   原型:LONG RegDeleteKey(HKEY hKey,LPCTSTR lpSubKEY);   解释:函数RegDeketeKey删除一个键及所有的子键。   各个参数及返回值的含义如下:   ·参数hKey的含义同RegCreateKeyEx函数中的hKey参数;   ·参数lpSubKey的含义同RegCreateKeyEx函数中的lpSubKey参数 上面的这些函数组合使用就可以轻松的操作注册表了。


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("设定失败:目标位置不存在这样的键!");