CRegKey 注冊表操作

1.簡介

CRegKey提供了對系統注冊表的操作方法,通過CRegKey類,可以方便的打開注冊表的某個分支或子鍵(CRegKey::Open),可以方便的修改一個鍵的鍵值(CRegKey::SetValue),也可以查詢某個鍵的鍵值(CRegKey::QueryValue),操作完成之后,可以關閉子鍵(CRegKey::Close)。

要想使用CRegKey類,需要包含頭文件atlbase.h

2.常用操作方法

1) 打開需要查詢或修改的注冊表鍵

LONG Open( HKEY hKeyParent, LPCTSTR lpszKeyName, REGSAM samDesired = KEY_ALL_ACCESS );

hKeyParent參數指定了待打開的注冊表鍵的句柄,常用的可選值為

HKEY_CLASSES_ROOT

HKEY_CURRENT_USER

HKEY_LOCAL_MACHINE

HKEY_USERS

以上四個值分別代表了注冊表中最主要的四個分支;

lpszKeyName參數指定了在hKeyParent下需要打開的項的名字;

samDesired參數指定了打開該項后所擁有的權限,默認為KEY_ALL_ACCESS,表示擁有對該分支的所有操作權,包括讀和寫等。

?

舉例:

   1: CRegKey myKey;
   2: if(myKey.Open(HKEY_LOCAL_MACHINE, "SOFTWARE//Microsoft//Windows") != ERROR_SUCCESS)
   3: {
   4:     AfxMessageBox("Error open reg key!!");
   5: }

?

2) 查詢注冊表項中的某個鍵的鍵值

LONG QueryValue( DWORD& dwValue, LPCTSTR lpszValueName );

LONG QueryValue( LPTSTR szValue, LPCTSTR lpszValueName, DWORD* pdwCount )

查詢鍵值提供了兩種形式,分別用來獲取數值類型的值和字符串類型的值。在上面的形式中,第一種用于獲取數值類型的值,第二種用于獲取字符串類型的值。

lpszValueName參數用來指定鍵的名稱,dwValue和szValue用于保存鍵值,而pdwCount用來控制獲取到的字符串值的長度

?

舉例:

比如,假設要獲得windowx系統默認的桌面壁紙的搜索路徑,由于這個路徑保存在HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion這一項的WallPaperDir鍵內,如下圖

image

所以,可以用以下的代碼來實現:

   1: CRegKey myKey;
   2: if(myKey.Open(HKEY_LOCAL_MACHINE, "SOFTWARE//Microsoft//Windows//CurrentVersion") != ERROR_SUCCESS)
   3:     AfxMessageBox("Error open reg key!!!");
   4: else
   5: {
   6:     char szPath[MAX_PATH];
   7:     DWORD dwLen = myKey.QueryValue(szPath, "WallPaperDir", MAX_PATH);
   8: }

另外,如果我們想查詢某個項的默認鍵值該怎么辦呢?只需要將lpszValueName參數寫為空字符串就好了。比如現在想看一下.txt類型的文件的關聯程序是誰,我們需要首先在HKEY_CLASSES_ROOT下找到.txt項,然后看它的默認鍵值是多少:

image

示例代碼如下:

   1: CRegKey myKey;
   2: if(myKey.Open(HKEY_CLASSES_ROOT, ".txt") != ERROR_SUCCESS)
   3:     AfxMessageBox("Error open key!!!");
   4: else
   5: {
   6:     char szFileType[255];
   7:     DWORD dwLen = myKey.QueryValue(szFileType, "", sizeof(szFileType));
   8: }

3) 添加或修改鍵值

LONG SetValue( DWORD dwValue, LPCTSTR lpszValueName );

LONG SetValue( LPCTSTR lpszValue, LPCTSTR lpszValueName = NULL );

LONG SetValue( HKEY hKeyParent, LPCTSTR lpszKeyName, LPCTSTR lpszValue, LPCTSTR lpszValueName = NULL );

添加鍵值函數提供了三種形式,前兩種分別用來向當前已經打開的這個項中添加DWORD類型的鍵、字符串類型的鍵,最后一種形式的函數,可以在某個特定的分支線下的某個特定的項內添加一個鍵。如果lpszKeyName指定的鍵不存在,則添加這個鍵,否則,就是修改已經存在的鍵的鍵值。另外需要注意的是,最后一種形式的SetValue函數,如果lpszKeyName所指定的項不存在,則SetValue函數會返回錯誤,而不會添加一個項。

