注册表操作总结

参考及摘抄自文章:http://www.cnblogs.com/lartely/archive/2011/04/10/2011770.html

              http://blog.csdn.net/sunboy_2050/article/details/7753662

基础知识:


注册表的组织方式跟文件目录比较相似,主要分为根键、子键键值项三部分,与文件目录对应的话就是根目录、子目录和文件。分别介绍一下这三部分:
1.根键共有5个,分别为HKEY_CLASSES_ROOTHKEY_CURRENT_USER,HKEY_LOCAL_MACHINE,HKEY_USERS和HKEY_CURRENT_CONFIG,把它们理解成磁盘的五个分区可以了。
2.子键可以有多个子键和键值项,就像一个目录中可以有多个子目录和多个文件一样。
3.键值项可以理解为文件它由三部分组成,分别为名称、类型、数据。
类型又分为多种主要包括如下:
REG_BINARY 二进制数据
REG_DWORD 32位双字节数据
REG_SZ 以0结尾的字符串
REG_DWORD_BIG_ENDIAN 高位排在底位的双字
REG_EXPAND_SZ 扩展字符串,可以加入变量如%PATH%
REG_LINK UNICODE 符号链接
REG_RESOURCE_LIST 设备驱动程序资源列表
REG_MULTI_SZ 多字符串
注册表数据项的数据类型有8种,但最常用的主要是前3种。

常用API:


1.打开/关闭注册表键

LONG WINAPI RegOpenKeyEx(
  _In_        HKEY hKey,         // 父键句柄
  _In_opt_    LPCTSTR lpSubKey,  // 子键的名称
  _Reserved_  DWORD ulOptions,   // 保留项,传0即可
  _In_        REGSAM samDesired, // 访问权限
  _Out_       PHKEY phkResult    // 返回子键的句柄
);

HKEY hKey------

    父键的句柄,可为RegCreateKeyEx或RegOpenKeyEx返回的注册表键句柄

    或为预定义的根键HKEY_CLASSES_ROOT,HKEY_CURRENT_USER,HKEY_LOCAL_MACHINE,HKEY_USERS或HKEY_CURRENT_CONFIG

REGSAM samDesired------

    访问权限,想方便的话可以指定为KEY_ALL_ACCESS这样什么权限都有了。其他常用的权限还有KEY_READ,KEY_WRITE等。

成功开启子键则返回ERROR_SUCCESS

LONG WINAPI RegCloseKey(
  _In_  HKEY hKey
);

这两个函数需配对使用

// 打开注册表键------
HKEY hKey;
LPCTSTR lpszSubKey = TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall");
int ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
if (ret != ERROR_SUCCESS)
{
	// 打开失败
	......
}

......
		
// 关闭注册表键------
RegCloseKey(hKey);

2.获取注册表键的子键及键值的信息

每个注册表键下面都包含子键及键值项,RegQueryInfoKey函数用于获取子键的数量,键值项的数量等信息。

LONG WINAPI RegQueryInfoKey(
  _In_        HKEY hKey,               // 要获取信息的注册表键句柄
  _Out_opt_   LPTSTR lpClass,          // 一般传NULL
  _Inout_opt_ LPDWORD lpcClass,        // 一般传NULL
  _Reserved_  LPDWORD lpReserved,      // NULL
  _Out_opt_   LPDWORD lpcSubKeys,      // hKey下的子键数量
  _Out_opt_   LPDWORD lpcMaxSubKeyLen, // hKey下的子键名称的最大长度(不包含结尾的null字符)
  _Out_opt_   LPDWORD lpcMaxClassLen,  // 一般传NULL
  _Out_opt_   LPDWORD lpcValues,       // hKey下的键值的数量
  _Out_opt_   LPDWORD lpcMaxValueNameLen, // hKey下键值Name的最大长度(不包含结尾的null字符)
  _Out_opt_   LPDWORD lpcMaxValueLen,     // hKey下的键值Data的最大长度(in bytes)
  _Out_opt_   LPDWORD lpcbSecurityDescriptor, // 安全描述符长度,一般传NULL
  _Out_opt_   PFILETIME lpftLastWriteTime     // 最后修改时间,一般传NULL
);

