Windows系統(tǒng)編程---第6章
本文關(guān)鍵詞:Windows系統(tǒng)編程,由筆耕文化傳播整理發(fā)布。
Windows系統(tǒng)編程實(shí)用教程
授課教師: 職務(wù):
第6章
課程描述
探測網(wǎng)絡(luò)中的在線設(shè)備
Windows將很多系統(tǒng)配 置信息保存在注冊表 中,通過讀取注冊表 中的一些鍵值,,可以 獲取Windows的相應(yīng)系 統(tǒng)信息。比如,服務(wù) 和安裝程序的列表等; 通過修改注冊表中的 一些鍵值,可以對(duì) Win
dows系統(tǒng)進(jìn)行配 置.很多應(yīng)用程序也 把配置信息保存在注 冊表中。
本章知識(shí)點(diǎn)
6.1 6.2 6.3 6.4 理 注冊表的結(jié)構(gòu)和管理 對(duì)注冊表鍵的操作 對(duì)注冊表值的操作 注冊表編程實(shí)例:安裝和卸載程序管
6.1
注冊表的結(jié)構(gòu)
6.1.1注冊表的結(jié)構(gòu) 6.1.2 標(biāo)準(zhǔn)注冊表值類型
6.1.1 注冊表的結(jié)構(gòu)
1.HKEY_LOCAL_MACHINE (HKLM) 2.HKEY_CURRENT_CONFIG (HKCC) 3.HKEY_CLASSES_ROOT (HKCR) 4.HKEY_USERS (HKU) 5.HKEY_CURRENT_USER (HKCU)
注冊表編輯器
? 在“運(yùn)行”對(duì)話框中執(zhí)行regedit.exe命令,可以打開 “注冊表編輯器”窗口,如圖6.1所示。
6.1.2
類型編號(hào)
0 1 2 3 4
標(biāo)準(zhǔn)注冊表值類型
說 明
類型名
REG_NONE REG_SZ REG_EXPAND_SZ REG_BINARY REG_DWORD / REG_DWORD_LITTLE_ENDIAN
5
6
7 8 9 10 11
沒有類型 字符串類型 一個(gè)可擴(kuò)展的字符串值,其中可以包含環(huán)境變量 二進(jìn)制類型 DWORD類型,用于存儲(chǔ)32位無符號(hào)整數(shù),即 0~4,294,967,295 [232 – 1]之間的整數(shù),以littleendian格式存儲(chǔ) REG_DWORD_BIG_ENDIAN DWORD類型,用于存儲(chǔ)32位無符號(hào)整數(shù),即 0~4,294,967,295 [232 – 1] 之 間 的 整 數(shù) , 以 bigendian格式存儲(chǔ) REG_LINK 到其他注冊表鍵的鏈接,指定根鍵或到目標(biāo)鍵的 路徑 REG_MULTI_SZ 一個(gè)多字符串值,指定一個(gè)非空字符串的排序列 表 REG_RESOURCE_LIST 資源列表,用于枚舉即插即用硬件及其配置 REG_FULL_RESOURCE_DESCR 資源標(biāo)識(shí)符,用于枚舉即插即用硬件及其配置 IPTOR REG_RESOURCE_REQUIREME 資源需求列表,用于枚舉即插即用硬件及其配置 NTS_LIST REG_QWORD / QWORD類型,用于存儲(chǔ)64位無符號(hào)整數(shù),以 REG_QWORD_LITTLE_ENDIAN little-endian格式存儲(chǔ)或未指定存儲(chǔ)格式
6.2
6.2.1 6.2.2 6.2.3 6.2.4
對(duì)注冊表鍵的操作
打開和關(guān)閉鍵 創(chuàng)建注冊表鍵 刪除注冊表鍵 枚舉子鍵
6.2.1
打開和關(guān)閉鍵
?調(diào)用RegOpenKeyEx()函數(shù)可以打開指定的 注冊表鍵并返回其句柄,函數(shù)原型如下: LONG WINAPI RegOpenKeyEx( __in HKEY hKey, __in LPCTSTR lpSubKey, DWORD ulOptions, __in REGSAM samDesired, __out PHKEY phkResult );
【例6.1】
? 使用RegOpenKeyEx()函數(shù)判斷HKEY_LOCAL_MACHINE下的子鍵是否 存在,如圖6.2所示。 ? 創(chuàng)建一個(gè)基于對(duì)話框的MFC項(xiàng)目RegKeyExists,主對(duì)話框?qū)?yīng)的類 為CRegKeyExistsDlg。在主對(duì)話框中添加編輯框控件 IDC_EDIT_SUBKEY,并為其添加變量m_SubKey。
CRegKeyExistsDlg::OnInitDialog()
? 在CRegKeyExistsDlg::OnInitDialog()中為編輯框 IDC_EDIT_SUBKEY設(shè)置初始值,代碼如下: BOOL CRegKeyExistsDlg::OnInitDialog() { CDialog::OnInitDialog(); …… m_SubKey = "SOFTWARE\\\Microsoft\\\Windows\\CurrentVersion\\Unins tall"; UpdateData(0); return TRUE; // 除非將焦點(diǎn)設(shè)置到控件,否則返回TRUE }
單擊“判斷”按鈕對(duì)應(yīng)的代碼
void CRegKeyExistsDlg::OnBnClickedButtonVerify() { UpdateData(TRUE); LONG lRet; HKEY hKey; lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE, m_SubKey.GetBuffer(), 0, KEY_QUERY_VALUE, &hKey ); if( lRet != ERROR_SUCCESS ) AfxMessageBox("不存在") ; else AfxMessageBox("存在") ;
RegCloseKey( }
hKey
);
6.2.2
創(chuàng)建注冊表鍵
LONG RegCreateKeyEx( HKEY hKey, //一個(gè)打開的注冊表鍵的句柄,調(diào)用進(jìn)程對(duì) 該鍵必須擁有KEY_CREATE_SUB_KEY權(quán)限 LPCWSTR lpSubKey, //在hKey鍵下創(chuàng)建的子鍵的名字 DWORD Reserved, // 保留,必須為0 LPWSTR lpClass, //鍵的類別。如果NULL,則忽略 DWORD dwOptions, //選項(xiàng), REGSAM samDesired, // 指定對(duì)鍵的訪問權(quán)限 LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指定安全屬 性,即返回的句柄是否可以被子進(jìn)程繼承。如果為NULL,則不可 以繼承 PHKEY phkResult, //用于接收被創(chuàng)建的鍵的句柄 LPDWORD lpdwDisposition //用于接收穿件的方式。 );
【例6.2】
? 使用RegCreateKeyEx()函數(shù)在HKEY_LOCAL_MACHINE\SOFTWARE下創(chuàng)建一個(gè)子鍵MyApp,代碼如下 : #include "stdafx.h" #include <windows.h> int _tmain(int argc, _TCHAR* argv[]) { HKEY hk; DWORD dwData, dwDisp; char lpSubKey[MAX_PATH] = "SOFTWARE\\MyApp"; if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, lpSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hk, &dwDisp) != ERROR_SUCCESS) { printf("Could not create the registry key.\n"); return 0; } return 0; }
6.2.3
刪除注冊表鍵
LONG WINAPI RegDeleteKey( __in HKEY hKey, // 打開的要?jiǎng)h除的鍵的父鍵的句柄 ,用戶必須對(duì)該鍵有DELETE訪問權(quán)限 __in LPCTSTR lpSubKey // 要?jiǎng)h除的鍵名字,它必 須是hKey所表示的鍵的子鍵 ); ? 如果函數(shù)執(zhí)行成功,則返回ERROR_SUCCESS;否則返回一個(gè)非0錯(cuò)誤編 碼。返回ERROR_FILE_NOT_FOUND表示沒有找到要?jiǎng)h除的鍵。
【例6.3】
? 使用RegDeleteKey()函數(shù)刪除例6.2中創(chuàng)建的注冊表鍵MyApp,代碼如下: #include "stdafx.h" #include <windows.h> int _tmain(int argc, _TCHAR* argv[]) { HKEY hk; DWORD dwData, dwDisp; LONG lResult; char lpSubKey[MAX_PATH] = "SOFTWARE\\MyApp“; lResult = RegDeleteKey(HKEY_LOCAL_MACHINE, lpSubKey); if ( lResult!= ERROR_SUCCESS) { if (lResult == ERROR_FILE_NOT_FOUND) { printf("Key not found.\n"); return TRUE; } else { printf("Error opening key.\n"); return FALSE; } } return 0;
6.2.4
枚舉子鍵
? 在下面的注冊表鍵下保存著所有已安裝軟件的信息,每個(gè)子鍵都 保存著一個(gè)安裝軟件的信息,如圖6.3所示。 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersi on\Uninstall
RegEnumKey()函數(shù)
LONG WINAPI RegEnumKey( __in HKEY hKey, //打開的注冊表鍵句柄,用戶對(duì)該鍵必 須有KEY_ENUMERATE_SUB_KEYS的訪問權(quán)限 __in DWORD dwIndex, //指定要獲取hKey鍵的子鍵的 序號(hào) __out LPTSTR lpName, // 用于接收子鍵名稱的字符串 緩沖區(qū) __in DWORD cchName //指定接收緩沖區(qū)的大小 );
【例6.3】
? 枚舉并打印HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Windows \CurrentVersion\Uninstall 的所有子鍵,代碼如下:
#include "stdafx.h" #include <windows.h> int _tmain(int argc, _TCHAR* argv[]) { LONG lRet; HKEY hKey; //打開鍵HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE, "SOFTWARE\\\Microsoft\\\Windows\\CurrentVersion\\Uninstall", 0, KEY_ENUMERATE_SUB_KEYS, &hKey ); if(lRet != ERROR_SUCCESS) { printf("Can not open the key...") ; return 0; }
接上
DWORD dwCurIndex =0; //子鍵的索引 // 枚舉子鍵 char SubKey[MAX_PATH]; while(true){ lRet=RegEnumKey(hKey, dwCurIndex, SubKey, MAX_PATH); if((lRet == ERROR_NO_MORE_ITEMS) || (lRet==ERROR_INVALID_HANDLE)) break; else printf("%s\n",SubKey); dwCurIndex++; } RegCloseKey(hKey); system("pause"); return 0;
}
【例6.3】的運(yùn)行界面
6.3
6.3.1 6.3.2 6.3.3
對(duì)注冊表值的操作
讀取注冊表值 設(shè)置注冊表值 刪除注冊表值
6.3.1
讀取注冊表值
? 調(diào)用RegQueryValueEx()函數(shù)可以讀取指定的注冊表值,函數(shù)原型如下: LONG RegQueryValueEx( HKEY hKey, // 已打開的注冊表鍵句柄 LPCWSTR lpValueName, // 要讀取的值的名字 LPDWORD lpReserved, // 保留,使用NULL LPDWORD lpType, // 值的數(shù)據(jù)類型 LPBYTE lpData, // 用于接收值的數(shù)據(jù)的緩沖區(qū) LPDWORD lpcbData // 指定緩沖區(qū)lpData的長度,單位是字 節(jié) ); ? 如果函數(shù)執(zhí)行成功,則返回ERROR_SUCCESS;否則返回錯(cuò)誤代碼。
【例6.5】
? 讀取并打印HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\ CurrentVersion\鍵下的ProductName,代碼如下: #include "stdafx.h" #include <windows.h> int _tmain(int argc, _TCHAR* argv[]) { HKEY hKey; // 注冊表鍵 DWORD dwType = REG_SZ; // 值的數(shù)據(jù)類型 DWORD dwSize; //緩沖區(qū)大小 BYTE data[MAX_PATH]; //緩沖區(qū) SecureZeroMemory(data, MAX_PATH);
接上
if(RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", &hKey) == ERROR_SUCCESS) { if(RegQueryValueEx(hKey,"ProductName", //值名 NULL, //保留 &dwType, // 數(shù)據(jù)類型 (LPBYTE)data, // 獲取數(shù)據(jù)的緩沖區(qū) &dwSize) == ERROR_SUCCESS) printf("Product Name: %s\n\n", data); else printf("RegOpenKey error.\n"); } else printf("RegQueryValueEx error.\n"); system("pause"); return 0; }
6.3.2
設(shè)置注冊表值
LONG RegSetValueEx( HKEY hKey, // 已打開的注冊表鍵句柄 ,要設(shè)置的注冊表值應(yīng)在該鍵下 LPCWSTR lpValueName, //要設(shè)置的值的名字 DWORD Reserved, // 保留,使用NULL DWORD dwType, //值的數(shù)據(jù)類型 const BYTE* lpData, // 用于指定值的數(shù)據(jù)的緩 沖區(qū) DWORD cbData );
【例6.6】
? 在HKEY_LOCAL_MACHINE\SOFTWARE\MyApp\鍵下創(chuàng)建和設(shè)置值ProductName的數(shù)據(jù)為 “MyAppName”,代碼如下:
#include "stdafx.h" #include <windows.h> int _tmain(int argc, _TCHAR* argv[]) { HKEY hKey; // 注冊表鍵 DWORD dwType = REG_SZ; // 值的數(shù)據(jù)類型 DWORD dwSize; //緩沖區(qū)大小 BYTE data[MAX_PATH]; //緩沖區(qū) SecureZeroMemory(data, MAX_PATH); if(RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\MyApp", &hKey) == ERROR_SUCCESS) {
接上
if(RegSetValueEx(hKey,"ProductName", //值名 NULL, //保留 REG_SZ, // 數(shù)據(jù)類型 (LPBYTE)"MyAppName“,// 數(shù)據(jù) sizeof("MyAppName")) == ERROR_SUCCESS) printf("Write Product Name Successfully..\n\n", data); else printf("RegOpenKey error.\n"); } else printf("RegSetValueEx error.\n"); system("pause"); return 0; }
6.3.3
刪除注冊表值
? 調(diào)用RegDeletetValue()函數(shù)可以讀取指定的注冊表值,函數(shù) 原型如下: LONG WINAPI RegDeleteValue( __in HKEY hKey, // 已打開的我注冊表鍵句柄,要 設(shè)置的注冊表值應(yīng)在該鍵下 __in LPCTSTR lpValueName //要?jiǎng)h除的值的名字 );
? 如果函數(shù)執(zhí)行成功,則返回ERROR_SUCCESS;否則返回錯(cuò)誤代 碼。
【例6.7】
刪除HKEY_LOCAL_MACHINE\SOFTWARE\MyApp\鍵下的值ProductName,代碼如下:
#include "stdafx.h" #include <windows.h> int _tmain(int argc, _TCHAR* argv[]) { HKEY hKey; // 注冊表鍵 DWORD dwType = REG_SZ; // 值的數(shù)據(jù)類型 DWORD dwSize; //緩沖區(qū)大小 BYTE data[MAX_PATH]; //緩沖區(qū)
SecureZeroMemory(data, MAX_PATH); if(RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\MyApp", &hKey) == ERROR_SUCCESS) { if(RegDeleteValue(hKey,"ProductName") == ERROR_SUCCESS) printf("Delete Product Name Successfully..\n\n", data); else printf("RegOpenKey error.\n"); } else printf("RegSetValueEx error.\n");
system("pause"); return 0; }
6.4
注冊表編程實(shí)例:安裝和卸載程序管理
6.4.1
設(shè)計(jì)程序界面
? 創(chuàng)建一個(gè)基于對(duì)話框的項(xiàng)目unstallmanager,在主對(duì)話框 IDD_UNINSTALLMANAGER_DIALOG中添加一個(gè)Combo Box控件IDC_COMBO1 ,并為其定義變量,代碼如下: CComboBox m_Typelist; ? 在主對(duì)話框中添加一個(gè)List Control控件IDC_LIST1,并為其定義變量 ,代碼如下: CListCtrl m_list; ? 將控件IDC_LIST1的view屬性設(shè)置為Report,將“所有者數(shù)據(jù)”屬性設(shè) 置為False,即由用戶管理數(shù)據(jù)。
6.4.2
自定義類CinstalledSoftware
class CInstalledProgram { public: char SubkeyName[MAX_PATH]; // 所屬子鍵名 char ProgramName[MAX_PATH]; //軟件名 char ProgramVersion[MAX_PATH]; //版本 char InstallLocation[MAX_PATH]; //安裝位置 char ModifyPath[MAX_PATH]; //修復(fù)路徑 char Publisher[MAX_PATH]; //開發(fā)商 char Uninstallstring[MAX_PATH]; //卸載命令 char ReleaseType[MAX_PATH]; // 軟件類型,Security Update、Update或Hotfix char ParentKeyName[MAX_PATH]; // 父鍵名,有些系統(tǒng)補(bǔ)丁的父鍵名為 OperatingSystem char url[MAX_PATH]; // 網(wǎng)址
CInstalledProgram* Next; // 指向下一個(gè)記錄 public: CInstalledProgram(void); // 構(gòu)造函數(shù) ~CInstalledProgram(void); // 析構(gòu)函數(shù) void ReadValues(); // 根據(jù)SubkeyName從注冊表中讀取安裝軟件的 信息到當(dāng)前記錄 };
6.4.3
加載安裝軟件列表
(1)枚舉注冊表中 SOFTWARE\Microsoft\Windows\CurrentVersion\Unins tall\的子鍵,為每個(gè)子鍵創(chuàng)建一個(gè)CInstalledProgram 對(duì)象,并將這些對(duì)象連接成鏈表。 (2)對(duì)每個(gè)CInstalledProgram對(duì)象調(diào)用ReadValues()函 數(shù),從注冊表中讀取安裝軟件的信息。 (3)將安裝軟件鏈表中的每個(gè)CInstalledProgram對(duì)象添 加到CListCtrl控件m_list中。根據(jù)pProg>ReleaseType和pProg->ParentKeyName的值及確定軟件 屬于應(yīng)用程序還是系統(tǒng)補(bǔ)丁,然后根據(jù)當(dāng)前選擇的軟件 類型決定將其添加到列表中。 );
6.4.4
1.彈出右鍵菜單 2.打開目錄 3.訪問網(wǎng)站 4.修復(fù)軟件 5.卸載軟件
對(duì)軟件進(jìn)行操作
更多相關(guān)文檔:
第6章知識(shí)點(diǎn)
第6章知識(shí)點(diǎn)_政史地_高中教育_教育專區(qū)。1.物質(zhì)燃燒需要同時(shí)滿足 3 個(gè)條件 ① 2.滅火的原理 ① 3.可燃物完全燃燒的條件是① 4.木炭充分燃燒生成二氧化碳,其...
第6章 部件工作原理與編程示例(1)
第5章 應(yīng)用系統(tǒng)設(shè)計(jì)與調(diào)試... 第6章 部件工作原理與編程... 第7章 嵌入式...打開 AXD Debugger(或 ARM Debugger for Windows)的命令行窗口,執(zhí)行 obey 命令...
第6章課后答案
88 第 6 章 用戶界面設(shè)計(jì) 2.滾動(dòng)條響應(yīng)的重要...編程題 1.編寫一應(yīng)用程序,實(shí)現(xiàn)對(duì)文本框中的文本...3.設(shè)計(jì)一個(gè)類似于 Windows 操作系統(tǒng)的滾動(dòng)屏幕保護(hù)...
Windows系統(tǒng)編程練習(xí)題參考答案
Windows系統(tǒng)編程練習(xí)題參考答案_工學(xué)_高等教育_教育專區(qū)。第1章一、選擇題 1....內(nèi)核模式 6.Win32 7.POSIX 8.OS/2 9.執(zhí)行體服務(wù) 10.內(nèi)核 11.硬件抽象層...
第6章 系統(tǒng)實(shí)施
可視化開發(fā)工具,容易學(xué) 習(xí)和掌握; 它提供了基于 Windows 的圖形界面和事件驅(qū)動(dòng)...操作和編程功能,適合快速原型系統(tǒng)、小型辦公自動(dòng)化系統(tǒng)的開發(fā)(對(duì)于分布式 系統(tǒng)、...
游洪躍C語言程序設(shè)計(jì)第6章 習(xí)題解答
第6 章 習(xí)題解答一、選擇題 1.設(shè)有如下說明: ...答案:棧三、編程題 *1.定義一個(gè)結(jié)構(gòu)類型變量,包括...系統(tǒng)提示信息 */ /* 返回值 0, 返回操作系統(tǒng) *...
計(jì)算機(jī)代數(shù)系統(tǒng)第6章-程序設(shè)計(jì)
6頁 免費(fèi) 計(jì)算機(jī)代數(shù)系統(tǒng)第5章-方程... 22頁 20財(cái)富值喜歡此文檔的還喜歡 ...但是,由于程序設(shè)計(jì)本身的復(fù)雜性,因此, 在編寫程序時(shí)應(yīng)嚴(yán)格按照相關(guān)算法設(shè)計(jì)程序,...
第6章習(xí)題 - 副本
第6章 1 判斷題 1-1 計(jì)算機(jī)病毒只會(huì)破壞計(jì)算機(jī)的操作系統(tǒng),而對(duì)其他網(wǎng)絡(luò)設(shè)備...Windows“控制面板”中無“本地”連接圖標(biāo) 3-2 當(dāng)計(jì)算機(jī)上發(fā)現(xiàn)病毒時(shí),最徹底...
第6章 思考習(xí)題答案
第6章 思考習(xí)題答案_理學(xué)_高等教育_教育專區(qū)。思考習(xí)題 一、選擇題 1.下列不是混合身份驗(yàn)證模式的優(yōu)點(diǎn)的是( D )。 A 創(chuàng)建了 Windows 操作系統(tǒng)上的另外一個(gè)安...
第6章 Windows操作系統(tǒng)
第6章 Windows操作系統(tǒng)第6章 Windows操作系統(tǒng)隱藏>> 第6章一、教學(xué)內(nèi)容: 教學(xué)內(nèi)容: Windows 操作系統(tǒng) Windows 操作系統(tǒng)是微型機(jī)上最常用的操作系統(tǒng)之一,學(xué)習(xí)并使...
更多相關(guān)標(biāo)簽:
windows系統(tǒng)編程 | Windows系統(tǒng)編程 pdf | windows下系統(tǒng)編程 | linux系統(tǒng)編程 pdf | linux系統(tǒng)編程 | c c 嵌入式系統(tǒng)編程 | 易語言編程系統(tǒng) | ks線切割編程系統(tǒng) |本文關(guān)鍵詞:Windows系統(tǒng)編程,由筆耕文化傳播整理發(fā)布。
本文編號(hào):244169
本文鏈接:http://sikaile.net/wenshubaike/mishujinen/244169.html