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的更多相关文章

  1. C++ 注册表编程

    原文 C++ 注册表编程 1.基础知识 注册表的组织方式跟文件目录比较相似,主要分为根键.子键和键值项三部分,与文件目录对应的话就是根目录.子目录和文件.分别介绍一下这三部分: (1)根键.分为5个, ...

  2. windows 注册表编程

    例子:将本地计算机的Monitor ID写入到注册表中 (1)获取MonitorID BOOLEAN DeviceMonitorService::EnumClassDevice(const GUID ...

  3. 注册表 API 以及开机自启动

    注册表是window系统中非常重要的一部分,今天在网上查了一些文章学习了下,觉得其中有一句话总结的很经典:注册表是用来存储信息的. 这句话虽然有点废,但是说的没错.当然,注册表中包含的内容非常多,远没 ...

  4. WIN7/XP用注册表关联指定后缀名和打开程序(手动【图文】和C编程两种实现)

    前言: 本文是基本原理介绍和手动的操作.程序实现该功能在http://blog.csdn.net/arvon2012/article/details/7839556,同时里面有完整代码的下载. 今天在 ...

  5. Win.ini和注册表的读取写入

    最近在做打包的工作,应用程序的配置信息可以放在注册表文件中,但是在以前的16位操作系统下,配置信息放在Win.ini文件中.下面介绍一下Win.ini文件的读写方法和注册表的编程. 先介绍下Win.i ...

  6. 10#Windows注册表的那些事儿

    引言 用了多年的Windows系统,其实并没有对Windows系统进行过深入的了解,也正是由于Windows系统不用深入了解就可以简单上手所以才有这么多人去使用.笔者是做软件开发的,使用的基本都是Wi ...

  7. C#注册表操作类--完整优化版

    using System; using System.Collections.Generic; using System.Text; using Microsoft.Win32; namespace ...

  8. C#注册表读写完整操作类

    1.注册表基项静态域 /// <summary> /// 注册表基项静态域 ///1.Registry.ClassesRoot 对应于HKEY_CLASSES_ROOT 主键 ///2.R ...

  9. C#注册表操作类(完整版) 整理完整

    /// <summary> /// 注册表基项静态域 /// /// 主要包括: /// 1.Registry.ClassesRoot 对应于HKEY_CLASSES_ROOT主键 /// ...

随机推荐

  1. Linux内核分析——构造一个简单的Linux系统MenuOS

    马悦+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.Linux内核源代码简 ...

  2. 《Linux内核设计与实现》读书笔记——第一、 二章

    <Linux内核设计与实现>读书笔记--第一. 二章 标签(空格分隔): 20135321余佳源 第一章 Linux内核简介 1.Unix内核特点 十分简洁:仅提供几百个系统调用并且有明确 ...

  3. Linux内核分析(第二周)

    操作系统是如何工作的? 一.总结:三大法宝 1.存储程序计算机 + 函数调用堆栈 + 中断机制 2.堆栈:C语言程序运行时候必须的一个记录调用路径和参数的空间(函数调用框架/提供局部变量/传递参数/保 ...

  4. 使用SSH过程中遇到的几个问题及解决方案

    一.HTTP Status 500 - org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException: B ...

  5. 第二个spring冲刺总结

    讨论成员:罗凯旋.罗林杰.吴伟锋.黎文衷 第二阶段总体是做到了四则运算的demo,,包括APP进入动画,以及界面的基本效果设计,还有能进行综合计算(选择题,可以 自动生成简单,容易,困难 三种难度  ...

  6. Daily Scrum 11.1

    今天放假一天,明天又是新的一周,预计开始Alpha版本所有功能的整合和优化,争取在两天内完成各种功能的整合. Member Task on 11.1 Task on 11.2 仇栋民 放假一天 开始T ...

  7. Redis分布式锁的实现

    前段时间,我在的项目组准备做一个类似美团外卖的拼手气红包[第X个领取的人红包最大],基本功能实现后,就要考虑这一操作在短时间内多个用户争抢同一资源的并发问题了,类似于很多应用如淘宝.京东的秒杀活动场景 ...

  8. 4 vuex的安装

    安装可以看,引入又问题https://blog.csdn.net/u014196765/article/details/78022065?locationNum=9&fps=1(引入) htt ...

  9. SSM项目POST中文乱码解决方案

    在本地搞了一个SSM的项目练手,修改数据的时候,提交中文数据后居然乱码了.网上一顿狂搜,最终花了几个小时终于解决. 遂加以记录,以便不时之需. 就这么个表单,如果提交中文修改就会乱码,首先确定项目和数 ...

  10. Codeforces Round #528 Div. 1 自闭记

    整天自闭. A:有各种讨论方式.我按横坐标排了下然后讨论了下纵坐标单调和不单调两种情况.写了15min也就算了,谁能告诉我printf和cout输出不一样是咋回事啊?又调了10min啊?upd:突然想 ...