示例,比如現在要給IE的工具欄設置一個背景圖片,可以在HKEY_CURRENT_USER/Software/Microsoft/Internet Explorer/Toolbar項下面新建一個BackBitmap的字符串鍵,并制定背景圖片的位置,代碼如下:

   1: CRegKey myKey;
   2: if(myKey.Open(HKEY_CURRENT_USER, "Software//Microsoft//Internet Explorer//Toolbar") != ERROR_SUCCESS)
   3:     AfxMessageBox("error open reg key!!!");
   4: else
   5: {
   6:     myKey.SetValue("C://WINDOWS//Web//Wallpaper//Bliss.bmp", "BackBitmap");
   7: }

這樣,IE的背景圖片就被設置成了C:/WINDOWS/Web/Wallpaper/Bliss.bmp

4) 刪除鍵值

LONG DeleteValue( LPCTSTR lpszValue );

這個函數比較簡單,它會刪除lpszValue參數指定的鍵。

?

5) 新建項

LONG Create( HKEY hKeyParent, LPCTSTR lpszKeyName, LPTSTR lpszClass = REG_NONE, DWORD dwOptions = REG_OPTION_NON_VOLATILE, REGSAM samDesired = KEY_ALL_ACCESS, LPSECURITY_ATTRIBUTES lpSecAttr = NULL, LPDWORD lpdwDisposition = NULL );

Create函數用于創建一個項,它可以在hKeyParent指定的分支下,創建一個名為lpszKeyName的項,后面幾個參數一般用默認的即可。

比如,現在要建立一個新的文件類型.spj的關聯方式,首先需要在HKEY_CLASSES_ROOT下建立一個名為.spj的項,代碼如下:

   1: CRegKey myKey;
   2: if(myKey.Create(HKEY_CLASSES_ROOT, ".spj") != ERROR_SUCCESS)
   3:     AfxMessageBox("error create key!!!");
   4: else
   5:     AfxMessageBox("create key ok!");

6) 刪除項

LONG DeleteSubKey( LPCTSTR lpszSubKey );

該函數可以刪除名為lpszSubKey的項,以及該項下的所有的鍵。注意,被刪除的項不能含有子項!可以通過另外一個函數LONG RecurseDeleteKey( LPCTSTR lpszKey );刪除某個項以及該項下的所有內容。

?

7) 關閉注冊表

LONG Close( );

關閉注冊表時,之前所做的修改才會被保存到硬盤。或者,也可以使用LONG RegFlushKey( HKEY hKey ); 函數在需要的時候將所做的修改及時寫入硬盤。?

8


CRegkey::Creat(HKEY hKeyParent, LPCTSTRlpszKeyName, LPTSTRlpszClass = REG_NONE,DWORD dwOptions = REG_OPTION_NON_VOLATILE, REGSAMsamDesired= KEY_ALL_ACCESS, LPSECURITY_ATTRIBUTESlpSecAttr = NULL, LPDWORD lpdwDisposition =NULL):? 創建新的key.
一般只用添加前兩個值。
CRegKey::SetValue(DWORD dwValue, LPCTSTRlpszValueName); 設置值。
CRegKey::SetValue(LPCTSTR lpszKeyName, LPCTSTRlpszValue, LPCTSTRlpszValueName);在當前打開的文件夾下在設置個lpszKeyName文件夾,名是lpszValueName的數據lpszValue。
例如:CRegKey rKey;
????if(rKey.Creat(HKEY_CURRENT_USER,"XZX\\4")==ERROR_SUCESS)
??????if(rk.SetValue(123,"name")==ERROR_SUCCESS)
???????{
???????AfxMessageBox("Successful!");
????????rk.Close();
?????????}
remark:在根為?HKEY_CURRENT_USER的下面創建XZX\\4路徑,4下面有名是name的數據123。???????????????????????????????????????????????????????CRegKey::Open(HKEYhKeyParent, LPCTSTRlpszKeyName, REGSAMsamDesired =KEY_ALL_ACCESS);???打開路徑。
CRegKey::DeleteValue(LPCTSTR lpszValue):刪除打開路徑下邊的值。
例如:if(rKey.Open(HKEY_CURRENT_USER,"XZX\\4")==ERROR_SUCESS)
???????if(rKey.DeleteValue("name")==ERROR_SUCESS)
????????AfxMessageBox("CreatSucessful!!?");
????????rKey.Close();
CRegKey::DeleteSubKey(LPCTSTR lpszSubKey):刪除SubKey。
例如? if(rk.Open(HKEY_CURRENT_USER,"XZX")==ERROR_SUCCESS)
??? if(rk.DeleteSubKey("4")==ERROR_SUCCESS)
??? {
????AfxMessageBox("sucess!");
???}
?注意:打開要刪除的父文件夾,并且刪除的文件下面沒有值。
另一種方法:
DWORD CTools::ReadReg(char *szName,LPCTSTRszValue)
{//szName這個注冊表名。?把值存到szValue。
?DWORD dwRes=1;
?HKEY hKey;
?if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
??g_szFullKey,
??NULL,KEY_ALL_ACCESS,&hKey)!=ERROR_SUCCESS)
??return FALSE;
?
?DWORDdwType,dwLen=SHORT_LEN;??
?
?if(RegQueryValueEx(hKey,szName,NULL,&dwType,(BYTE*)szValue,&dwLen)!=ERROR_SUCCESS)
??dwRes=0;
?if(RegCloseKey(hKey)!=ERROR_SUCCESS)
??dwRes=0;
?
?return dwRes;
}


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445124.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445124.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445124.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

