注册表函数

 
Win 95 NT 的注册数据库 (Registry) 是系统中非常重要的组成部分。在 Win32 API 中有一组 Reg 函数来处理这些问题。其一般的读写过程如下:
    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 类读写注册表。

    
打开注册键
    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("
设定失败 : 目标位置不存在这样的键 !");
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值