通过RegQueryInfoKey获取了子键及键值项的信息后,这才知道子键的数量,键值项的数量等信息,后面就可以通过RegEnumKeyEx枚举子键信息,通过RegEnumValue枚举键值项信息

DWORD dwSubKeyCnt;	        // 子键的数量
DWORD dwSubKeyNameMaxLen;   // 子键名称的最大长度(不包含结尾的null字符)
DWORD dwKeyValueCnt;        // 键值项的数量
DWORD dwKeyValueNameMaxLen; // 键值项名称的最大长度(不包含结尾的null字符)
DWORD dwKeyValueDataMaxLen; // 键值项数据的最大长度(in bytes)
int ret = RegQueryInfoKey(
	hKey,
	NULL,
	NULL,
	NULL,
	&dwSubKeyCnt,
	&dwSubKeyNameMaxLen,
	NULL,
	&dwKeyValueCnt,
	&dwKeyValueNameMaxLen,
	&dwKeyValueDataMaxLen,
	NULL,
	NULL);
if (ret != ERROR_SUCCESS) // Error
{
	......
}

3.枚举子键信息

LONG WINAPI RegEnumKeyEx(
  _In_         HKEY hKey,
  _In_         DWORD dwIndex,      // 索引,从0开始
  _Out_        LPTSTR lpName,      // 接收子键的名称
  _Inout_      LPDWORD lpcName,    // lpName的大小(in characters,包含null)
  _Reserved_   LPDWORD lpReserved, // NULL
  _Inout_      LPTSTR lpClass,     // 一般传NULL
  _Inout_opt_  LPDWORD lpcClass,   // 一般传NULL
  _Out_opt_    PFILETIME lpftLastWriteTime  // 一般传NULL
);

前面通过RegQueryInfoKey获取了hKey下子键的数量以及子键名称的最大长度,那么接下来通过RegEnumKeyEx就可以获取每个子键的名称了。为什么要获取子键的名称,因为获取了这个名称之后,就可以通过RegOpenKeyEx开启子键获得其句柄。

整个流程差不多是这样子的:RegQueryInfoKey-->获得某注册表键下的子键的数量及子键名称的最大长度-->RegEnumKeyEx-->枚举获取每个子键的名称-->RegOpenKeyEx-->开启子键句柄-->做你想要的操作。

lpName------

    前面通过RegQueryInfoKey获取了子键名称的最大长度(没有包含结尾的null字符),所有可以通过定义一个[最大长度+1]大小的Buffer来接收

lpcName------

    RegQueryInfoKey获取的子键名称的最大长度 + 1

//
// 以下代码中的变量dwSubKeyNameMaxLen&dwSubKeyCnt由
// RegQueryInfoKey获取
//
LPTSTR lpszSubKeyName = new TCHAR[dwSubKeyNameMaxLen+1];
for (int index = 0; index < dwSubKeyCnt; ++index)
{
	memset(lpszSubKeyName, 0, sizeof(TCHAR)*(dwSubKeyNameMaxLen+1));
	DWORD dwNameCnt = dwSubKeyNameMaxLen + 1;
	int ret = RegEnumKeyEx(
		hKey,
		index,
		lpszSubKeyName,
		&dwNameCnt,
		NULL,
		NULL,
		NULL,
		NULL);
	if (ret != ERROR_SUCCESS)
	{
		......
	}
}
delete[] lpszSubKeyName;

4.枚举键值项信息

LONG WINAPI RegEnumValue(
  _In_         HKEY hKey,
  _In_         DWORD dwIndex,         // 索引,从0开始
  _Out_        LPTSTR lpValueName,    // 接收键值项的名称
  _Inout_      LPDWORD lpcchValueName,// lpValueName的大小,包含null character
  _Reserved_   LPDWORD lpReserved,    // NULL
  _Out_opt_    LPDWORD lpType,        // 接收键值项的类型
  _Out_opt_    LPBYTE lpData,         // 接收键值项的数据
  _Inout_opt_  LPDWORD lpcbData       // lpData的Buffer大小(in bytes)
);

前面通过RegQueryInfoKey获取了hKey下键值项的数量以及键值项名称的最大长度,键值项数据的最大长度,那么接下来通过RegEnumValue就可以获取每个键值项的名称、类型、数据