進程基礎

進程的基本概念 程序順序執行的特征: 1)順序性:處理機嚴格按照程序所規定的順序執行,每一步操作必須在下一步操作開始前執行 2)封閉性:程序在封閉的環境下運行,程序獨占資源,資源的狀…

用Docker容器自帶的tensorflow serving部署模型對外服務

相信很多人和我一樣,在試圖安裝tensorflow serving的時候,翻遍了網上的博客和官網文檔,安裝都是以失敗而告終,我也是一樣,這個問題折磨了我兩個星期之久,都快放棄了。幸運的是在同事的建議下,我…

C資源

云風最近寫了一篇博客《C語言的前世今生》。作為長期使用C語言開發網絡游戲服務器的程序員,云風是有理由寫這樣一篇文字,不過還是感覺談的不夠深入,C語言在業界使用的現狀沒有怎么描寫,有些意猶未盡。在這里想比較系統的談談個人對…

學點數學(2)-特征函數

特征函數1.數列特征方程2.矩陣特征方程3.微分方程特征方程4.積分方程特征方程特征方程是為研究相應的數學對象而引入的一些等式,這些等式描述了特定對象的特性。依據研究的對象不同,特征方程包括數列特征方程、矩陣特征方程、微分方程特征方程、積分方程…

GCC如何產生core dump

