【API】注册表编程基础-RegCreateKeyEx、RegSetValueEx
1、环境:
操作系统:Windows 10 x64
编译器:VS2015
2、关键函数
LONG WINAPI RegCreateKeyEx(
_In_ HKEY hKey,
_In_ LPCTSTR lpSubKey,
_Reserved_ DWORD Reserved,
_In_opt_ LPTSTR lpClass,
_In_ DWORD dwOptions,
_In_ REGSAM samDesired,
_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
_Out_ PHKEY phkResult,
_Out_opt_ LPDWORD lpdwDisposition
);
字段说明
- In HKEY hKey, 打开注册表项的句柄。
- In LPCTSTR lpSubKey, 一子项,此功能打开或创建名称。
- Reserved DWORD Reserved, 此参数已保留,必须为零。
- In_opt LPTSTR lpClass, 此密钥的用户定义类类型。此参数可能被忽略。此参数可以为null。
- In DWORD dwOptions,
入参,该参数可以是以下值
- REG_OPTION_BACKUP_RESTORE,0x00000004L
- REG_OPTION_NON_VOLATILE,0x00000000L ,一般使用该值
- REG_OPTION_VOLATILE,0x00000001L
In REGSAM samDesired, 定义访问权限
In_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes, 指定要创建的密钥的访问权限的掩码。可选
Out PHKEY phkResult, 指向接收到已打开或创建的密钥句柄的变量的指针。
Out_opt LPDWORD lpdwDisposition
出参,可以是以下值。如果为空,则不返回。
- REG_CREATED_NEW_KEY,0x00000001L 该键是新创建的键
- REG_OPENED_EXISTING_KEY,0x00000002L 该键是已经存在的键
3、遇到问题
遇到问题1:
根据写入的返回值确认成功,可是注册表无变化,因为在64位Windows上,部分注册表项分别存储在32位应用程序和64位应用程序中,并使用注册表重定向器和注册表反射映射到单独的逻辑注册表视图,因为64位版本的应用程序可能会使用不同于32位版本的注册表项和值。
遇到问题2:
写入数据为乱码,因为cbData不能太大,否则很可能把lpData指向的内容之外的其他字符也写入注册表中。
4、代码
// 20180218_注册表编程基础.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <Windows.h>
//用于修改字符串类型键值
void CreateStringReg(HKEY hRoot, wchar_t *szSubKey, wchar_t * ValueName, TCHAR *Data)
{
HKEY hKey;
// 打开注册表键,不存在则创建它
size_t lRet = RegCreateKeyEx(hRoot, szSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL);
if (lRet != ERROR_SUCCESS)
{
printf("error no RegCreateKeyEx %ls\n", szSubKey);
return;
}
// 修改注册表键值,没有则创建它
size_t iLen = wcslen(Data);
// 设置键值
lRet = RegSetValueEx(hKey, ValueName, 0, REG_SZ, (CONST BYTE*)Data, sizeof(TCHAR)*iLen);
if (lRet != ERROR_SUCCESS)
{
printf("error no RegSetValueEx %ls\n", ValueName);
return;
}
RegCloseKey(hKey);
}
int main()
{
// 要修改成的网址
TCHAR StartPage[254];
// 垃圾数据置0
memset(StartPage, 0, sizeof(StartPage));
// 赋值字符串到数组中
wcsncpy_s(StartPage, TEXT("http://www.baidu.com"), 254);
//调用修改字符串类型键值的函数
CreateStringReg(HKEY_CURRENT_USER, L"Software\\Microsoft\\Internet Explorer\\Main", L"Start Page", StartPage);
return 0;
}
5、效果

