使用Windows API进行注册表的读写

236 阅读1分钟

使用的API

Windows API简述
RegOpenKeyEx打开注册表的key
RegQueryValueEx读取注册表某个key的值
RegCreateKeyEx打开或创建注册表项
RegSetValueEx向注册表中某个Key写入值

读取注册表中的某个Key

使用RegOpenKeyExRegQueryValueEx

代码

void CMFCApplication1Dlg::OnBnClickedButton1()
{
	long lRet;
	HKEY hKey;  // 句柄

	TCHAR tchData[64];  // 保存读取到的数据

	DWORD dwSize;   // 大小

	// 打开注册表的Key
	lRet = RegOpenKeyEx(
		HKEY_LOCAL_MACHINE, // 注册表Key
		_T("Hardware\\Description\\System\\CentralProcessor\\0"), // 注册表子Key
		0,
		KEY_QUERY_VALUE,  // 读取Value
		&hKey    // 打开之后得到一个句柄
		);

	dwSize = sizeof(tchData);

	if (lRet == ERROR_SUCCESS)
	{
	    // 成功
		// 读取注册表某个key的值
		lRet = RegQueryValueEx(
			hKey,
			_T("ProcessorNameString"),  // 读取ProcessorNameString这个键的值
			NULL,
			NULL,
			(LPBYTE)tchData,  // 数组
			&dwSize     // 大小
		);

		if (lRet == ERROR_SUCCESS)
		{
		    // 成功
			SetDlgItemText(IDC_STATIC, tchData);
		} else
		{
			// 失败
			AfxMessageBox(_T("RegQueryValueEx failed."));
		}

	} else
	{
	    // 失败
        AfxMessageBox(_T("RegOpenKeyEx failed."));
	}

	// 关闭打开的Key
	RegCloseKey(hKey);
}

运行效果

image.png

往注册表中写入数据

使用RegCreateKeyExRegSetValueEx

代码

void CMFCApplication1Dlg::OnBnClickedButton2()
{
	HKEY hKey;
	// 创建Key
	DWORD disposition;  // 用于接收操作结果信息

	// 打开或创建注册表项 HKEY_CURRENT_USER\Software\MyApp
	LONG result = RegCreateKeyEx(
		HKEY_CURRENT_USER,
		TEXT("Software\\MyApp"),
		0,
		NULL,
		REG_OPTION_NON_VOLATILE,  // 表示注册表项将在系统重启后保留
		KEY_WRITE,
		NULL,
		&hKey,
		&disposition
	);


	// 向注册表中某个Key写入值
	if (result == ERROR_SUCCESS) {
		if (disposition == REG_CREATED_NEW_KEY) {
			AfxMessageBox(_T("Registry key created.\n"));

			const WCHAR* valueName = TEXT("MyValue");
			LPCTSTR valueData = _T("Hello, Registry!");

			// 设置字符串值
			result = RegSetValueEx(
				hKey,
				valueName,
				0,
				REG_SZ,
				(BYTE*)valueData,
				(lstrlen(valueData) + 1) * sizeof(TCHAR)  // 包括 null 终止符的大小
			);

			if (result == ERROR_SUCCESS) {
				AfxMessageBox(_T("Registry value set successfully.\n"));
			}
			else {
				AfxMessageBox(_T("Failed to set registry value."));
			}
		}
		else if (disposition == REG_OPENED_EXISTING_KEY) {
			AfxMessageBox(_T("Registry key opened.\n"));
		}

	}
	else {
		AfxMessageBox(_T("Failed to open or create registry key.\n"));
	}

	RegCloseKey(hKey);
}

运行效果

image.png

参考文档