//
// 以下代码中变量:dwKeyValueCnt & dwKeyValueNameMaxLen &
//                dwKeyValueDataMaxLen
// 均为通过RegQueryInfoKey获取的
//
for (unsigned int index = 0; index < dwKeyValueCnt; ++index)
{
	LPTSTR lpszKeyValueName = new TCHAR[dwKeyValueNameMaxLen + 1];
	memset(lpszKeyValueName, 0, sizeof(TCHAR)*(dwKeyValueNameMaxLen + 1));
	DWORD  dwNameCnt = dwKeyValueNameMaxLen + 1;
	DWORD  dwKeyValueType;
	LPBYTE lpbKeyValueData = new BYTE[dwKeyValueDataMaxLen];
	DWORD  dwKeyValueDataLen;
	
	int ret = RegEnumValue(
		hKey, 
		index, 
		lpszKeyValueName,
		&dwNameCnt, 
		NULL, 
		&dwKeyValueType,  
		lpbKeyValueData,
		&dwKeyValueDataLen);
	if (ret != ERROR_SUCCESS)
	{
		......
	}
	delete[] lpszKeyValueName;
	delete[] lpbKeyValueData;
}
5.由键值项名称获取键值项的类型及键值项数据

LONG WINAPI RegQueryValueEx(
  _In_         HKEY hKey,
  _In_opt_     LPCTSTR lpValueName, // 键值项名称
  _Reserved_   LPDWORD lpReserved,  // NULL
  _Out_opt_    LPDWORD lpType,      // 接收键值项类型
  _Out_opt_    LPBYTE lpData,       // 接收键值项数据
  _Inout_opt_  LPDWORD lpcbData     // lpData的Buffer大小(in bytes)
);

有时候,我们知道某注册表键下的键值项的名称,而想获取键值项的类型及键值项数据,就可以通过该函数获取。

比如:我们知道HKEY_CURRENT_USER\Environment注册表键下存在名为"Path"的键值项,通过该函数就可以获取其值。

通常情况下,虽然我们知道键值项的名称,却不知道键值项数据的大小,也即lpData该如何定义?可以分两步实现:一、调用RegQueryValueEx,但传lpData为NULL,函数执行成功后,lpcbData会返回键值项数据的大小。二、根据上一步获取的键值项数据的大小,new一个对应大小的Buffer,然后再调用RegQueryValueEx,传递lpData为新开辟的Buffer,这样就可以了。

// 获取键值项Data的大小
LPCTSTR lpszKeyValueName = TEXT("???");
DWORD dwKeyValueType;
DWORD dwKeyValueDataSize;
int ret = RegQueryValueEx(hKey, lpszKeyValueName, NULL, &dwKeyValueType, NULL, &dwKeyValueDataSize);
if (ret != ERROR_SUCCESS)
{
	......
}

// 获取键值项Data
LPBYTE lpbKeyValueData = new BYTE[dwKeyValueDataSize];
ret = RegQueryValueEx(hKey, lpszKeyValueName, NULL, &dwKeyValueType, lpbKeyValueData, &dwKeyValueDataSize);
if (ret != ERROR_SUCCESS)
{
	......
}

delete[] lpbKeyValueData;

6.设置键值项的值/新建键值项

LONG RegSetValueEx(
  HKEY hKey,
  LPCWSTR lpValueName,
  DWORD Reserved,
  DWORD dwType,
  const BYTE* lpData,
  DWORD cbData
);

该函数也可以新建键值项,当lpValueName指定名称的键值项不存在时,会新建键值项。

7.删除键值项

LONG RegDeleteValue(
  HKEY hKey,
  LPCWSTR lpValueName
); 

8.创建、删除子键

LONG RegCreateKeyEx(
  HKEY hKey,
  LPCWSTR lpSubKey,
  DWORD Reserved,
  LPWSTR lpClass,
  DWORD dwOptions,
  REGSAM samDesired,
  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  PHKEY phkResult,
  LPDWORD lpdwDisposition
);
LONG WINAPI RegDeleteKey(
  _In_  HKEY hKey,
  _In_  LPCTSTR lpSubKey
);

示例程序一:读取注册表获取计算机上已安装程序的信息


