【API】注册表编程基础

office365打不开 📅 2025-07-25 14:17:02 👤 admin 👁️ 8813 👑 994
【API】注册表编程基础

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

#include

//用于修改字符串类型键值

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

皇家推荐

固态硬盘怎么换
电信8M宽带多少钱?2024年最新资费详解
描写足球赛场面的作文 篇64
光大银行信用卡补卡需要多久
新人使用scl
阴阳师手游涅槃之火哪里掉落 涅槃之火套装图鉴