6、参考:
How to use RegCreateKeyEx?
https://stackoverflow.com/questions/29115493/how-to-use-regcreatekeyex
32-bit and 64-bit Application Data in the Registry
https://msdn.microsoft.com/en-us/library/windows/desktop/ms724072(v=vs.85).aspx
使用RegSetValueEx修改注册表时遇到的问题(转)
http://www.cnblogs.com/happykoukou/p/8266983.html
【API】注册表编程基础-RegCreateKeyEx、RegSetValueEx的更多相关文章
- C++ 注册表编程
原文 C++ 注册表编程 1.基础知识 注册表的组织方式跟文件目录比较相似,主要分为根键.子键和键值项三部分,与文件目录对应的话就是根目录.子目录和文件.分别介绍一下这三部分: (1)根键.分为5个, ...
- windows 注册表编程
例子:将本地计算机的Monitor ID写入到注册表中 (1)获取MonitorID BOOLEAN DeviceMonitorService::EnumClassDevice(const GUID ...
- 注册表 API 以及开机自启动
注册表是window系统中非常重要的一部分,今天在网上查了一些文章学习了下,觉得其中有一句话总结的很经典:注册表是用来存储信息的. 这句话虽然有点废,但是说的没错.当然,注册表中包含的内容非常多,远没 ...
- WIN7/XP用注册表关联指定后缀名和打开程序(手动【图文】和C编程两种实现)
前言: 本文是基本原理介绍和手动的操作.程序实现该功能在http://blog.csdn.net/arvon2012/article/details/7839556,同时里面有完整代码的下载. 今天在 ...
- Win.ini和注册表的读取写入
最近在做打包的工作,应用程序的配置信息可以放在注册表文件中,但是在以前的16位操作系统下,配置信息放在Win.ini文件中.下面介绍一下Win.ini文件的读写方法和注册表的编程. 先介绍下Win.i ...
- 10#Windows注册表的那些事儿
引言 用了多年的Windows系统,其实并没有对Windows系统进行过深入的了解,也正是由于Windows系统不用深入了解就可以简单上手所以才有这么多人去使用.笔者是做软件开发的,使用的基本都是Wi ...
- C#注册表操作类--完整优化版
using System; using System.Collections.Generic; using System.Text; using Microsoft.Win32; namespace ...
- C#注册表读写完整操作类
1.注册表基项静态域 /// <summary> /// 注册表基项静态域 ///1.Registry.ClassesRoot 对应于HKEY_CLASSES_ROOT 主键 ///2.R ...
- C#注册表操作类(完整版) 整理完整
/// <summary> /// 注册表基项静态域 /// /// 主要包括: /// 1.Registry.ClassesRoot 对应于HKEY_CLASSES_ROOT主键 /// ...
随机推荐
- Linux内核分析 读书笔记 (第一章、第二章)
第一章 Linux内核简介 1.1 Unix的历史 Unix很简洁,仅仅提供几百个系统调用并且有一个非常明确的设计目的. 在Unix中,所有东西都被当做文件,这种抽象使对数据和对设备的操作是通过一套相 ...
- 20135323符运锦----第三周:构建一个简单的Linux系统MenuOS
相关知识点 1.arch目录 占据相当庞大的空间,X86目录下代码需要重点关注. 2.init目录 内核启动的相关代码基本都在此目录下,内含MAIN.C,文件中START_KERNEL是整个LINUX ...
- Daily Scrum - 12/07
Meeting Minutes 确认基本完成了UI组件的基本功能的动画实现: 准备开始实行UI组件的合并: 讨论了长期计划算法的难点,以及简单版本的实现方案. 督促大家更新TFS: Burndown ...
- Win 2008 r2 远程桌面多用户登陆,一用户多登陆配置
Windows 2008 R2远程桌面,设置最大连接数,一个登录后另一个就被踢掉等问题 Windows 2008 R2配置如图: 1.打开远程桌面回话主机配置 2.右键RDP-Tcp,属性,可设置最大 ...
- 『编程题全队』Alpha阶段发布说明
1. 这一版本的功能 (1)管理个人的任务事项,管理用户的提醒事项,提供一个简洁的操作界面,将其分类为全部.今天.明日.最近七天.更远.还有已完成,方便用户进行事务管理和整理. (2)提供一个便捷的备 ...
- 开机自启动nginx,php-fpm
开机自启动nginx,php-fpm(其他服务类似) centos 7以上是用Systemd进行系统初始化的,Systemd 是 Linux 系统中最新的初始化系统(init),它主要的设计目标是克服 ...
- springMVC下出现http 400错误
参数绑定过程中类型转换失败 Failed to convert property value of type 'java.lang.String' to required type 'java.uti ...
- Python学习---------登陆系统代码实现
题目要求: 一.编写登陆入口 1.输入用户名密码 2.认证成功后显示欢迎的信息 3.输错三次后锁定 Readme: 1.本次实现了登陆系统,若锁定就输出为锁定用户(锁定信息保存在user_lock.t ...
- webapi Route 特性
转载:http://www.th7.cn/Program/net/201410/302571.shtml ASP.NET Web API路由,简单来说,就是把客户端请求映射到对应的Action上的过程 ...
- 【刷题】LOJ 6002 「网络流 24 题」最小路径覆盖
题目描述 给定有向图 \(G = (V, E)\) .设 \(P\) 是 \(G\) 的一个简单路(顶点不相交)的集合.如果 \(V\) 中每个顶点恰好在 \(P\) 的一条路上,则称 \(P\) 是 ...