Windows 系统中,安装程序都可以在注册表 HKEY_LOCAL_MACHINE\SoftWare\Microsoft\Windows\CurrentVersion\Uninstall 获取,并且xp、vista、win7、win8都一样

以下示例程序中:

结构体ApplicationInfoA用于记录每个安装程序的具体信息,至于为何在名称后面加A,主要是为了表明其下的信息全是用string记录的。

函数GetAllInstalledAppInfoA用于获取计算机上已安装程序的全部信息,它接受vector<ApplicationInfoA>引用类型的参数,并将获取的全部信息存放在该vector中。该程序执行成功返回0,执行失败则返回-1

main()函数中演示了怎么使用:

vector<ApplicationInfoA> vAppInfo;     

GetAllInstalledAppInfoA(vAppInfo);

在获取了安装程序的信息后,输出到D盘下的InstalledAppInfo.txt文件中。


#include <windows.h>
#include <iostream>
#include <TCHAR.H>
#include <vector>

using namespace std;

//
// 用于记录安装软件信息的结构体
//
struct ApplicationInfoA
{
	string strName;	           // 软件名
	string strDisplayName;     // 显示的软件名
	string strPublisher;       // 发布者
	string strVersion;         // 版本
	string strDisplayVersion;  // 显示的版本
	string strInstallLocation; // 安装的位置
};

//
// 获取具体的程序的键值Data
// hKey [in]
//     --- 指向HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall的子键句柄
// lpszKeyValueName [in]
//     --- hKey下面的子键名称
// lpszKeyValueName [in]
//     --- 正如其名,键值的名称
// strKeyValue [out]
//     --- 键值的Data
//
int _GetAppInfoA_(HKEY hKey, LPCSTR lpszAppName, LPCSTR lpszKeyValueName, string& strKeyValue)
{
	int ret;

	// 打开已安装软件的注册表键------------------------------------------------
	HKEY hInstallAppKey;
	ret = RegOpenKeyEx(hKey, lpszAppName, 0, KEY_ALL_ACCESS, &hInstallAppKey);
	if (ret != ERROR_SUCCESS)
	{
		return -1;
	}

	// 获取已安装软件的注册表键的键值------------------------------------------
	// 1.获取字符串大小(默认为字符串即REG_SZ)
	DWORD dwKeyValueType = REG_SZ;
	DWORD dwKeyValueDataSize = 0;
	ret = RegQueryValueExA(
		hInstallAppKey,
		lpszKeyValueName,
		NULL,
		&dwKeyValueType,
		NULL,
		&dwKeyValueDataSize);
	if (ret == ERROR_FILE_NOT_FOUND)
	{
		RegCloseKey(hInstallAppKey);
		return 0;
	}
	else if (ret != ERROR_SUCCESS)
	{
		RegCloseKey(hInstallAppKey);
		return -1;
	}

	// 2.获取字符串值
	if (dwKeyValueType != REG_SZ)	// 如果不是字符串类型则返回,有的安装程序此项不为字符串而为其他类型,忽略
	{
		RegCloseKey(hInstallAppKey);
		return 0;
	}
	LPSTR lpszKeyValueData = new char[dwKeyValueDataSize + 1];
	memset(lpszKeyValueData, 0, dwKeyValueDataSize + 1);
	ret = RegQueryValueExA(
		hInstallAppKey,
		lpszKeyValueName,
		NULL,
		&dwKeyValueType,
		(LPBYTE)lpszKeyValueData,
		&dwKeyValueDataSize);
	if (ret != ERROR_SUCCESS)
	{
		delete[] lpszKeyValueData;
		RegCloseKey(hInstallAppKey);
		return -1;
	}
	strKeyValue = lpszKeyValueData;
	delete[] lpszKeyValueData;

	// 关闭注册表键------------------------------------------------------------
	RegCloseKey(hInstallAppKey);

	return 0;
}


