当前位置:主页 > 论文百科 > 英文数据库 >

Windows系统编程---第6章

发布时间:2017-02-20 15:52

  本文关键词:Windows系统编程,由笔耕文化传播整理发布。



Windows系统编程实用教程
授课教师: 职务:

第6章
课程描述

探测网络中的在线设备

Windows将很多系统配 置信息保存在注册表 中,通过读取注册表 中的一些键值,,可以 获取Windows的相应系 统信息。比如,服务 和安装程序的列表等; 通过修改注册表中的 一些键值,可以对 Win

dows系统进行配 置.很多应用程序也 把配置信息保存在注 册表中。

本章知识点
6.1 6.2 6.3 6.4 理 注册表的结构和管理 对注册表键的操作 对注册表值的操作 注册表编程实例:安装和卸载程序管

6.1

注册表的结构

6.1.1注册表的结构 6.1.2 标准注册表值类型

6.1.1 注册表的结构
1.HKEY_LOCAL_MACHINE (HKLM) 2.HKEY_CURRENT_CONFIG (HKCC) 3.HKEY_CLASSES_ROOT (HKCR) 4.HKEY_USERS (HKU) 5.HKEY_CURRENT_USER (HKCU)

注册表编辑器
? 在“运行”对话框中执行regedit.exe命令,可以打开 “注册表编辑器”窗口,如图6.1所示。

6.1.2
类型编号
0 1 2 3 4

标准注册表值类型
说 明

类型名
REG_NONE REG_SZ REG_EXPAND_SZ REG_BINARY REG_DWORD / REG_DWORD_LITTLE_ENDIAN

5

6
7 8 9 10 11

没有类型 字符串类型 一个可扩展的字符串值,其中可以包含环境变量 二进制类型 DWORD类型,用于存储32位无符号整数,即 0~4,294,967,295 [232 – 1]之间的整数,以littleendian格式存储 REG_DWORD_BIG_ENDIAN DWORD类型,用于存储32位无符号整数,即 0~4,294,967,295 [232 – 1] 之 间 的 整 数 , 以 bigendian格式存储 REG_LINK 到其他注册表键的链接,指定根键或到目标键的 路径 REG_MULTI_SZ 一个多字符串值,指定一个非空字符串的排序列 表 REG_RESOURCE_LIST 资源列表,用于枚举即插即用硬件及其配置 REG_FULL_RESOURCE_DESCR 资源标识符,用于枚举即插即用硬件及其配置 IPTOR REG_RESOURCE_REQUIREME 资源需求列表,用于枚举即插即用硬件及其配置 NTS_LIST REG_QWORD / QWORD类型,用于存储64位无符号整数,以 REG_QWORD_LITTLE_ENDIAN little-endian格式存储或未指定存储格式

6.2
6.2.1 6.2.2 6.2.3 6.2.4

对注册表键的操作

打开和关闭键 创建注册表键 删除注册表键 枚举子键

6.2.1

打开和关闭键

?调用RegOpenKeyEx()函数可以打开指定的 注册表键并返回其句柄,函数原型如下: LONG WINAPI RegOpenKeyEx( __in HKEY hKey, __in LPCTSTR lpSubKey, DWORD ulOptions, __in REGSAM samDesired, __out PHKEY phkResult );

【例6.1】
? 使用RegOpenKeyEx()函数判断HKEY_LOCAL_MACHINE下的子键是否 存在,如图6.2所示。 ? 创建一个基于对话框的MFC项目RegKeyExists,主对话框对应的类 为CRegKeyExistsDlg。在主对话框中添加编辑框控件 IDC_EDIT_SUBKEY,并为其添加变量m_SubKey。

