Win32 API 注册表类的编制以及使用


 Win32 API 注册表类的编制以及使用 一、问题的提出 Windows 已由原来的16位 windows 3.x 升级为现今我们使用的32位windows 95/97/98 以其 Windows NT,用户不仅在使用上应逐步适应,对于程序开发人员来说在编程技术 上也应紧跟操作系统的技术发展,就如同 在 Linux 操作系统下, X-Window 编程就显 得很重要一样。作为一个完整成熟的 Windows 程序,需要保存程序所有的环境变量和 私有信息。诸如用户的偏好,文件装入的列表、退出时用户使用的窗口位置 .存盘历史 纪录等。过去在 windows 3.x时代 ,常用 Win16函数 Get/RegWrite ProfileString 将有关程序的信息写入 *.ini 文件,但现在该项技术由 Win32注册表所替代。 可以这样说,注册表是当今32位 Windows 操作系统的灵魂,一切信息都在其中,也就 是为什么Windows98在Windows95的基础上升级可以不重装软件等等 的如此方便的应用,其原理就是根据了原注册表中的信息来完成各种方便的处理,所以 Windows注册表对应用程序的重要性就显而易见了。 原来的 Win16程序存储私有信息是在一个平面文件INI中,这样做有很多弊端,例如该 INI文件没有任何安全机制,用户可以直接在INI文件中修改各种参数和程序入口,这样 就可能造成不可估计的严重后果,还有该文件只能支持和文本数据不能存入二进制数据 等各种不利因素,所以微软的工程师也认识到这一点,于是注册数据库就诞生了,注册 数据库就是为了解决在 Windows 3.x 的一些关于 OLE 的此类问题而创建的,现在 Win32 应用程序的注册数据库通过微软带给我们的新的 Win32 API 得到了显著的改 善。使用访问注册表的 Win32 函数比起使用管理 INI 文件的 Win16函数要灵活的多, 这意味着在功能上将大大增强,但是,另一方面,如果你还未用过,就会对处理注册表 的Win32 API 的新规则感到困惑或不知所措。本文就是本着这一目的,逐步让你懂得并 掌握怎样用 Win32API 函数来处理32位 Windows 程序注册表的方法。 二 . 技术的实现原理 为了在以后自己编写的程序中更多的体现模块化思想以及使编程变得更加简单,应尽可 能的建立自己实现各种功能的类,以类作为实现应用程序各种功能的单位。 在此,可 以创建一个包括注册表许多常用功能而接口简单的类库,下面将建立 CMyRegKey类,对 应用程序处理注册表的具体细节进行封装,从而在外部通过这个功能类方便地实现进行 访问注册表信息的各种操作,在外部调用其成员函数即可。以后,你就可以在每一个应 用程序中包含此类并用其外部接口进行编程了。 三 . 实现代码与步骤 1. 建立功能类的头文件: 创建一个新的头文件 MyRegKey.h ,在其中加入以下的代码。 #include "winreg.h" // 包含头文件 winreg.h , 因注册表Win32 API 函数在其内定义 // 建立 CMyRegKey 类: class CMyRegKey { // Construction public: CMyRegKey(); virtual ~CMyRegKey (); // Attributes public: // 定义打开和关闭注册表的成员函数: LONG RegRegOpen(HKEY hKeyRoot,LPCTSTR pszPath); void RegRegClose(); // 利用函数重载实现对注册表键值(串值,二进制值,DWORD值 ) 的读和写: LONG RegRead (LPCTSTR pszKey,DWORD& dwVal); LONG RegRead (LPCTSTR pszKey,CString& sVal); LONG RegRead (LPCTSTR pszKey,BYTE *pData,DWORD& dwLength); LONG RegWrite (LPCTSTR pszKey,DWORD dwVal); LONG RegWrite (LPCTSTR pszKey,LPCTSTR pszVal); LONG RegWrite (LPCTSTR pszKey,const BYTE *pData,DWORD dwLength); protected: HKEY m_hKey; CString m_sPath; }; 2. 建立功能类的Cpp文件定义 CMyRegKey类: 创建一个新文件 MyRegKey.cpp ,代码如下: #include "MyRegKey.h" / // CMyRegKey / CMyRegKey:: CMyRegKey() { m_hKey = NULL; } CMyRegKey:: ~CMyRegKey() { RegClose(); } // 定义打开注册表的函数,RegOpen 函数带有两个参数:指定要访问注册表根结点的 HKEY, 以及注 // 册表中信息的全路径。如果给入的路径不存在,则需创建一个新路径。从 RegCreateKeyEx API函数返// 回的 HKEY 作为 m_hKey 存储。 LONG CMyRegKey::RegOpen(HKEY hKeyRoot,LPCTSTR pszPath) { DWORD dw; m_sPath = pszPath; return RegCreateKeyEx(hKeyRoot,pszPath,0L,NULL,REG_OPTION_VOLATILE,KEY_ALL_ACCESS,N ULL, &m_hKey,&dw); } void CMyRegKey::RegClose() { if(m_hKey) { RegCloseKey (m_hKey); m_hKey = NULL; } } LONG CMyRegKey::RegWrite(LPCTSTR pszKey,DWORD dwVal) { ASSERT(m_hKey); ASSERT(pszKey); ASSERT(pData&&dwLength>0); ASSERT(AfxIsValidAddress(pData,dwLength,FALSE)); return RegSetValueEx(m_hKey,pszKey,0L,REG_DWORD,(CONST BYTE *)&dwVal,sizeof(DWORD)); } LONG CMyRegKey::RegWrite(LPCTSTR pszKey,LPCTSTR pszData) { ASSERT(m_hKey); ASSERT(pszKey); ASSERT(pszData); ASSERT(pData&&dwLength>0); ASSERT(AfxIsValidAddress(pszData,strlen(pszData),FALSE)); return RegSetValueEx(m_hKey,pszKey,0L,REG_SZ,(CONST BYTE *)pszData,strlen (pszData)+1); } LONG CMyRegKey::RegWrite(LPCTSTR pszKey,const BYTE *pData,DWORD dwLength) { ASSERT(m_hKey); ASSERT(pszKey); ASSERT(AfxIsValidAddress (pData,dwLength,FALSE)); ASSERT(pData&&dwLength>0); ASSERT(AfxIsValidAddress(pData,dwLength,FALSE)); return RegSetValueEx(m_hKey,pszKey,0L,REG_BINARY,pData,dwLength); } LONG CMyRegKey::RegRead (LPCTSTR pszKey,DWORD& dwVal) { ASSERT(m_hKey); ASSERT(pszKey); DWORD dwType; DWORD dwSize = sizeof (DWORD); DWORD dwDest; LONG LRet = RegQueryValueEx(m_hKey,(LPSTR)pszKey,NULL,&dwType,(BYTE *) &dwDest,&dwSize); if(LRet==ERROR_SUCCESS) dwVal = dwDest; return LRet; } LONG CMyRegKey::RegRead (LPCTSTR pszKey,CString& sVal) { ASSERT(m_hKey); ASSERT(pszKey); DWORD dwType; DWORD dwSize = 200; char string[200]; LONG IReturn = RegQueryValueEx(m_hKey,(LPSTR)pszKey,NULL,&dwType,(BYTE *) string,&dwSize); if(IReturn==ERROR_SUCCESS) sVal = string; return IReturn; } LONG CMyRegKey::RegRead (LPCTSTR pszKey,BYTE * pData,DWORD& dwLen) { ASSERT(m_hKey); ASSERT(pszKey); DWORD dwType; return RegQueryValueEx(m_hKey,(LPSTR)pszKey,NULL,&dwType,pData,&dwLen); } 在用户需要使用时只需在你的 Project 中的 SorceFile 和 HeadFile 中分别加入 MyRegKey.cpp 以及 MyRegKey.h 程序文件。 四 . 使用外部接口示例 在VC中建立一个基于对话框(Dialog Base) 的应用程序,在对话框上放上几个Edit control 的控件,如同示例小程序 RegTech 框(见图一), 程序执行时,首先读出注 册表信息分别显示在三个编辑栏中,为了演示写入操作,你可以在注册用户栏中重新输 入用户名,按更改完成写入,重新运行程序,查看写入是否成功。在RegTech 框中安置 了三个编辑栏,ID 为 IDC_INSTALL,IDC_USERID,IDC_VERSION, 用ClassWizard 的Member Variable 分别加上对象参数:m_Install, m_UserID 和 m_Version. 用参数来传递注册表键值。 在初始化对话框时就应打开注册表并读取所需的信息,这三项存放路径为 HKEY_LOCAL_MACHINE /SOFTWARE /Microsoft /Windows /CurrentVersion下, 分别读出windows 版本号(放置于Version键值中),注册用户名(放置于 RegisteredOwner键值中),Windows 安装目录(放置于SystemRoot 键值中 ),更多 的信息请使用Windows 目录下的 RegEdit.exe程序. 需用到注册表类的原程序文件中加上 #inxlude " MyRegKey.h"  即可。 在文件 RegTechDlg.cpp 中初始化对话框的地方加上以下代码打开路径并读取键值: BOOL CRegtechDlg::OnInitDialog() { CDialog::OnInitDialog(); ...................... ...................... // TODO: Add extra initialization here file://########################################### // 打开注册表路径 . CMyRegKey regKey1,regKey2,regKey3; regKey1.RegOpen(HKEY_LOCAL_MACHINE, _T("Software//Microsoft//Windows//CurrentVersion")); regKey2.RegOpen(HKEY_LOCAL_MACHINE, _T("Software//Microsoft//Windows//CurrentVersion")); regKey3.RegOpen(HKEY_LOCAL_MACHINE, _T("Software//Microsoft//Windows//CurrentVersion")); // 读取键值并分别传递到编辑控件参数中去: regKey1.RegRead(_T("Version"),m_Version); regKey2.RegRead(_T("RegisteredOwner"),m_UserID); regKey3.RegRead(_T("SystemRoot"),m_Install); UpdateData(FALSE); file://############################################ return TRUE; // return TRUE unless you set the focus to a control } 在重新输入了注册用户名后,按下更改按钮(按钮控件ID_ChangeID),将完成注册表 的写入操作: void CRegtechDlg::OnChangeID() { file://######################## CMyRegKey regKey; regKey.RegOpen(HKEY_LOCAL_MACHINE, _T("SOFTWARE//Microsoft//Windows//CurrentVersion")); // 传递从编辑拦输入的值并写入打开路径的指定键值名中: UpdateData(TRUE); regKey.RegWrite(_T("RegisteredOwner"),m_UserID); MessageBox("更改注册用户名完毕!","Message",MB_ICONINFORMATION|MB_OK); ///######################### // TODO: Add your control notification handler code here } 注册表类在实际应用程序编制中使用频率极高,比如程序员自定义的文件的图标选择等 的很多地方都要用到,所以一个成熟优秀的应用程序应尽可能的适应环境及发挥操作系 统的各种优势,在此,使用win32 API对Windows灵魂--注册表存取技术的操作已完 ,你就可以利用它来完善自己的应用程序了。 
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
<p> <span style="font-size:14px;color:#337FE5;">【为什么学爬虫?】</span> </p> <p> <span style="font-size:14px;">       1、爬虫入手容易,但是深入较难,如何写出高效率爬虫,如何写出灵活性高可扩展爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要数据,这门课程,你都能学到!</span> </p> <p> <span style="font-size:14px;">       2、如果是作为一个其他行业开发者,比如app开发,web开发,学习爬虫能让你加强对技术认知,能够开发出更加安全软件和网站</span> </p> <p> <br /> </p> <span style="font-size:14px;color:#337FE5;">【课程设计】</span> <p class="ql-long-10663260"> <span> </span> </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 一个完整爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 网络请求:模拟浏览器行为从网上抓取数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据解析:将请求下来数据进行过滤,提取我们想要数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据存储:将提取到数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 那么本课程也是按照这几个步骤循序渐进进行讲解,带领学生完整掌握每个步骤技术。另外,因为爬虫多样性,在爬取过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序灵活性,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。 </li> <li class="" style="font-size:11pt;color:#494949;"> Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 通过爬虫进阶知识点我们能应付大量反爬网站,而Scrapy框架作为一个专业爬虫框架,使用他可以快速提高我们编写爬虫程序效率和速度。另外如果一台机器不能满足你需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。 </p> <p style="font-size:11pt;color:#494949;">   </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 从基础爬虫到商业化应用爬虫,本套课程满足您所有需求! </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> <br /> </p> <p> <br /> </p> <p> <span style="font-size:14px;background-color:#FFFFFF;color:#337FE5;">【课程服务】</span> </p> <p> <span style="font-size:14px;">专属付费社群+定期答疑</span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"><br /> </span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"></span> </p>
<div style="color:rgba(0,0,0,.75);"> <span style="color:#4d4d4d;"> </span> <div style="color:rgba(0,0,0,.75);"> <span style="color:#4d4d4d;"> </span> <div style="color:rgba(0,0,0,.75);"> <div style="color:rgba(0,0,0,.75);"> <span style="color:#4d4d4d;">当前课程中商城项目实战源码是我发布在 GitHub 上开源项目 newbee-mall (新蜂商城),目前已有 6300 多个 star,</span><span style="color:#4d4d4d;">本课程是一个 Spring Boot 技术栈实战课程,课程共分为 3 大部分,前面两个部分为基础环境准备和相关概念介绍,第三个部分是 Spring Boot 商城项目功能讲解,让大家实际操作并实践上手一个大型线上商城项目,并学习到一定开发经验以及其中开发技巧。<br /> 商城项目所涉及功能结构图整理如下:<br /> </span> </div> <div style="color:rgba(0,0,0,.75);">   </div> <div style="color:rgba(0,0,0,.75);"> <p style="color:#4d4d4d;"> <img alt="modules" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3N0b3JlL25ld2JlZS1tYWxsLXMucG5n?x-oss-process=image/format,png" /> </p> </div> <p style="color:rgba(0,0,0,.75);"> <strong><span style="color:#e53333;">课程特色</span></strong> </p> <p style="color:rgba(0,0,0,.75);">   </p> <div style="color:rgba(0,0,0,.75);">   </div> <div style="color:rgba(0,0,0,.75);"> <ul> <li> 对新手开发者十分友好,无需复杂操作步骤,仅需 2 秒就可以启动这个完整商城项目 </li> <li> 最终实战项目是一个企业级别 Spring Boot 大型项目,对于各个阶段 Java 开发者都是极佳选择 </li> <li> 实践项目页面美观且实用,交互效果完美 </li> <li> 教程详细开发教程详细完整、文档资源齐全 </li> <li> 代码+讲解+演示网站全方位保证,向 Hello World 教程说拜拜 </li> <li> 技术栈新颖且知识点丰富,学习后可以提升大家对于知识理解和掌握,可以进一步提升你市场竞争力 </li> </ul> </div> <p style="color:rgba(0,0,0,.75);">   </p> <p style="color:rgba(0,0,0,.75);"> <span style="color:#e53333;">课程预览</span> </p> <p style="color:rgba(0,0,0,.75);">   </p> <div style="color:rgba(0,0,0,.75);">   </div> <div style="color:rgba(0,0,0,.75);"> <p style="color:#4d4d4d;"> 以下为商城项目页面和功能展示,分别为: </p> </div> <div style="color:rgba(0,0,0,.75);"> <ul> <li> 商城首页 1<br /> <img alt="" src="https://img-bss.csdnimg.cn/202103050347585499.gif" /> </li> <li> 商城首页 2<br /> <img alt="" src="https://img-bss.csdn.net/202005181054413605.png" /> </li> <li>   </li> <li> 购物车<br /> <img alt="cart" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3QvY2FydC5wbmc?x-oss-process=image/format,png" /> </li> <li> 订单结算<br /> <img alt="settle" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3Qvc2V0dGxlLnBuZw?x-oss-process=image/format,png" /> </li> <li> 订单列表<br /> <img alt="orders" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3Qvb3JkZXJzLnBuZw?x-oss-process=image/format,png" /> </li> <li> 支付页面<br /> <img alt="" src="https://img-bss.csdn.net/201909280301493716.jpg" /> </li> <li> 后台管理系统登录页<br /> <img alt="login" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3QvbWFuYWdlLWxvZ2luLnBuZw?x-oss-process=image/format,png" /> </li> <li> 商品管理<br /> <img alt="goods" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3QvbWFuYWdlLWdvb2RzLnBuZw?x-oss-process=image/format,png" /> </li> <li> 商品编辑<br /> <img alt="" src="https://img-bss.csdnimg.cn/202103050348242799.png" /> </li> </ul> </div> </div> </div> </div>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值