//
// 获取系统安装的程序信息并存储于参数vector中
// 成功执行返回0
// 执行失败则返回-1
//
int GetAllInstalledAppInfoA(vector<ApplicationInfoA>& vAppInfo)
{
	int ret;

	// 打开注册表键------------------------------------------------------------
	HKEY hKey;
	LPCSTR lpszSubKey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
	ret = RegOpenKeyExA(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
	if (ret != ERROR_SUCCESS)
	{
		return -1;
	}

	// 获取子键&键值信息-------------------------------------------------------
	DWORD dwSubKeysCnt;           // 子键数量
	DWORD dwMaxSubKeyNameLen;     // 子键名字的最大长度(not including the terminating null character)
	DWORD dwKeyValueCnt;          // 键值的数量
	DWORD dwMaxKeyValueNameLen;   // 键值名字的最大长度(not including the terminating null character)
	DWORD dwMaxKeyValueDataLen;   // 键值数据的最大长度(in Bytes)

	ret = RegQueryInfoKey(
		hKey,
		NULL,
		NULL,
		NULL,
		&dwSubKeysCnt,
		&dwMaxSubKeyNameLen,
		NULL,
		&dwKeyValueCnt,
		&dwMaxKeyValueNameLen,
		&dwMaxKeyValueDataLen,
		NULL,
		NULL);
	if (ret != ERROR_SUCCESS)
	{
		RegCloseKey(hKey);
		return -1;
	}

	// 枚举子键信息------------------------------------------------------------
	DWORD dwIndex;
	LPSTR lpszSubKeyName = new char[dwMaxSubKeyNameLen + 1];
	DWORD dwNameLen = dwMaxSubKeyNameLen + 1;

	for (dwIndex = 0; dwIndex < dwSubKeysCnt; ++dwIndex)
	{
		dwNameLen = dwMaxSubKeyNameLen + 1;
		memset(lpszSubKeyName, 0, dwMaxSubKeyNameLen + 1);

		ret = RegEnumKeyEx(
			hKey,
			dwIndex,
			lpszSubKeyName,
			&dwNameLen,
			NULL,
			NULL,
			NULL,
			NULL);
		if (ret != ERROR_SUCCESS)
		{
			RegCloseKey(hKey);
			delete[] lpszSubKeyName;
			return -1;
		}

		//************获取具体的程序的安装信息BEG*************
		ApplicationInfoA appInfo;
		appInfo.strName = lpszSubKeyName;
		_GetAppInfoA_(hKey, lpszSubKeyName, "DisplayName", appInfo.strDisplayName);
		_GetAppInfoA_(hKey, lpszSubKeyName, "Publisher", appInfo.strPublisher);
		_GetAppInfoA_(hKey, lpszSubKeyName, "Version", appInfo.strVersion);
		_GetAppInfoA_(hKey, lpszSubKeyName, "DisplayVersion", appInfo.strDisplayVersion);
		_GetAppInfoA_(hKey, lpszSubKeyName, "InstallLocation", appInfo.strInstallLocation);
		vAppInfo.push_back(appInfo);
		//************获取具体的程序的安装信息END*************
	}

	delete[] lpszSubKeyName;

	// 关闭注册表键------------------------------------------------------------
	RegCloseKey(hKey);
	return 0;
}

int main()
{
	cout << "Reg Demo Test" << endl;

	vector<ApplicationInfoA> vAppInfo;
	cout << GetAllInstalledAppInfoA(vAppInfo) << endl;

	//输出到文件
	vector<ApplicationInfoA>::iterator iter = vAppInfo.begin();
	FILE *fp = fopen("D:\\InstalledAppInfo.txt", "a");
	while (iter != vAppInfo.end())
	{
		fprintf(fp, "----------------\n");
		fprintf(fp, "Name: %s\n DisplayName: %s\n Publisher: %s\n Version: %s\n DisplayVersion: %s\n InstallLocation: %s\n", 
			iter->strName.c_str(), iter->strDisplayName.c_str(),
			iter->strPublisher.c_str(), iter->strVersion.c_str(), 
			iter->strDisplayVersion.c_str(), iter->strInstallLocation.c_str());
		fprintf(fp, "----------------\n\n");
		++iter;
	}
	fclose(fp);

	return 0;
}


示例程序二:增加Path环境变量


我们常常需要手工添加环境变量,如下图所示:

那么怎样用程序实现呢?环境变量的配置存储在注册表当中,可以通过读写注册表来实现读写环境变量。

系统变量存储在注册表的如下位置:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

而用户变量则存储在注册表的如下位置:HKEY_CURRENT_USER\Environment

下面示例程序用于向系统变量中的Path环境变量中增加内容。

main函数中调用AddPathEnvValue(";HelloKitty")就用于向Path环境变量后面添加;HelloKitty。当然程序中有防呆机制,如果系统变量下刚开始没有Path环境变量则先新增Path环境变量。程序执行成功返回0,执行失败返回-1。

代码如下:

#include <windows.h>
#include <iostream>

using namespace std;

//
// 为系统变量下的Path环境变量增加内容lpszPathValue
// 成功则返回0
// 失败则返回-1
// 若刚开始Path环境变量为"D:\\123"
// 则调用AddPathEnvValue(";HelloKitty")后为"D:\\123;HelloKitty"
//
int AddPathEnvValue(LPCSTR lpszPathValue)
{
	int ret;

	// 打开注册表键----------------------------------------
	HKEY hKey;
	LPCSTR lpszSubKey = "SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment";
	ret = RegOpenKeyExA(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
	if (ERROR_SUCCESS != ret)
	{
		cout << "RegOpenKeyExA():Error" << endl;
		return -1;
	}
	
	// 读取注册表键的键值"Path"----------------------------
	// 1.获取KeyValueData即字符串的大小
	LPCSTR lpszKeyValueName = "Path";
	DWORD  dwKeyValueType = REG_EXPAND_SZ;
	DWORD  dwKeyValueDataSize = 0;   
	ret = RegQueryValueExA(hKey, lpszKeyValueName, NULL, &dwKeyValueType, NULL, &dwKeyValueDataSize);
	if (ret == ERROR_FILE_NOT_FOUND)
	{
		//不存在Path环境变量则新增一个Path环境变量
		ret = RegSetValueExA(hKey, lpszKeyValueName, 0, REG_EXPAND_SZ, (const BYTE*)"", 1);
		if (ret != ERROR_SUCCESS)
		{
			cout << "RegSetValueExA():Error" << endl;
			RegCloseKey(hKey);
			return -1;
		}
	}
	else if (ret != ERROR_SUCCESS)
	{
		cout << "RegQueryValueExA():Error" << endl;
		RegCloseKey(hKey);
		return -1;
	}
	else if (dwKeyValueType != REG_EXPAND_SZ)
	{
		cout << "It is impossible" << endl;
		cout << dwKeyValueType << endl;
		RegCloseKey(hKey);
		return -1;
	}

	// 2.获取KeyValueData即字符串的值
	CHAR *lpszKeyValueData = new CHAR[dwKeyValueDataSize + 1];
	memset(lpszKeyValueData, 0, dwKeyValueDataSize + 1);
	ret = RegQueryValueExA(hKey, lpszKeyValueName, NULL, &dwKeyValueType, (LPBYTE)lpszKeyValueData, &dwKeyValueDataSize);
	if (ret != ERROR_SUCCESS)
	{
		cout << "RegQueryValueExA():Error" << endl;
		RegCloseKey(hKey);
		delete[] lpszKeyValueData;
		return -1;
	}

	// 在原注册表键值的基础上添加新的值
	unsigned int nLen = strlen(lpszPathValue);
	nLen += strlen(lpszKeyValueData);
	CHAR *lpszKeyValueData_New = new CHAR[nLen + 1];
	memset(lpszKeyValueData_New, 0, nLen + 1);
	sprintf(lpszKeyValueData_New, "%s%s", lpszKeyValueData, lpszPathValue);
	ret = RegSetValueExA(hKey, lpszKeyValueName, 0, REG_EXPAND_SZ, (const BYTE*)lpszKeyValueData_New, strlen(lpszKeyValueData_New) + 1);
	if (ret != ERROR_SUCCESS)
	{
		cout << "RegSetValueExA:Error" << endl;
		RegCloseKey(hKey);
		delete[] lpszKeyValueData;
		delete[] lpszKeyValueData_New;

		return -1;
	}


	delete[] lpszKeyValueData;
	delete[] lpszKeyValueData_New;

	// 关闭注册表键----------------------------------------
	RegCloseKey(hKey);

	return 0;
}

int main()
{
	cout << AddPathEnvValue(";HelloKitty") << endl;

	return 0;
}



  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值