?? 12.7.2 注冊表訪問示例及本章小結.txt
字號:
12.7.2 注冊表訪問示例
下面,我們就在File程序中實現對注冊表的訪問。先將CFileApp類的lnitInstance函數中先前添加
的代碼(即如例 12-26所示代碼)注釋起來,然后為File程序的文件操作子菜單再增加兩個菜單項,
井為CFileView類增加這兩個菜單項的命令消息響應,其E、名稱,以及響應函數名如表12.13所示。
表12.13為注冊表操作增加的菜單項
寫注冊表 讀注冊表 菜單項名稱 ID IDM REG WRITE IDM_REG_READ OnRegWrite OnRegRead 響
應函數
~...... 1477
第12章首先,我們在 OnRegWrite函數中添加寫注冊表操作的實現代碼,結果如例 12-27所示。侈IJ
12-27
1. void CFi1eView : :OnRegWrite()
2. {
3. // TODO : Add your command handler code here
4. HKEY hKey;
5. RegCreateKey(HKEY_LOCAL_MACHINE , "Software\\http: //www.sunxin.org\\admi n" , &hKey) ;
6. RegSetValue (hKey , NULL , REG_SZ , "zhangsan" , strlen ("zhangsan")) ;
7. RegCloseKey(hKey) ;
8. }
在如例 12-27所示的代碼中,首先定義了一個注冊表項句柄變量:hkey,接著調用 RegCreateKey函
數創建一個注冊表項。這里需要提醒讀者注意的是,在向注冊表中寫入軟件信息時,通常都是在
EKEY-LOCAL-MACEmE分支下寫入的。 RegCreateKey函數的第二個參數是指定注冊表項的子工頁,本
例是: So丘ware\http://www.sunxin.org\admin。
接下來,就利用 RegSetValue函數設置注冊表項的值,本例是設置指定項的默認或者沒有名字的值
的數據,將其值設置為字符串類型的"zhangsan "。最后,當不再需要訪問注冊表項時,調用
RegCloseKey函數關閉相應的注冊表項句
柄。
運行File程序,單擊【文件操作\寫注冊表】菜單項。然后打開注冊表編輯器,將可
以看到 HKEY_LOCAL_MACHINE\Software分支下多了一個注冊表項: http://www.
suruin-org。打開該項,將可以看到其下還有一個子項: admin,并且可以看到程序為該子項寫入的
默認值的數據是: zhangsan,值的類型為 REG SZ,即字符串類型,如圖 12.19所示。
!rII注翩翩囂明l
注冊'陽~董著ω收回陽f),陰陽
,飛 CNNIC
自口Creel:陰 Tech
REG sz 由西咱.onE巳Crystel國d制盲白白Descr~1on I
Ll DivX~院:G . 1
囪{臼惜W劇-p配:I<.ord
白白http:/陽惻SU1Xin叫
臼Ir回翩翩
.
圖 12.19向注冊表中寫六字符串類型的值
接下來,我們在 File程序中添加代碼以讀取剛才寫入注冊表的數據,這時可以在 OnRegRead函數中
添加如例 12-28所示的實現代碼。
,
478 I ~~
vc忡深λ詳解
1JIJ 12-28
void CFileV工ew: :OnRegRead ( )
11 TODO : Add your command handler code here
LONG lValue;
RegQueryValue(HKEY_ LOCAL_MACHINE , "Software\\http ://www .sunxin .org\\ admin " , NULL ,
&lValue);
char *pBuf=new char[lValuel ;
RegQueryValue(HKEY_LOCAL_MACHINE , "Software\\http://www .sunxin .org\\ adm工n",pBuf,
&lValue) ;
MessageBox(pBuf) ;
在如例 12-28所示的代碼中,為了獲得先前寫入注冊表的項的默認值或未命名的值的數據而調用了
兩次RegQueryVa1ue函數,第一次調用該函數后得到將要讀取的數據的長度,然后根據此長度分配用
來保存數據的內存: pBuf.因為返回的長度本身就已經包含了標識字符串終止的空字符,因此就不需
要再多分配一個字節了。接下來,再次調用 RegQueryVa1ue函數,就得到了所需數據。最后,調用
MessageBox函數將讀取到的數據顯示出來。因為 pBuf指向的字符串中已經包含了表示終止的空字
符,所以不需要再對該字符串進行添加表示終止字符的處理了。.
運行File程序,單擊【文件操作\讀注冊表】菜單項,從程序彈出的消息框中將可以看到讀取到的數
據是正確的。
上面對注冊表的操作中,寫入數據和讀取數據都是針對字符串類型的數據進行的,在實際應用中,
有時可能還需要寫入或讀取其他類型的數據,例如整型,此時在寫入數據時就需要調用另一個函數:
RegSetValueEx。下面,我們就來看看向注冊表中寫入并從注冊表中讀取整型數據的方法。在如例
12-27所示CFileView類的OnRegWrite函數的第6行代碼之后添加下述代碼,以便在指定的注冊表項下
設置指定值〈名稱為 age)的數據(30)和類型 (DWORD) :
DWORD dwAge=30;
RegSetValueEx (hKey I "age" I 0 I REG_DWORD I (CONST BYTE*) &dwAge 14) ;
這里,因為RegSetValueEx函數的第5個參數,即值的數據,需要的是CONSTBYTE*類型,而變量dwAge
是DWORD類型,因此需要進行強制轉換。另外,現在寫入的是一個整型,占據4個字節,所以在
RegSetVa1ueEx函數中將寫入數據的長度直接指定為4。 Build井運行File程序,單擊【文件操作飛
寫注冊表】菜單項。然后打開注冊表編輯器,可以看到HKEY-LOCAL-MACHmm
software\http://www.sunxin.oψadmp項下多了-個值(如圖 12.20所示),值的名稱是: age,類型
是REG_DWORD,值的數據是OxO∞∞01e,這是十六進制表示,十進制數是30。
,
~~ 1479
第12
zhar可Sen ox田X四JOle (30)
囹臼嗣晴tt-Pac陽d I 自己J http:J陽附.SU'lXI'1叫一
組黯圃囚臼Inst翩翩陰口INTEL回口K問soft
圖 12.20向注冊表中寫入DWORD類型的值 接下來,在 File程序中讀取剛才寫入注冊表的整型數據,
首先將OnRegRead函數中己有代碼注釋起來,然后添加如例 12-29所示實現代碼。例 12-29
HKEY hKey ;
RegOpenKey(HKEY_LOCAL_MACHINE , "Software\\http ://www.sunxin .org\\ admin " , &hKey} ;
DWORD dwType ;
DWORD dwValue;
DWORD dwAge ;
RegQueryValueEx(hKey , "age ", O,&dwτype, (LPBYTE}&dwAge , &dwVa lue);
CString str;
str .Format( "age=革d",dwAge};
MessageBox(str} ;
在如例 12-29所示代碼寧,首先調用 RegOpenKey函數打開指定的注冊表項
CHKEY_LOCAL_MACHINE\Software\http://www.sunxin.org\admin)。之后,調用RegQuery ValueEx
函數得到該注冊表項的值 Cage)的數據類型和數據。其中,該函數的第四個參數指向一個DWORD類型
的指針變量,用來接收返回的數據類型。另外還需要一個緩沖區來接收返回的數據,并且因為現在
接收的是一個整型數據,所以可以直接定義一下 DWORD類型的變量 CdwAge)來接收該數據:該函數的
最后一個參數: dwValue用來接收返回的數據的大小。
在如例 12-29所示代碼在接收到所需數據之后,對其進行格式化,并保存到str這個對象中,最后調
用MessageBox函數把該字符串顯示出來。運行 File程序,單擊【文件操作\讀注冊表】菜單項,從
程序彈出的消息框中(如圖
12.21所示),可以看到提示信息: age=30,表明讀取到的數據是正確的。
,r
主l
_-30
圖 12.21從注冊表中讀取整型數據的結果顯示
480 I紗"
以上就是通過 Win32API提供的函數對注冊表進行操作,上面介紹的只是其中的一部分函數,
Win32API還提供了一些以 Reg開頭的函數,讀者可以自行查看相關資料,了解這些函數。只要掌握
了這些函數的用法,就可以靈活地對注冊表進行編程了。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -