VC++中使用注册表

 

如今修改注册表成为继超频之后的又一大热点,许多CFAN通过对注册表的修改使Win98显得更加个性化,诸多报刊杂志也纷纷扯起注册表这面旗帜,令人遗憾的是,在介绍注册表修改的众多的文章中,大都以手工修改为例,极少数文章也只介绍有关修改注册表软件的用法,至于如何在程序中实现却无人提及。为此我在Visual Studio6.0帮助文件中用Registry关键字进行搜索,在翻译软件帮助下及不断的上机实践下,我终于摸索出使用注册表接口(API)函数的一些用法,现拿出来与大家共享。
  在程序中使用注册表,不外乎创建、打开、读取、设置、删除这五个常规操作,(要想获得更详细的资料可以参考Visual Studio6.0帮助目录中MSDN Library Visual Studio6.0|Platform SDK|Window Base Services|General Library|Registry条目)。下面我们就来关注这五个接口函数的用法:
  一、 创建键RegCreateKeyEx
  通过RegCreateKeyEx函数可以在注册表中创建键,如果需要创建的键已经存在了,则打开键。函数原型如下:

  LONG RegCreateKeyEx(
  
HKEY hKey,
  
LPCTSTR lpSubKey,
  
DWORD Reserved,
  
LPTSTR lpClass,
  
DWORD dwOptions,
  
REGSAM samDesired,
  
LPSECURITY_ATTRIBUTESlpSecurityAttributes,
  
PHKEY phkResult,
  
LPDWORD lpdwDisposition
  
);
  各参数及返回值的含义如下:

  ·hKey为主键值,可以取下面的一些数值:
  HKEY_CLASSES_ROOTHKEY_CURRENT_CONFIG
  HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
  HKEY_USERHKEY_PERFORMANCE_DATA(WINNT操作系统
)
  HKEY_DYN_DATAWIN9X操作系统)

  ·参数lpSubKey为一个指向以零结尾的字符串的指针,其中包含将要创建或打开的子键的名称。子键不可以用反斜线(/)开始。该参数可以为NULL
  ·Reserved保留,必须设置为0
  ·参数lpClass一个指向包含键类型的字符串。如果该键已经存在,则忽略该参数。
  ·参数dwOptions为新创建的键设置一定的属性。可以取下面的一些数值:
  REG_OPTION_NON_VOLATILE 新创建的键为一个非短暂性的键(数据信息保存在文件中,当系统重新启动时,数据信息恢复)
  REG_OPTION_VOLATILE 新创建的键为一个短暂性的键(数据信息保存在内存中)。Windows95忽略该数值。
  REG_OPTION_BACKUP_RESTORE 仅在WINNT中支持,可以提供优先级支持。
  ·参数samDesired用来设置对键访问的权限,可以取下面的一些数值:
  KEY_CREATE_LINK 准许生成符号键
  KEY_CREATE_SUB_KEY 准许生成子键
  KEY_ENUMERATE_SUB_KEYS 准许生成枚举子键
  KEY_EXECUTE 准许进行读操作
  KEY_NOTIFY 准许更换通告
  KEY_QUERY_VALUE 准许查询子键
  KEY_ALL_ACCESS 提供完全访问,是上面数值的组合
  KEY_READ 是下面数值的组合:
  KEY_QUERY_VALUEKEY_ENUMERATE_SUB_KEYSKEY_NOTIFY
  KEY_SET_VALUE 准许设置子键的数值

  KEY_WRITE 是下面数值的组合:
  KEY_SET_VALUEKEY_CREATE_SUB_KEY
  ·参数lpSecurityAttributes为一个指向SECURITY_ATTRIBUTES结构的指针,确定返回的句柄是否被子处理过程继承。如果该参数为NULL,则句柄不可以被继承。在WINNT中,该参数可以为新创建的键增加安全的描述。

  ·参数phkResult为一个指向新创建或打开的键的句柄的指针。
  ·参数lpdwDispition指明键是被创建还是被打开的,可以是下面的一些数值:
  REG_CREATE_NEW_KEY 键先前不存在,现在被创建。
  REG_OPENED_EXISTING_KEY 键先前已存在,现在被打开。
  ·返回值 如果函数调用成功,则返回ERROR_SUCCESS。否则,返回值为文件WINERROR.h中定义的一个非零的错误代码,可以通过设置FORMAT_MESSAGE_FROM_SYSTEM标识调用FormatMessage函数来获取一个对错误的总体描述。
  二、 打开一个键RegOpenKeyEx
  RegOpenKeyEx函数可以打开一个指定的键,函数原型如下:

  LONG RegOpenKeyEx(
  
HKEY hkey,
  
LPCTSTR lpSubKey,
  
DWORD ulOption,
  
REGSAM samDesired,
  
PHKEY phkResult
  
);
  各参数及返回值的含义如下:

  ·参数hKey的含义同RegCreateKeyEx函数中的hKey参数。
  ·参数lpSubKey为一个指向以零结尾的字符串的指针,其中包含子键的名称,可以利用反斜线(/)分隔不同的子键名。如果字符串为空,则根据hKey参数创建一个新的句柄。在这种情况下,并不关闭先前打开的句柄。
  ·ulOption保留,通常必须设置为0
  ·参数samDesired的含义同RegCreateKeyEx函数中的samDesired参数。
  ·参数phkResult为一个指针,用来指向打开的键的句柄。可以通过RegCloseKey函数关闭这个句柄。
  ·返回值同RegCreateKeyEx函数的返回值。
  三、 读取键RegQueryValueEx
  通过RegQueryValueEx函数可以从一个已经打开的键中读取数据,函数原型如下:

  LONG RegQueryValueEx(
  
HKEY hKey,
  
LPTSTR lpValueName,
  
LPDWORD lpReserved,
  
LPDWORD lpType,
  
LPBYTE lpData,
  
LPDWORD lpcbData
  
);
  各个参数及返回值的含义如下:

  ·参数hKey为当前的一个打开的键的句柄,具体数值同RegCreateKeyEx函数的hKey参数。
  ·参数lpVauleName为一个指向非空的包含查询值的名称的字符串指针。
  ·lpReserved保留,必须为NULL
  ·参数lpType为一个指向数据类型的指针,数据类型为下列类型之一:
  REG_BINARY 二进制数据
  REG_DWORD 32位整数
  REG_DWORD_LITTLE_ENDIAN littleendian格式的数据,例如0X12345678以(0X78 0X56 0X34 0X12)方式保存
  REG_DWORD_BIG_ENDIAN bigendian格式的数据,例如0X12345678以(0X12 0X34 0X56 0X78)方式保存
  REG_EXPAND_SZ 一个包含未扩展环境变量的字符串
  REG_LINK 一个Unicode类型的链接
  REG_MULIT_SZ 以两个零结尾的字符串
  REG_NONE 无类型数值
  REG_RESOURCE_LIST 设备驱动资源列表
  REG_SZ 一个以零结尾的字符串根据函数使用的字符集类型的不同而设置为UnicodeANSI类型的字符串
  ·参数lpData为一个指向保存返回值的变量的指针。如果不需要返回值,该参数可以为NULL
  ·参数lpcbData为一个指向保存返回值长度的变量的指针。其中长度以字节为单位。如果数据类型为REG_SZREG_MULTI_SZREG_EXPAND_SZ,那么长度也包括结尾的零字符,只有在参数lpDataNULL时,参数lpcbData才可以为NULL
  ·返回值同RegCreateKeyEx函数的返回值。
  四、 设置键值RegSetValueEx
  RegSetValueEx函数可以设置注册表中键的值,函数原型如下:

  LONG RegSetValueEx
  HKEY hKey
  LPCTSTR lpValueName
  DWORD Reserved
  DWORD dwType
  CONST BYTE lpData
  DWORD cbData
  );

  各个参数及返回值的含义如下:
  ·参数hKey的含义同RegCreateKeyEx函数中的hKey参数。
  ·参数lpValueName为一个指向包含值名的字符串指针。
  ·Reserved保留,通常必须设置为0
  ·参数dwType确定了设置的值的类型同RegQueryValueKeyExlyType参数。
  ·参数lpData为一个指向包含数据的缓冲区的指针。
  ·参数cbData以字节为单位,指定数据的长度。
  ·返回值同RegCreateKeyEx函数的返回值。
  五、 删除键值RegDeketeKey
  函数RegDeketeKey删除一个键及所有的子键。函数原型如下:

  LONG RegDeleteKey
  HKEY hKey
  LPCTSTR lpSubKEY
  );

  各个参数及返回值的含义如下:
  ·参数hKey的含义同RegCreateKeyEx函数中的hKey参数。
  ·参数lpSubKey的含义同RegCreateKeyEx函数中的lpSubKey参数。
  六、 示例
  下面我们在Visual C++6.05.0环境中新建一基于对话框的工程。设置两个命令按钮,名为查询用户信息修改用户信息,用来查询和修改注册表中的用户姓名和公司名称。需要说明的是,用户的信息位于系统注册表中/KEYCURRENTUSER/Software/Micrsoft/MS Setup(ACME)/User Info/的位置,键值名DefNameDefCompany分别表示用户的姓名和用户公司的名称。
  1 查询用户信息的代码
  HKEY hKey; //定义有关的hKey,在查询结束时要关闭。
  LPCTSTR path="Software//Micrsoft//MS Setup(ACME)//User Info//”;
  LONG return0=(::RegOpenKeyEx(HKEY_CURRENT_USER,path,0,KEY_READ,
hKey));
  
