zoukankan      html  css  js  c++  java
  • 【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
    ", 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
    ", 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

  • 相关阅读:
    打印出1-10000之间的所有对称数(如121,1331,2442)
    代码块
    javascript判断数据类型
    块和内嵌
    xhtml+css基础知识2
    xhtml+css基础知识1
    清除浮动
    margin注意问题
    javascirpt 闭包
    css3 box-sizing属性
  • 原文地址:https://www.cnblogs.com/17bdw/p/8454716.html
Copyright © 2011-2022 走看看