实现:注册表的增删改查

注册表的查:

/*
逻辑顺序:
1、RegOpenKeyEx获得一个指定注册表的主键句柄
2、利用RegQueryValueEx用获得的主键句柄读取对应注册表下的子键值
*/
void CMyMFCDlg::OnBnClickedButton1Cpu() 
{

	//第一种
	//读取键所对应得值
	//HKEY hkey;
	//wchar_t reg_value[64];
	//if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0"), 0, KEY_QUERY_VALUE, &hkey) == ERROR_SUCCESS) {
	//	//打开成功了,接下来就是进行读取的操作
	//	DWORD reg_value_size = sizeof(reg_value);
	//	if (RegQueryValueEx(hkey, _T("ProcessorNameString"), NULL, NULL, (LPBYTE)reg_value, &reg_value_size) == ERROR_SUCCESS) { //读取的值放到reg_value缓冲区中
	//		SetDlgItemText(IDC_STATIC_CPU, reg_value);

	//	}
	//	else {
	//		AfxMessageBox(_T("读取注册表失败!"));
	//	}
	//}
	//else {
	//	AfxMessageBox(_T("打开注册表失败!"));
	//}
	//RegCloseKey(hkey);



	// -----------------------------------------------------------------
	// 第二种就是直接读取键的名称
	LONG reg_bufsize;
	RegQueryValue(HKEY_CURRENT_USER, _T("aaa"), NULL, &reg_bufsize);//动态获取这个aaa键的大小
	wchar_t * reg_buf = new wchar_t[reg_bufsize]; //堆区生成存储空间存放键的名称
	RegQueryValue(HKEY_CURRENT_USER, _T("aaa"), reg_buf, &reg_bufsize);//获取键的名称放入reg_buf堆栈缓冲区中
	AfxMessageBox(reg_buf);
}

注册表的增:

/*
逻辑顺序:
1、RegCreateKeyEx 获得一个指定注册表的主键句柄
2、利用RegSetValueEx用获得的主键句柄创建一个子键
*/
void CMyMFCDlg::OnBnClickedButton2() //创建键值
{

	HKEY hkey; //打开指定子键
	DWORD lRet;
	DWORD dispo = REG_OPENED_EXISTING_KEY;

	if ((lRet = RegCreateKeyEx(
		HKEY_LOCAL_MACHINE,
		_T("Software\\Microsoft\\Windows\\CurrentVersion\\Run"),
		0,
		NULL,
		REG_OPTION_NON_VOLATILE,
		KEY_ALL_ACCESS,
		NULL,
		&hkey,
		&dispo)) == ERROR_SUCCESS) {

		wchar_t szModule[MAX_PATH];
		GetModuleFileName(NULL, szModule, MAX_PATH); //得到当前执行文件的文件名(包含路径)
		//创建一个新的键值,设置键值数据为文件
		if ((lRet = RegSetValueEx(hkey, _T("SelfRunDemo"), 0, REG_SZ, (BYTE*)szModule, sizeof(szModule))) == ERROR_SUCCESS) {
			SetDlgItemText(IDC_STATIC_CPU, _T("RegSetValueEx成功!")); //设置成功;
		}
		else {
			SetDlgItemText(IDC_STATIC_CPU, _T("RegSetValueEx失败!")); //设置成功;
		}

	}
	else {
		SetDlgItemText(IDC_STATIC_CPU, _T("RegCreateKeyEx失败!")); //设置成功;
	}

	RegCloseKey(hkey); 	//关闭子键句柄



        //下面这段代码是编程论坛版主给我的例子,FormatMessageA可以用来调试lRet返回值的原因
	//HKEY hkey;
	//DWORD lRet = RegCreateKeyEx(HKEY_LOCAL_MACHINE, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Run"), 
	//	0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, NULL);
	//if (lRet == ERROR_SUCCESS)
	//{
	//	AfxMessageBox(_T("OK"));
	//	RegCloseKey(hkey);
	//}
	//else
	//{
	//	wchar_t * pMsgBuf;
	//	FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS
	//		, NULL, lRet, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&pMsgBuf, 0, NULL);
	//	AfxMessageBox(pMsgBuf);
	//	LocalFree(pMsgBuf);
	//}
 
}

注册表的删:


void CMyMFCDlg::OnBnClickedButton1()
{
	/*
		LSTATUS RegDeleteKeyA(
			HKEY   hKey,
			LPCSTR lpSubKey
		);
	*/
	
	RegDeleteKey(HKEY_CURRENT_USER, _T("aaa"));
	AfxMessageBox(_T("删除键成功"));
}
posted @ 2020-01-13 00:54  zpchcbd  阅读(423)  评论(0)    收藏  举报