zoukankan      html  css  js  c++  java
  • 读写注册表

    读写注册表
    2003-11-3加入  来自未知  作者佚名  6条评论  点击7939
           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类读写注册表。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("设定失败:目标位置不存在这样的键!");
  • 相关阅读:
    jQuery(2)
    jQuery(1)
    underscore.js
    面向对象复习
    1.14函数复习
    面向对象(3)继承
    10.18
    1017
    js笔记二
    js笔记一
  • 原文地址:https://www.cnblogs.com/huqingyu/p/193468.html
Copyright © 2011-2022 走看看