先決條件1.安裝apport(automatically generate crash reports for debugging)2.修改/etc/security/limits.conf文件,使允許core dump,或者用ulimit -c unlimited設置core dump文件的大小為unlimited3.C/C的編譯開關-g(…

經典的進程同步問題

經典的進程同步問題 普通版:一類進程作為生產者,生產產品,生產的產品放入一個緩沖區,消費者從緩沖區中取出產品,需要保證生產者不可以向滿的緩沖區中添加產品,消費者不可以從空的緩沖區中取出產品。同一時刻…

面試題匯總---深度學習(圖像識別,NLP內容)

文章目錄1.基本概念1.1 為什么神經網絡中深度網絡的表現比廣度網絡表現好?1.2 推導BP算法1.3 什么是梯度消失和梯度爆炸?1.4 常用的激活函數有哪些?1.5 常用的參數更新方法有哪些?1.6 解決過擬合的方法?數據層面模型層…

Linux-2.6.25 TCPIP函數調用大致流程

Linux-2.6.25 TCPIP函數調用大致流程學習目的,隨手筆記。函數和文字說明會不斷補充更新。Changelog2008.10.08 最近找工作忙。暫時緩緩插口層系統調用sendsys_sendsys_sendtosendtosys_sendtosock_sendmsgsendmsgsys_sendmsgsock_sendmsgwritesys_writevfs_write…

Python(28)-文件,os模塊

文件1. 文件2. 文件的基本操作3. 讀取文件open()3.1 文件指針: 標記從哪一個位置開始讀取數據.3.2 文件的打開方式mode3.3 文件按行讀取3.3.1 readline()3.3.2 readlines()4.文件輸出f.write(),print()5.文件復制5.1 小文件復制(搬家)5.2 大文件復制&…

IOCP的程序

C代碼 #include <winsock2.h> #include <mswsock.h> #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <assert.h> #include "vld.h" #pragma message("automatic link to ws2_32.lib and…

PaperNotes(3)-圖像分割-RCNN-FCN-Boxsup

圖像分割算法對比小結1.{基本概念}2.{R-CNN}2.1R-CNN 網絡結構選擇性搜索算法為什么選擇SVM作分類器邊框回歸2.2{R-CNN 訓練}2.3{R-CNN實驗結果}2.4{R-CNN語義分割}2.5{補充材料}2.5.1{R-CNN建議區域放縮}2.5.2{IOU閾值設置不一樣的原因}2.5.3{Bounding-box回歸修正}2.6{R-CNN存…

Python模塊(3)--PIL 簡易使用教程

PIL模塊-用與記1.圖片導入Image.open()2.圖像顯示.show()4.查看圖片屬性.format,.size,.mode3.圖像格式轉換.convert()4.圖像模式“L”&#xff0c;“RGB”,"CYMK"5. 圖片旋轉.rotate()旋轉方式1&#xff1a;旋轉不擴展旋轉方式2&#xff1a;旋轉擴展旋轉方式3&#…

日志級別 debug info warn eirror fatal

日志級別 debug info warn eirror fatal 軟件中總免不了要使用諸如 Log4net, Log4j, Tracer 等東東來寫日志&#xff0c;不管用什么&#xff0c;這些東東大多是大同小異的&#xff0c;一般都提供了這樣5個日志級別&#xff1a; Debug Info Warn Error Fatal一個等級比一個高&…

輸入輸出系統

I/O設備&#xff1a;輸入輸出和存儲功能的設備 I/O設備的分類 按傳輸的速度&#xff1a; 低速設備&#xff08;如鍵盤、鼠標、語音輸入輸出設備&#xff09; 中速設備&#xff08;如行式打印機、激光打印機等&#xff09; 高速設備&#xff08;如磁帶機、磁盤機、光盤機等&…

vue2源碼解析---v-model雙向數據綁定

什么是v-model v-model 是 Vue 中的一個指令&#xff0c;用于實現表單元素與 Vue 實例中數據的雙向綁定。這意味著當表單元素的值發生變化時&#xff0c;Vue 實例中的數據也會隨之更新 工作原理 生成ast樹 本質上是語法糖 結合了v-bind和v-on兩個指令 示例代碼 new Vue({e…

php收集的精典代碼

1. οncοntextmenu"window.event.return&#xff06;#118aluefalse" 將徹底屏蔽鼠標右鍵 <table border οncοntextmenureturn(false)><td>no</table> 可用于Table 2. <body onselectstart"return false"> 取消選取、防止復制…

python外卷(7)--glob

glob模塊1.glob.glob()2.對比os.listdir()glob是python自帶的一個操作文件的模塊&#xff0c;可用于查找 指定路徑 中 匹配的 文件。1.glob.glob() 下面是一個測試文件路徑&#xff1a; (base) pppp-System-Product-Name:~/Desktop/test_glob$ tree . ├── a │ ├── 1…

Sublime Text 2配置強大的IDE開發環境,運行java

Sublime Text 2是我無意中發現的、據說十分強大的、便捷的編輯器&#xff0c;許多程序員都投入到Sublime Text 2的懷抱中。 1 配置java開發環境的方法如下&#xff1a; 在jdk安裝目錄下的bin文件夾下新建一個bat格式的文件&#xff0c;文件命為javacexec.bat。 如果是在Wind…

thinkphp的快捷方法實例化對象

D、F、S、C、L、A、I 他們都在functions.php這個文件家 下面我分別說明一下他們的功能 D&#xff08;&#xff09; 加載Model類 M&#xff08;&#xff09; 加載Model類 A&#xff08;&#xff09; 加載Action類 L&#xff08;&#xff09; 獲取語言定義 C&#xff08;&#xf…

Python外卷(8)--pdist, squareform

pdist, squareform1.pdist, squareform使用例子2.通過矩陣的四則運算實現上述pdist, squareformscipy.spatial.distance 距離計算庫中有兩個函數&#xff1a;pdist, squareform&#xff0c;用于計算樣本對之間的歐式距離&#xff0c;并且將樣本間距離用方陣表示出來。&#xff…