操纵系统: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://*.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改削注册表时遇到的问题(转)