在Windows 95及其后继版本中,采用了一种叫做“注册表”的数据库来统一进行管理,将各种信息资源集中起来并存储各种配置信息。按照这一原则,Windows各版本中都采用了将应用程序和计算机系统全部配置信息容纳在一起的注册表,用来管理应用程序和文件的关联、硬件设备说明、状态属性以及各种状态信息和数据等。
我们可以通过win+R,输入regedit 查看注册表编辑器。
创建注册表
RegCreateKeyW( )函数
LSTATUS RegCreateKeyW([in] HKEY hKey,[in, optional] LPCWSTR lpSubKey,[out] PHKEY phkResult
);
- 参数hKey
打开的注册表句柄, 或是以下预定义键之一。
- HKEY_CLASSES_ROOT
- HKEY_CURRENT_CONFIG
- HKEY_CURRENT_USER
- HKEY_LOCAL_MACHINE
- HKEY_USERS
- 参数lpSubKey
要创建表项的名称,必须是hKey参数标识的子项(子目录下)。
- 参数phkResult
接收或打开表项的句柄
例如:
HKEY hKey;
RegCreateKeyW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Xioaming\\admin", &hKey);
SOFTWATE是HKEY_LOCAL_MACHINE下的子项目
打开注册表
RegOpenKey( )函数
LSTATUS RegOpenKeyW([in] HKEY hKey,[in, optional] LPCWSTR lpSubKey,[out] PHKEY phkResult
);
- 参数hKey
打开的注册表项的句柄。此句柄由RegCreateKeyEx或RegOpenKeyExR函数返回,也可以是以下预定义键之一:
- HKEY_CLASSES_ROOT
- HKEY_CURRENT_CONFIG
- HKEY_CURRENT_USER
- HKEY_LOCAL_MACHINE
- HKEY_USERS
- 参数lpSubKey
要打开的注册表项的名称。此键必须是hKey参数的子项(或者说子目录下)。参数值不区分大小写。如果此参数为NULL或指向空字符串的指针,则该函数返回传入的相同句柄。
- 参数phkResult
该变量接收打开的注册文件句柄的句柄。
例如:
HKEY hKey;
RegOpenKeyW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Xioaming\\admin", &hKey);
SOFTWARE是HKEY_LOCAL_MACHINE的子项目
写注册表
RegSetValueEx( )函数
LSTATUS RegSetValueExW([in] HKEY hKey,[in, optional] LPCWSTR lpValueName,DWORD Reserved,[in] DWORD dwType,[in] const BYTE *lpData,[in] DWORD cbData
);
- 参数hKey
表示打开的注册表项的句柄。 或者是以下预定义键之一。
- HKEY_CLASSES_ROOT
- HKEY_CURRENT_CONFIG
- HKEY_CURRENT_USER
- HKEY_LOCAL_MACHINE
- HKEY_USERS
- 参数lpValueName
要设置的键的名称。如果设置为NULL或空字符串 “”,则该函数将设置键为未命名值或默认值的类型和数据。
- 参数Reserved
此参数是保留的,必须为零。
- 参数dwTyle
表示lpData指向的数据类型。有如下的值可选
取值 | 含义 |
---|---|
REG_BINARY | 任何形式的二进制数据。 |
REG_DWORD | 32 位数字。 |
REG_DWORD_LITTLE_ENDIAN | 小端格式的 32 位数字。Windows被设计为在小端计算机体系结构上运行。因此,此值在 Windows 头文件中定义为REG_DWORD。 |
REG_DWORD_BIG_ENDIAN | 大端格式的 32 位数字。一些 UNIX 系统支持大端架构。 |
REG_EXPAND_SZ | 一个以 null 结尾的字符串,其中包含对环境变量的未展开引用(例如,“%PATH%”)。它将是一个 Unicode 或 ANSI 字符串,具体取决于您使用的是 Unicode 还是 ANSI 函数。若要展开环境变量引用,请使用ExpandEnvironmentString函数。 |
REG_LINK | 一个以 null 结尾的 Unicode 字符串,其中包含通过使用 REG_OPTION_CREATE_LINK 调用RegCreateKeyEx函数创建的符号链接的目标路径。 |
REG_MULTI_SZ | 以空字符串 (\0) 结尾的以 null 结尾的字符串序列。下面是一个示例:字符串 1\0 字符串 2\0 字符串 3\0 最后一个字符串\0\0 第一个 \0 终止第一个字符串,第二个到最后一个 \0 终止最后一个字符串,最后一个 \0 终止序列。请注意,最终终止符必须计入字符串的长度。 |
REG_NONE | 没有定义的值类型。 |
REG_QWORD | 64 位数字。 |
REG_QWORD_LITTLE_ENDIAN | 小端格式的 64 位数字。Windows被设计为在小端计算机体系结构上运行。因此,此值定义为 Windows 头文件中的REG_QWORD。 |
REG_SZ | 以 null 结尾的字符串。这将是 Unicode 或 ANSI 字符串,具体取决于您使用的是 Unicode 还是 ANSI 函数。 |
- 参数lpData
表示要指向存储的数据的指针,当设置为空的时候,cbData必须为'0'
- 参数cbData
表示lpData参数指向的信息的大小(字节为单位),如果lpData存储的是字符串类型的,则cbData的值必须是包含终止符的大小。
例如:
DWORD dwAge=20;
RegSetValueEx(hKey, L"age", 0, REG_DWORD, (CONST BYTE*)&dwAge, sizeof(DWORD);
hKey是上面创建注册表返回的句柄。
读注册表
RegQueryValueEx( )函数
LSTATUS RegQueryValueExW([in] HKEY hKey,[in, optional] LPCWSTR lpValueName,LPDWORD lpReserved,[out, optional] LPDWORD lpType,[out, optional] LPBYTE lpData,[in, out, optional] LPDWORD lpcbData
);
- 参数hKey
表示打开注册表的句柄,或者是以下预定义键之一
- HKEY_CLASSES_ROOT
- HKEY_CURRENT_CONFIG
- HKEY_CURRENT_USER
- HKEY_LOCAL_MACHINE
- HKEY_PERFORMANCE_DATA
- HKEY_PERFORMANCE_NLSTEXT
- HKEY_PERFORMANCE_TEXT
- HKEY_USERS
- 参数lpValueName
表示键的名称。如果设置为NULL或空字符串 “”,则该函数将检索键为未命名值或默认值(如果有)的类型和数据。如果指定的键不在注册表,则返回 ERROR_FILE_NOT_FOUND。
- 参数lpReserved
此参数是保留的,必须为NULL。
- 参数lpType
指向一个变量的指针,该变量接收要读取的数据类型的代码。若不需要可设为NULL
- 参数lpData
指向接收数据的缓冲区的指针。如果不需要数据,则可设置为NULL。
- 参数lpcbData
表示指向缓冲区大小的指针(以字节为单位),如果数据是字符串类型的,需包含终止符。
DWORD dwType;
DWORD dwAge;
DWORD dwValue;RegQueryValueEx(hKey, L"age", 0, &dwType, (LPBYTE) & dwAge, &dwValu);
关闭注册表
RegCloseKey( )函数
LSTATUS RegCloseKey([in] HKEY hKey
);
- 参数hKey
要关闭的注册表句柄
- 返回值
如果函数成功,则返回值为 ERROR_SUCCESS。
如果函数失败,则返回值是在 Winerror.h 中定义的非零错误代码。
Demo
写注册表:
下面程序中会先创建一个注册表,之后再写入内容
void CMyFileCFileView::OnWriteReg() {HKEY hKey;DWORD dwAge = 22;//创建注册表项int ret = ::RegCreateKeyW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Xioaming\\admin", &hKey);if (ret != 0) {TRACE("#RegCreateKeyW Failed,ErrorCode = %d,ret = %d", GetLastError(), ret);MessageBox(L"创建注册表失败");return;}//写注册表ret = ::RegSetValueEx(hKey, L"age", 0, REG_DWORD, (CONST BYTE*)&dwAge, sizeof(DWORD));if (ret != 0) {TRACE("#RegSetValueEx Failed,ErrorCode = %d,ret = %d", GetLastError(), ret);MessageBox(L"写注册表失败");return;}//关闭注册表::RegCloseKey(hKey);
}
读注册表:
下面程序中会打开写入时创建的注册表,并读取写入的内容
void CMyFileCFileView::OnReadReg() {//RegQueryValue() //读注册表HKEY hKey;//创建注册表项int ret = ::RegOpenKeyW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Xioaming\\admin", &hKey);if (ret != 0) {TRACE("#RegOpenKeyW Failed,ErrorCode = %d,ret = %d", GetLastError(), ret);MessageBox(L"打开注册表失败");return;}//查询注册表DWORD dwType;DWORD dwValue;DWORD dwAge;ret = ::RegQueryValueEx(hKey, L"age", 0, &dwType, (LPBYTE) & dwAge, &dwValue);if (ret != 0) {TRACE("#RegQueryValueEx Failed,ErrorCode = %d,ret = %d", GetLastError(), ret);MessageBox(L"读注册表失败");return;}TRACE("#dwType = %d,dwValue = %d,dwAge = %d", dwType, dwValue, dwAge);//关闭注册表::RegCloseKey(hKey);
}