Win 95及NT的注冊(cè)數(shù)據(jù)庫(kù)(Registry)是系統(tǒng)中非常重要的組成部分。在Win32 API中有一組Reg函數(shù)來(lái)處理這些問(wèn)題。其一般的讀寫(xiě)過(guò)程如下:
          ?
          ??? 1、使用RegOpenKeyEx或RegCreateKeyEx函數(shù)打開(kāi)或創(chuàng)建一個(gè)鍵;
          ??? 2、如果上一步成功,使用RegQueryValueEx讀取子鍵的值,使用RegSetValueEx設(shè)置子鍵值,使用RegEnumKey獲得所有子鍵,使用RegDeleteKey刪除一個(gè)鍵;
          ??? 3、完成操作后使用RegCloseKey關(guān)閉鍵。
          ??? 下面這段程序打開(kāi)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類(lèi)讀寫(xiě)注冊(cè)表。VB中調(diào)用API的辦法可以參考QA000226 "如何訪問(wèn)Windows系統(tǒng)注冊(cè)表"。

          ??? 打開(kāi)注冊(cè)鍵
          ??? 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,否則返回錯(cuò)誤代碼
          ?

          ??? 關(guān)閉注冊(cè)鍵
          ??? LONG RegCloseKey( HKEY hKey // handle to key to close );
          例:
          ???? RegCloseKey(HKEY_LOCAL_MACHINE);
          OR:? RegCloseKey(hd);
          建立注冊(cè)鍵
          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="";? //類(lèi)名指定為空
          ?? DWORD nbf=0;??? //接受返回值,指明是建立新鍵還是打開(kāi)已有的鍵.(經(jīng)試驗(yàn)總是返回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 指明鍵永久保留.安全結(jié)構(gòu)指明NULL,自動(dòng)獲得一默認(rèn)值
          //成功返回ERROR_SUCCESS,否則返回錯(cuò)誤代碼
          枚舉鍵值
          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];? //分配數(shù)值名稱(chēng)緩沖區(qū)
          ?? strcpy(valuename,"DeskPattern");? //隨便指定哪個(gè)鍵值名
          ?? DWORD nsize=69;? //數(shù)值名稱(chēng)緩沖區(qū)大小
          ?? DWORD k=REG_SZ;? //指明數(shù)據(jù)類(lèi)型
          ?? unsigned char vari[70]; //分配數(shù)值緩沖區(qū)
          ?? DWORD ncbvari=69; //數(shù)值緩沖區(qū)大小
          ?? dinx=0; //從0開(kāi)始

          ?? while((II=RegEnumValue(hd,dinx,valuename,&nsize,NULL,&k,vari,&ncbvari))
          ????????? != ERROR_NO_MORE_ITEMS)
          ?? {
          ?????? dinx++;//索引 +1,準(zhǔn)備取下一個(gè)值
          ?????? nsize=69; //恢復(fù)原來(lái)大小
          ?????? ncbvari=69;
          ?? }
          成功后返回值0,各變量返回后設(shè)置如下:
          valuename=數(shù)值名稱(chēng),以0結(jié)尾;如 : DeskColor
          nsize=數(shù)值名稱(chēng)長(zhǎng)度, 9
          k=REG_SZ? DeskColor 的類(lèi)型為 REG_SZ
          vari=鍵值,32768 DeskColor="32768",
          ncbvari=鍵值長(zhǎng)度 REG_SZ包括結(jié)尾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);
          變量定義及成功后各變量設(shè)置值同RegEnumValueEx
          寫(xiě)鍵值
          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下增加一個(gè)鍵值 Hello : REG_SZ : 1234567
          寫(xiě)整型變量:
          int hi=8;
          RegSetValueEx(pj,valuename,0,REG_BINARY,(unsigned char*)&hi,sizeof(int));

          成功后在Poker下增加一個(gè)鍵值 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);
          }

          ?

          以下代碼把注冊(cè)表自啟動(dòng)shell的鍵值改寫(xiě)為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("你已經(jīng)成功地將注冊(cè)表自啟動(dòng)shell的鍵值設(shè)置為C:\\DK1\\ATM\\HARP\\ExAtmShell.exe");
          else
          ::AfxMessageBox("設(shè)定失敗:目標(biāo)位置不存在這樣的鍵!");

          posted on 2009-06-16 15:36 -274°C 閱讀(1572) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): C++

          常用鏈接

          留言簿(21)

          隨筆分類(lèi)(265)

          隨筆檔案(242)

          相冊(cè)

          JAVA網(wǎng)站

          關(guān)注的Blog

          搜索

          •  

          積分與排名

          • 積分 - 916110
          • 排名 - 40

          最新評(píng)論

          主站蜘蛛池模板: 四川省| 安阳市| 溆浦县| 通城县| 乃东县| 富阳市| 大名县| 唐河县| 天水市| 无锡市| 乃东县| 元江| 南通市| 广元市| 海南省| 六盘水市| 克东县| 哈尔滨市| 江安县| 临邑县| 那坡县| 桃江县| 绵阳市| 龙泉市| 辛集市| 白玉县| 武隆县| 同江市| 油尖旺区| 察雅县| 当涂县| 五峰| 博兴县| 吉林省| 郁南县| 英吉沙县| 呼伦贝尔市| 泰兴市| 夏邑县| 兴仁县| 张北县|