例程完成功能测试图,另外本人写软件有个缺点,过度的依赖Cstring类型字符串,因此操作结果和操作前要操作的数据几乎都使用Cstring类型数据。另外就是注册表中的二进制数是以16进制保存的。
封装类H头文件
#ifndef _H_HKEYREGQUERY
#define _H_HKEYREGQUERY
#include<Windows.h>
#include<cstring>
using namespace std;
#pragma once
class hKeyRegQuery
{
public:
hKeyRegQuery();
virtual~hKeyRegQuery();
public:
void Read_Dword(LPCTSTR dataPath, LPCWSTR lpValueName,DWORD &dwReadValue);
void Read_Reg_SZ(LPCTSTR dataPath, LPCWSTR lpValueName, CString& strReadValue);
void Write_Dword(LPCTSTR dataPath, LPCWSTR lpCreateKeyName, LPCWSTR lpSubKeyName,DWORD dwValue);
void Write_Reg_SZ(LPCTSTR dataPath, LPCWSTR lpCreateKeyName, LPCWSTR lpSubKeyName, CString strValue);
void Write_Reg_Binary(LPCTSTR dataPath, LPCWSTR lpCreateKeyName, LPCWSTR lpSubKeyName, CString binaryValue);
void Read_Reg_Binary(LPCTSTR dataPath, LPCWSTR lpValueName, CString& binaayValue);
void Delete_Value(LPCTSTR dataPath, LPCWSTR lpValueName);
void Delete_Key(LPCTSTR dataPath, LPCWSTR lpValueName);
public:
DWORD WriteAndReadBinaryLenth;
private:
protected:
};
#endif
封装类CPP实现文件
#include "pch.h"
#include "hKeyRegQuery.h"
hKeyRegQuery::hKeyRegQuery()
{
WriteAndReadBinaryLenth = 0;
}
hKeyRegQuery::~hKeyRegQuery()
{
}
void hKeyRegQuery::Read_Dword(LPCTSTR dataPath,LPCWSTR lpValueName, DWORD& dwReadValue)
{
HKEY hKey;
DWORD dwValue;
DWORD dwSize = sizeof(DWORD);
DWORD dwType = REG_DWORD;
if (ERROR_SUCCESS==::RegOpenKeyEx(HKEY_CURRENT_USER, dataPath,0,KEY_READ,&hKey))
{
if (::RegQueryValueEx(hKey, lpValueName,NULL, &dwType,(LPBYTE)&dwValue,&dwSize)!=ERROR_SUCCESS)
{
printf("错误提示:无法查询到相关的注册表信息!");
printf("\n");
}
else
{
dwReadValue = dwValue;
printf("已成功从注册表中读取数值信息!");
printf("\n");
printf("dwValue=%d",dwValue);
printf("\n");
}
}
else
{
printf("错误提示:注册表打开失败请先检查注册表项后重试!");
printf("\n");
}
::RegCloseKey(hKey);
}
void hKeyRegQuery::Read_Reg_SZ(LPCTSTR dataPath, LPCWSTR lpValueName, CString& strReadValue)
{
HKEY hKey;
DWORD dwSizew = 256;
LPBYTE lpItemCharValue = new BYTE[dwSizew];
CString strValue;
DWORD dwType = REG_SZ;
if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_CURRENT_USER, dataPath, 0, KEY_READ, &hKey))
{
if (::RegQueryValueEx(hKey,lpValueName,NULL,&dwType,lpItemCharValue,&dwSizew)!=ERROR_SUCCESS)
{
printf("错误提示:无法查询到相关的注册表信息!");
printf("\n");
}
else
{
strValue = (TCHAR*)lpItemCharValue;
strReadValue = strValue;
printf("已成功从注册表中读取字符串信息!");
printf("\n");
printf("dwValue=%ws", (TCHAR*)lpItemCharValue);
printf("\n");
}
}
else
{
printf("错误提示:注册表打开失败请先检查注册表项后重试!");
printf("\n");
}
delete[] lpItemCharValue;
lpItemCharValue = NULL;
::RegCloseKey(hKey);
}
void hKeyRegQuery::Write_Dword(LPCTSTR dataPath, LPCWSTR lpCreateKeyName, LPCWSTR lpSubKeyName,DWORD dwValue)
{
HKEY hKey;
HKEY hTemKey;
DWORD dwSize = sizeof(DWORD);
DWORD dwType = REG_DWORD;
if (ERROR_SUCCESS== ::RegOpenKeyEx(HKEY_CURRENT_USER, dataPath, NULL, KEY_SET_VALUE, &hKey))
{
if (ERROR_SUCCESS==RegCreateKey(hKey, lpCreateKeyName,&hTemKey))
{
if (ERROR_SUCCESS!=RegSetValueEx(hTemKey, lpSubKeyName,NULL, dwType,(CONST BYTE*)&dwValue, dwSize))
{
printf("注册信息写入注册表失败,请确认后重试!");
printf("\n");
}
else
{
printf("注册信息已写入注册表,并成功修改注册表!");
printf("\n");
printf("dwValue=%d", dwValue);
printf("\n");
}
}
}
::RegCloseKey(hKey);
}
void hKeyRegQuery::Write_Reg_SZ(LPCTSTR dataPath, LPCWSTR lpCreateKeyName, LPCWSTR lpSubKeyName, CString strValue)
{
HKEY hKey;
HKEY hTemKey;
DWORD dwType = REG_SZ;
if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_CURRENT_USER, dataPath, NULL, KEY_SET_VALUE, &hKey))
{
if (ERROR_SUCCESS == RegCreateKey(hKey, lpCreateKeyName, &hTemKey))
{
if (ERROR_SUCCESS != RegSetValueEx(hTemKey, lpSubKeyName, NULL, dwType, (const BYTE*)(LPSTR)(LPCTSTR)strValue, strValue.GetLength()*sizeof(LPSTR)))
{
printf("注册信息写入注册表失败,请确认后重试!");
printf("\n");
}
else
{
printf("注册信息已写入注册表,并成功修改注册表!");
printf("\n");
printf("strValue=%ws", (LPCTSTR)strValue);
printf("\n");
}
}
}
::RegCloseKey(hKey);
}
void hKeyRegQuery::Write_Reg_Binary(LPCTSTR dataPath, LPCWSTR lpCreateKeyName, LPCWSTR lpSubKeyName, CString binaryValue)
{
HKEY hKey;
HKEY hTemKey;
DWORD dwType = REG_BINARY;
int len = WideCharToMultiByte(CP_ACP, 0, binaryValue, binaryValue.GetLength(), NULL, 0, NULL, NULL);
WriteAndReadBinaryLenth = len;
printf("%d", WriteAndReadBinaryLenth);
if (WriteAndReadBinaryLenth==0)
{
printf("请确保要写入的信息不为空,请确认后重试!");
printf("\n");
return;
}
unsigned char* pByte = (unsigned char*)malloc((len + 1) * sizeof(unsigned char));
if (pByte != NULL)
{
memset(pByte, 0, (len + 1) * sizeof(unsigned char));
WideCharToMultiByte(CP_ACP, 0, binaryValue.GetBuffer(), binaryValue.GetLength(), (LPSTR)pByte, len, NULL, NULL);
*(pByte + len + 1) = '\0';
}
else
{
printf("请确保要写入的信息不为空,请确认后重试!");
printf("\n");
return;
}
if (ERROR_SUCCESS==::RegOpenKeyEx(HKEY_CURRENT_USER, dataPath,NULL,KEY_SET_VALUE,&hKey))
{
if (ERROR_SUCCESS==::RegCreateKey(hKey,lpCreateKeyName,&hTemKey))
{
if (ERROR_SUCCESS!=RegSetValueEx(hTemKey, lpSubKeyName,NULL,dwType, pByte, len))
{
printf("注册信息写入注册表失败,请确认后重试!");
printf("\n");
}
else
{
printf("注册信息已写入注册表,并成功修改注册表!");
printf("\n");
for (INT i = 0; i < len; i++)
{
printf("binaryValue=%c", *(pByte+i));
printf("\n");
}
}
}
}
::RegCloseKey(hKey);
}
void hKeyRegQuery::Read_Reg_Binary(LPCTSTR dataPath, LPCWSTR lpValueName, CString& binaayValue)
{
HKEY hkey;
DWORD dwType=REG_BINARY;
DWORD lenthBinary = WriteAndReadBinaryLenth;
LPBYTE BinaryValue=new BYTE[lenthBinary];
CString str;
printf("%d", lenthBinary);
if (lenthBinary == 0)
{
printf("请确认注册表读取信息长度是否正确,请确认后重试!");
printf("\n");
return;
}
ZeroMemory(BinaryValue,sizeof(BYTE));
if (ERROR_SUCCESS==::RegOpenKeyEx(HKEY_CURRENT_USER,dataPath,NULL,KEY_READ,&hkey))
{
if (ERROR_SUCCESS!=RegQueryValueEx(hkey, lpValueName,NULL,&dwType, BinaryValue,&lenthBinary))
{
printf("错误提示:无法查询到相关的注册表信息!");
printf("\n");
}
else
{
for (unsigned int i = 0; i <lenthBinary; i++)
{
printf("BinaryValue=%c", BinaryValue[i]);
printf("\n");
str.Format(_T("%c"), BinaryValue[i]);
binaayValue = binaayValue + str;
}
}
}
binaayValue.Replace(_T(" "),_T(""));
::RegCloseKey(hkey);
delete[] BinaryValue;
}
void hKeyRegQuery::Delete_Value(LPCTSTR dataPath, LPCWSTR lpValueName)
{
HKEY hKey;
if (ERROR_SUCCESS==::RegOpenKeyEx(HKEY_CURRENT_USER,dataPath,0,KEY_SET_VALUE,&hKey))
{
if (ERROR_SUCCESS!=::RegDeleteValue(hKey, lpValueName))
{
printf("注册表键值删除失败,请确认后重试!");
printf("\n");
}
else
{
printf("注册表键值删除成功!");
printf("\n");
}
}
::RegCloseKey(hKey);
}
void hKeyRegQuery::Delete_Key(LPCTSTR dataPath, LPCWSTR lpValueName)
{
HKEY hKey;
if (ERROR_SUCCESS==::RegOpenKeyEx(HKEY_CURRENT_USER, dataPath,0,KEY_SET_VALUE,&hKey))
{
if (ERROR_SUCCESS!=::RegDeleteKey(hKey, lpValueName))
{
printf("注册表子键删除失败,请确认后重试!");
printf("\n");
}
else
{
printf("注册表子键删除成功!");
printf("\n");
}
}
::RegCloseKey(hKey);
}
注意事项 :
二进制读取操作首先要确保注册表相应的位置写入的长度,长度不明确或使用MAX_PATH会导致读取数据有乱码。因此本例程必须先写入,在读取。写入过程得到写入数据的长度,读取过程根据此长度来读取。
应用实例 H头文件和CPP文件:
#include "hKeyRegQuery.h" #pragma once class CMFCApplicationRegisterDemoDlg : public CDialogEx { public: CMFCApplicationRegisterDemoDlg(CWnd* pParent = nullptr); #ifdef AFX_DESIGN_TIME enum { IDD = IDD_MFCAPPLICATIONREGISTERDEMO_DIALOG }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); protected: HICON m_hIcon; virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() public: afx_msg void OnBnClickedButtondreadkey(); afx_msg void OnBnClickedButtondbuildkeysubitem(); afx_msg void OnBnClickedButtondwritestr(); afx_msg void OnBnClickedButtondwritekey(); afx_msg void OnBnClickedButtondreadkeystr(); afx_msg void OnBnClickedButtonddeletekeyvalue(); afx_msg void OnBnClickedButtonddeletekey(); afx_msg void OnBnClickedButtonwritebinary(); afx_msg void OnBnClickedButtonreadbinary(); hKeyRegQuery m_ItemKeyControl; }; void CMFCApplicationRegisterDemoDlg::OnBnClickedButtondwritestr() { CString hKeyPath = _T("Software"); CString hCreateKeyName = _T("ReflowerController"); CString hSubKeyName = _T("SerialCode"); CString strSerialCode; GetDlgItemText(IDC_EDITWRITEREGSTR, strSerialCode); m_ItemKeyControl.Write_Reg_SZ(hKeyPath, hCreateKeyName, hSubKeyName, strSerialCode); } void CMFCApplicationRegisterDemoDlg::OnBnClickedButtondwritekey() { CString hKeyPath = _T("Software"); CString hCreateKeyName = _T("ReflowerController"); CString hSubKeyName = _T("DaysRemain"); DWORD hRemainDays= GetDlgItemInt(IDC_EDITREADKEYWORDVALUE); m_ItemKeyControl.Write_Dword(hKeyPath, hCreateKeyName, hSubKeyName, hRemainDays); } void CMFCApplicationRegisterDemoDlg::OnBnClickedButtondreadkeystr() { CString hKeyPath = _T("Software\\ReflowerController"); CString hSubKeyName = _T("SerialCode"); CString strSerialCode; m_ItemKeyControl.Read_Reg_SZ(hKeyPath, hSubKeyName, strSerialCode); SetDlgItemText(IDC_EDITREADSTR, strSerialCode); } void CMFCApplicationRegisterDemoDlg::OnBnClickedButtonddeletekeyvalue() { CString hKeyPath = _T("Software\\ReflowerController"); CString hSubKeyName = _T("SerialCode"); m_ItemKeyControl.Delete_Value(hKeyPath, hSubKeyName); } void CMFCApplicationRegisterDemoDlg::OnBnClickedButtonddeletekey() { CString hKeyPath = _T("Software"); CString hSubKeyName = _T("ReflowerController"); m_ItemKeyControl.Delete_Key(hKeyPath, hSubKeyName); } void CMFCApplicationRegisterDemoDlg::OnBnClickedButtonwritebinary() { CString hKeyPath = _T("Software"); CString hCreateKeyName = _T("ReflowerController"); CString hSubKeyName = _T("ProductID"); CString WriteBinary; GetDlgItemText(IDC_EDITWRITEBINARY, WriteBinary); m_ItemKeyControl.Write_Reg_Binary(hKeyPath, hCreateKeyName, hSubKeyName, WriteBinary); } void CMFCApplicationRegisterDemoDlg::OnBnClickedButtonreadbinary() { CString hKeyPath = _T("Software\\ReflowerController"); CString hSubKeyName = _T("ProductID"); CString ReadBinary; m_ItemKeyControl.Read_Reg_Binary(hKeyPath, hSubKeyName, ReadBinary); SetDlgItemText(IDC_EDITREADBINARY, ReadBinary); }