CRegKeyExistsDlg::OnInitDialog()
? 在CRegKeyExistsDlg::OnInitDialog()中为编辑框 IDC_EDIT_SUBKEY设置初始值,代码如下: BOOL CRegKeyExistsDlg::OnInitDialog() { CDialog::OnInitDialog(); …… m_SubKey = "SOFTWARE\\\Microsoft\\\Windows\\CurrentVersion\\Unins tall"; UpdateData(0); return TRUE; // 除非将焦点设置到控件,否则返回TRUE }

单击“判断”按钮对应的代码
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

创建注册表键

LONG RegCreateKeyEx( HKEY hKey, //一个打开的注册表键的句柄,调用进程对 该键必须拥有KEY_CREATE_SUB_KEY权限 LPCWSTR lpSubKey, //在hKey键下创建的子键的名字 DWORD Reserved, // 保留,必须为0 LPWSTR lpClass, //键的类别。如果NULL,则忽略 DWORD dwOptions, //选项, REGSAM samDesired, // 指定对键的访问权限 LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指定安全属 性,即返回的句柄是否可以被子进程继承。如果为NULL,则不可 以继承 PHKEY phkResult, //用于接收被创建的键的句柄 LPDWORD lpdwDisposition //用于接收穿件的方式。 );

【例6.2】
? 使用RegCreateKeyEx()函数在HKEY_LOCAL_MACHINE\SOFTWARE下创建一个子键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, // 打开的要删除的键的父键的句柄 ,用户必须对该键有DELETE访问权限 __in LPCTSTR lpSubKey // 要删除的键名字,它必 须是hKey所表示的键的子键 ); ? 如果函数执行成功,则返回ERROR_SUCCESS;否则返回一个非0错误编 码。返回ERROR_FILE_NOT_FOUND表示没有找到要删除的键。

【例6.3】
? 使用RegDeleteKey()函数删除例6.2中创建的注册表键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

枚举子键

? 在下面的注册表键下保存着所有已安装软件的信息,每个子键都 保存着一个安装软件的信息,如图6.3所示。 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersi on\Uninstall

RegEnumKey()函数
LONG WINAPI RegEnumKey( __in HKEY hKey, //打开的注册表键句柄,用户对该键必 须有KEY_ENUMERATE_SUB_KEYS的访问权限 __in DWORD dwIndex, //指定要获取hKey键的子键的 序号 __out LPTSTR lpName, // 用于接收子键名称的字符串 缓冲区 __in DWORD cchName //指定接收缓冲区的大小 );

【例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】的运行界面

6.3
6.3.1 6.3.2 6.3.3

对注册表值的操作

读取注册表值 设置注册表值 删除注册表值

6.3.1

读取注册表值

? 调用RegQueryValueEx()函数可以读取指定的注册表值,函数原型如下: LONG RegQueryValueEx( HKEY hKey, // 已打开的注册表键句柄 LPCWSTR lpValueName, // 要读取的值的名字 LPDWORD lpReserved, // 保留,使用NULL LPDWORD lpType, // 值的数据类型 LPBYTE lpData, // 用于接收值的数据的缓冲区 LPDWORD lpcbData // 指定缓冲区lpData的长度,单位是字 节 ); ? 如果函数执行成功,则返回ERROR_SUCCESS;否则返回错误代码。

【例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; // 值的数据类型 DWORD dwSize; //缓冲区大小 BYTE data[MAX_PATH]; //缓冲区 SecureZeroMemory(data, MAX_PATH);

接上
if(RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", &hKey) == ERROR_SUCCESS) { if(RegQueryValueEx(hKey,"ProductName", //值名 NULL, //保留 &dwType, // 数据类型 (LPBYTE)data, // 获取数据的缓冲区 &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

设置注册表值

LONG RegSetValueEx( HKEY hKey, // 已打开的注册表键句柄 ,要设置的注册表值应在该键下 LPCWSTR lpValueName, //要设置的值的名字 DWORD Reserved, // 保留,使用NULL DWORD dwType, //值的数据类型 const BYTE* lpData, // 用于指定值的数据的缓 冲区 DWORD cbData );

【例6.6】
? 在HKEY_LOCAL_MACHINE\SOFTWARE\MyApp\键下创建和设置值ProductName的数据为 “MyAppName”,代码如下:

#include "stdafx.h" #include <windows.h> int _tmain(int argc, _TCHAR* argv[]) { HKEY hKey; // 注册表键 DWORD dwType = REG_SZ; // 值的数据类型 DWORD dwSize; //缓冲区大小 BYTE data[MAX_PATH]; //缓冲区 SecureZeroMemory(data, MAX_PATH); if(RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\MyApp", &hKey) == ERROR_SUCCESS) {

接上
if(RegSetValueEx(hKey,"ProductName", //值名 NULL, //保留 REG_SZ, // 数据类型 (LPBYTE)"MyAppName“,// 数据 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

删除注册表值

? 调用RegDeletetValue()函数可以读取指定的注册表值,函数 原型如下: LONG WINAPI RegDeleteValue( __in HKEY hKey, // 已打开的我注册表键句柄,要 设置的注册表值应在该键下 __in LPCTSTR lpValueName //要删除的值的名字 );

? 如果函数执行成功,则返回ERROR_SUCCESS;否则返回错误代 码。

【例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; // 值的数据类型 DWORD dwSize; //缓冲区大小 BYTE data[MAX_PATH]; //缓冲区

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

注册表编程实例:安装和卸载程序管理

6.4.1

设计程序界面

? 创建一个基于对话框的项目unstallmanager,在主对话框 IDD_UNINSTALLMANAGER_DIALOG中添加一个Combo Box控件IDC_COMBO1 ,并为其定义变量,代码如下: CComboBox m_Typelist; ? 在主对话框中添加一个List Control控件IDC_LIST1,并为其定义变量 ,代码如下: CListCtrl m_list; ? 将控件IDC_LIST1的view属性设置为Report,将“所有者数据”属性设 置为False,即由用户管理数据。

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]; //修复路径 char Publisher[MAX_PATH]; //开发商 char Uninstallstring[MAX_PATH]; //卸载命令 char ReleaseType[MAX_PATH]; // 软件类型,Security Update、Update或Hotfix char ParentKeyName[MAX_PATH]; // 父键名,有些系统补丁的父键名为 OperatingSystem char url[MAX_PATH]; // 网址

CInstalledProgram* Next; // 指向下一个记录 public: CInstalledProgram(void); // 构造函数 ~CInstalledProgram(void); // 析构函数 void ReadValues(); // 根据SubkeyName从注册表中读取安装软件的 信息到当前记录 };

6.4.3

加载安装软件列表

(1)枚举注册表中 SOFTWARE\Microsoft\Windows\CurrentVersion\Unins tall\的子键,为每个子键创建一个CInstalledProgram 对象,并将这些对象连接成链表。 (2)对每个CInstalledProgram对象调用ReadValues()函 数,从注册表中读取安装软件的信息。 (3)将安装软件链表中的每个CInstalledProgram对象添 加到CListCtrl控件m_list中。根据pProg>ReleaseType和pProg->ParentKeyName的值及确定软件 属于应用程序还是系统补丁,然后根据当前选择的软件 类型决定将其添加到列表中。 );

6.4.4
1.弹出右键菜单 2.打开目录 3.访问网站 4.修复软件 5.卸载软件

对软件进行操作


更多相关文档:

第6章知识点

第6章知识点_政史地_高中教育_教育专区。1.物质燃烧需要同时满足 3 个条件 ① 2.灭火的原理 ① 3.可燃物完全燃烧的条件是① 4.木炭充分燃烧生成二氧化碳,其...

第6章 部件工作原理与编程示例(1)

第5章 应用系统设计与调试... 第6章 部件工作原理与编程... 第7章 嵌入式...打开 AXD Debugger(或 ARM Debugger for Windows)的命令行窗口,执行 obey 命令...

第6章课后答案

88 第 6 章 用户界面设计 2.滚动条响应的重要...编程题 1.编写一应用程序,实现对文本框中的文本...3.设计一个类似于 Windows 操作系统的滚动屏幕保护...

Windows系统编程练习题参考答案

Windows系统编程练习题参考答案_工学_高等教育_教育专区。第1章一、选择题 1....内核模式 6.Win32 7.POSIX 8.OS/2 9.执行体服务 10.内核 11.硬件抽象层...

第6章 系统实施

可视化开发工具,容易学 习和掌握; 它提供了基于 Windows 的图形界面和事件驱动...操作和编程功能,适合快速原型系统、小型办公自动化系统的开发(对于分布式 系统、...

游洪跃C语言程序设计第6章 习题解答

第6 章 习题解答一、选择题 1.设有如下说明: ...答案:栈三、编程题 *1.定义一个结构类型变量,包括...系统提示信息 */ /* 返回值 0, 返回操作系统 *...

计算机代数系统第6章-程序设计

6页 免费 计算机代数系统第5章-方程... 22页 20财富值喜欢此文档的还喜欢 ...但是,由于程序设计本身的复杂性,因此, 在编写程序时应严格按照相关算法设计程序,...

第6章习题 - 副本

第6章 1 判断题 1-1 计算机病毒只会破坏计算机的操作系统,而对其他网络设备...Windows“控制面板”中无“本地”连接图标 3-2 当计算机上发现病毒时,最彻底...

第6章 思考习题答案

第6章 思考习题答案_理学_高等教育_教育专区。思考习题 一、选择题 1.下列不是混合身份验证模式的优点的是( D )。 A 创建了 Windows 操作系统上的另外一个安...

第6章 Windows操作系统

第6章 Windows操作系统第6章 Windows操作系统隐藏>> 第6章一、教学内容: 教学内容: Windows 操作系统 Windows 操作系统是微型机上最常用的操作系统之一,学习并使...

更多相关标签:

windows系统编程 | Windows系统编程 pdf | windows下系统编程 | linux系统编程 pdf | linux系统编程 | c c 嵌入式系统编程 | 易语言编程系统 | ks线切割编程系统 |


  本文关键词:Windows系统编程,由笔耕文化传播整理发布。



本文编号:244169

资料下载
论文发表

本文链接:https://www.wllwen.com/wenshubaike/mishujinen/244169.html


Copyright(c)文论论文网All Rights Reserved | 网站地图 |

版权申明:资料由用户917e2***提供,本站仅收录摘要或目录,作者需要删除请E-mail邮箱bigeng88@qq.com