我们进行Windows编程的时候,经常需要进行注册表操作,操作注册表请见下列实现代码与说明注释。
/* 头文件 */
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
/* 预定义 */
#define MAX_KEY_LENGTH 255
#define MAX_VALUE_NAME 16383
/* ************************************
* void QueryKey(HKEY hKey)
* 功能 列举指定注册表项的子键
**************************************/
void QueryKey(HKEY hKey)
{
TCHAR achKey[MAX_KEY_LENGTH];
DWORD cbName;
TCHAR achClass[MAX_PATH] = TEXT("");
DWORD cchClassName = MAX_PATH;
DWORD cSubKeys=0;
DWORD cbMaxSubKey;
DWORD cchMaxClass;
DWORD cValues;
DWORD cchMaxValue;
DWORD cbMaxValueData;
DWORD cbSecurityDescriptor;
FILETIME ftLastWriteTime;
DWORD i, retCode;
TCHAR achValue[MAX_VALUE_NAME];
DWORD cchValue = MAX_VALUE_NAME;
// 获取类名和数量
retCode = RegQueryInfoKey(
hKey, // 键的句柄
achClass, // 类名
&cchClassName, // 类名长度
NULL, // 保留
&cSubKeys, // 子键的数量
&cbMaxSubKey, // 子键长度
&cchMaxClass, // 类长度
&cValues, // 子键键值数量
&cchMaxValue, // 子键名长度
&cbMaxValueData, // 键值长度
&cbSecurityDescriptor, // 安全描述符
&ftLastWriteTime); // 最后写时间
// 列举子键
if (cSubKeys)
{
printf( "\nNumber of subkeys: %d\n", cSubKeys);
for (i=0; i<cSubKeys; i++)
{
cbName = MAX_KEY_LENGTH;
retCode = RegEnumKeyEx(hKey, i,
achKey,
&cbName,
NULL,
NULL,
NULL,
&ftLastWriteTime);
if (retCode == ERROR_SUCCESS)
{
printf(TEXT("(%d) %s\n"), i+1, achKey);
}
}
}
// 列举键值
if (cValues)
{
printf( "\nNumber of values: %d\n", cValues);
for (i=0, retCode=ERROR_SUCCESS; i<cValues; i++)
{
cchValue = MAX_VALUE_NAME;
achValue[0] = '\0';
retCode = RegEnumValue(hKey, i,
achValue,
&cchValue,
NULL,
NULL,
NULL,
NULL);
if (retCode == ERROR_SUCCESS )
{
printf(TEXT("(%d) %s\n"), i+1, achValue);
}
}
}
}
/* ************************************
* void AddKey(HKEY hKey)
* 功能 增加一个子键,并设置键值
**************************************/
void AddKey(HKEY hKey)
{
HKEY hSubKey;
DWORD dwKeyValue = 100;
// 创建键
RegCreateKey(hKey,"MySoftware",&hSubKey);
// 设置键值
if( ERROR_SUCCESS != RegSetValueEx(
hSubKey,
"TEST",
0,
REG_DWORD,
(LPBYTE)&dwKeyValue,
sizeof(DWORD)))
{
printf("error\n");
}
}
/* ************************************
* void main(void)
* 功能 打开键,获得键句柄
**************************************/
void main(void)
{
HKEY hTestKey;
if( RegOpenKeyEx( HKEY_CURRENT_USER,
TEXT("SOFTWARE"),
0,
KEY_READ | KEY_WRITE,
&hTestKey) == ERROR_SUCCESS
)
{
// 增加键
AddKey(hTestKey);
// 列举子键
QueryKey(hTestKey);
}
}
我们进行Windows编程的时候,经常需要获取时间与设置时间,操作时间请见下列实现代码与说明注释。
**************************************/
#include <Windows.h>
#include <stdio.h>
/* ************************************
* int main()
* 功能 获取并显示系统当前时间,然后将时间提前一个小时
**************************************/
int main()
{
SYSTEMTIME st;
// 获取当前时间,以本时区时间格式
GetLocalTime( &st );
printf("Now: %d-%d-%d, %d:%d:%d",
st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
// 提前一小时
st.wHour --;
// 设置当前系统时间
SetLocalTime( &st );
}