//Windows操作注册表API简单例子
//操作注册表主要包括下面几个系统API
//1、RegOpenKeyEx 打开注册表项
//2、RegCloseKey 关闭注册表项
//3、RegCreateKeyEx 创建注册表项
//4、RegDeleteKey 删除注册表项
//5、RegQueryValueEx 读取注册表键值
//6、RegSetValueEx 写入注册表键值
// 测试代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
int main(int argc, char *argv[])
{
LONG lRet = 0;
HKEY hKeyProg = NULL;
char szProcessKey[256];
memset(szProcessKey, 0, sizeof(szProcessKey));
// 获取进程ID
DWORD dwProcessId = ::GetCurrentProcessId();
// 设置进程项路径
_snprintf_s(szProcessKey, sizeof(szProcessKey), "test\\%u", dwProcessId);
// 打开注册表进程项
lRet = ::RegOpenKeyEx(HKEY_CLASSES_ROOT, szProcessKey, 0, KEY_ALL_ACCESS, &hKeyProg);
if(lRet != ERROR_SUCCESS)
{
DWORD dwDisposition = 0;
// 打开失败时,创建注册表进程项
lRet = ::RegCreateKeyEx(HKEY_CLASSES_ROOT, szProcessKey,
0, NULL, 0, KEY_ALL_ACCESS, NULL, &hKeyProg, &dwDisposition);
if(lRet != ERROR_SUCCESS)
{
printf("RegCreateKeyEx error:%d. key:%s\n", lRet, szProcessKey);
return -1;
}
}
// 取当前时间
char szTime[32];
time_t timeNow = 0;
time(&timeNow);
struct tm tmNow;
errno_t err = 0;
// 取系统时区对应的当地时间
err = localtime_s(&tmNow, &timeNow);
if(err == 0)
{
memset(szTime, 0, sizeof(szTime));
_snprintf_s(szTime, sizeof(szTime), "%04d-%02d-%02d %02d:%02d:%02d",
tmNow.tm_year + 1900, tmNow.tm_mon + 1, tmNow.tm_mday,
tmNow.tm_hour, tmNow.tm_min, tmNow.tm_sec);
// 写入注册表键值:时间
lRet = ::RegSetValueEx(hKeyProg, "Time", 0, REG_SZ, (unsigned char *)szTime, strlen(szTime));
if(lRet != ERROR_SUCCESS)
{
printf("RegSetValueEx error:%d.\n", lRet);
}
}
// 读取注册表键值:时间
DWORD dwType = REG_SZ; // 字符串值类型
DWORD dwLen = sizeof(szTime);
memset(szTime, 0, sizeof(szTime));
lRet = ::RegQueryValueEx(hKeyProg, "Time", 0, &dwType, (LPBYTE)szTime, &dwLen);
if(lRet != ERROR_SUCCESS)
{
printf("RegQueryValueEx error:%d.\n", lRet);
}
printf("time:%s\n", szTime);
// 关闭注册表进程项
lRet = ::RegCloseKey(hKeyProg);
if(lRet != ERROR_SUCCESS)
{
printf("RegCloseKey error:%d. key:%s\n", lRet, szProcessKey);
}
printf("----------create key and write string----------\n");
Sleep(5000);
HKEY hKeyTest = NULL;
// 打开注册表test项
lRet = ::RegOpenKeyEx(HKEY_CLASSES_ROOT, "test", 0, KEY_ALL_ACCESS, &hKeyTest);
if(lRet != ERROR_SUCCESS)
{
printf("RegOpenKeyEx error:%d. key:test\n", lRet);
return -1;
}
memset(szProcessKey, 0, sizeof(szProcessKey));
_snprintf_s(szProcessKey, sizeof(szProcessKey), "%u", dwProcessId);
// 删除注册表进程项(注意删除项的下面不能再有其他项,否则不能删除)
lRet = ::RegDeleteKey(hKeyTest, (const char *)szProcessKey);
if(lRet != ERROR_SUCCESS)
{
printf("RegDeleteKey error:%d. key:%s.\n", lRet, szProcessKey);
}
// 关闭注册表test项
lRet = ::RegCloseKey(hKeyTest);
if(lRet != ERROR_SUCCESS)
{
printf("RegCloseKey error:%d. key:test.\n", lRet);
}
printf("----------delete key----------\n");
system("PAUSE");
return 0;
}