if(return0!=ERROR_SUCCESS)
  
{
  MessageBox("错误:无法打开有关的键!
");
  
Return;
  
}
  
LPBYTE username_Get=new BYTE[80];
  
DWORD type_1=REG_SZ;
  
DWORD cbData_1=80;
  LONG return1=::RegQueryValueEx(hKey,"Defname:,NULL,
type_1,
  username_Get,
cbData_1);
  
if(return1!=ERROR_SUCCESS)
  
{
  MessageBox("错误:无法查询有关注册表信息!
");
  
Return;
  
}
  
LPBYTE company_Get=new BYTE[80];
  
DWORD type_2=REG_SZ;
  
DWORD cbData_2=80;
  LONG return2=::RegQueryValueEx(hKey,"DefCompany",NULL,
type_2,
  company_Get,
cbData_2);
  
if(return2!=ERROR_SUCCESS)
  
{
  MessageBox("错误:无法查询有关注册表信息!
");
  
Return;
  
}
  //username_Getcompany_Get转换为CString字符串,以便显示输出

  CString str_username=CString(username_Get);
  
CString str_company=CString(company_Get);
  
delete[] username_Get;
  
delete[] company_Get;
  //程序结束前关闭已经打开的
hKey
  
::RegCloseKey(hKey);
  
……
  字符串str_usernamestr_company表示查询的用户的姓名和公司的名称。

  2、修改用户信息的代码
  因用户输出的是CString类型的字符串,要先将其转换为LPBYTE类型,以便以后函数的调用。下面是转换函数:
  LPBYTE CString_To_LPBYTE(CString str)
  
{
  LPBYTE lpb=new BYTE [str.GetLength( )
1];
  for(int i=0;i   
lpb[str.GetLength( )]=0;
  
return lpb;
  
}
  以下是具体的修改注册表用户信息的代码:

  CString str_usernamestr_company
  HKEY hKey
  LPCTSTR path=“Software//Micrsoft//MS Setup(ACME)//User Info//”;
  LONG return0(::RegOpenKeyExHKEY_CURRENT_USERpath0KEY_WRITE,&hKey))
;
  
if(return0!=ERROR_SUCCESS)
  
{
  MessageBox(“错误:无法打开有关的键!”)

  return
  }
  
LPBYTE username_Set=Cstring_To_LPBYTE(str_username);
  
DWORD type_1=REG_SZ;
  DWORD cbData_1=str_username.GetLength( )
1;
  
LONG return1=::RegSetalueEx(hKey,"DefName",NULL,type_1,username_Set,cbData_1);
  
if (return1!=ERROR_SUCCESS)
  
{
  MessageBox(“错误:无法修改有关注册表信息!”)

  return;
  
}
  
LPBYTE company_Set=Cstring_To_LPBYTE(str_company);
  
DWORD type_2=REG_SZ;
  DWORD cbData_2=str_COMPANY.GetLength( )
1;
  
LONG return2=::RegSetalueEx(hKey,"DefCompany",NULL,type_2,company_Set,cbData_2);
  
if (return2!=ERROR_SUCCESS)
  
{
  MessageBox(“错误:无法修改有关注册表信息!”)

  return;
  }

内容概要:本文主要介绍了一项基于Pytorch框架搭建神经网络的研究【DQN实现避障控制】使用Pytorch框架搭建神经网络,基于DQN算法、优先级采样的DQN算法、DQN + 人工势场实现避障控制研究(Matlab、Python实现)工作,重点实现了DQN算法、优先级采样的DQN算法以及结合人工势场法的DQN算法在避障控制中的应用。研究通过Matlab和Python平台进行仿真与实验,旨在提升智能体在复杂环境中的自主避障能力。文中详细阐述了三种算法的设计思路、网络结构搭建、训练流程及优化策略,并通过对比实验验证了各方法的有效性与性能差异,尤其突出了DQN结合人工势场法在引导智能体快速学习安全路径方面的优势。此外,文档还列举了大量相关的科研方向与技术应用案例,涵盖无人机控制、路径规划、强化学习、电力系统优化等多个领域,展示了广泛的科研服务能力和技术积累。; 适合人群:具备一定Python和深度学习基础,熟悉强化学习基本概念的研究生、科研人员及工程技术人员;对智能控制、机器人避障、无人机路径规划等领域感兴趣的开发者。; 使用场景及目标:① 学习DQN及其改进算法(如优先经验回放)在实际控制系统中的实现方式;② 掌握如何将传统人工势场法与深度强化学习相结合以提升避障性能;③ 借鉴Matlab与Python混合仿真方法,开展智能控制算法的实验验证与对比分析;④ 拓展至无人机、无人车等智能体的自主导航系统设计。; 阅读建议:建议读者结合提供的代码资源,逐步复现实验过程,重点关注神经网络结构设计、奖励函数设定及算法收敛性分析。同时可参考文中列出的其他研究方向,拓展应用场景,提升科研创新能力。
内容【2025最新高维多目标优化】无人机三维路径规划的导航变量的多目标粒子群优化算法NMOPSO研究(Matlab代码实现)概要:本文围绕“2025最新高维多目标优化”主题,重点研究基于城市场景下无人机三维路径规划的导航变量多目标粒子群优化算法NMOPSO,并提供了完整的Matlab代码实现。该研究旨在解决复杂威胁环境下无人机路径规划中的多目标优化问题,兼顾路径安全性、能耗、距离与时效等多个目标,通过改进的粒子群算法实现高效搜索与优化。文中详细阐述了算法设计思路、数学建模过程、适应度函数构建及约束处理机制,并结合三维城市环境进行仿真实验验证其有效性。此外,文档还列举了大量相关科研方向与技术资源,涵盖智能优化算法、路径规划、无人机控制、机器学习、电力系统等多个领域,展示了广泛的科研应用场景和技术支持体系。; 适合人群:具备一定Matlab编程基础,从事无人机路径规划、智能优化算法或自动化控制等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①研究高维多目标优化算法在无人机三维路径规划中的应用;②掌握多目标粒子群优化算法(MOPSO/NMOPSO)的设计与实现方法;③复现并改进复杂环境下的无人机协同路径规划模型;④拓展至其他智能优化与控制问题的研究与仿真。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注算法核心模块的实现细节,如种群初始化、非支配排序、拥挤度计算与动态环境建模。同时可参考文中列出的其他研究案例,拓展技术视野,推动算法在实际科研项目中的迁移与应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值