例子:将本地计算机的Monitor ID写入到注册表中

(1)获取MonitorID

BOOLEAN DeviceMonitorService::EnumClassDevice(const GUID * InterfaceClassGuid)
{ WriteEventLogEntry(L"EnumClassDevice ",
EVENTLOG_ERROR_TYPE);
HDEVINFO DeviceInfoSet;
HDEVINFO NewDeviceInfoSet; SP_DEVINFO_DATA DeviceInfoData;
ZeroMemory(&DeviceInfoData, sizeof(DeviceInfoData));
DeviceInfoData.cbSize = sizeof(DeviceInfoData);
DeviceInfoData.DevInst = ;
DeviceInfoData.ClassGuid = *InterfaceClassGuid;
DeviceInfoData.Reserved = ; DWORD i;
// 创建空设备信息列表
DeviceInfoSet = SetupDiCreateDeviceInfoList(NULL, NULL);
BOOLEAN ret = FALSE;
if (DeviceInfoSet == INVALID_HANDLE_VALUE)
{
writeErrorLog(L"CreateDeviceInfoList failed: ", GetLastError());
return ret;
} // 根据接口类型获得新的设备信息列表 NewDeviceInfoSet = SetupDiGetClassDevsEx(
InterfaceClassGuid,
NULL,
NULL,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE,
DeviceInfoSet,// 之前创建的设备信息列表
NULL,
NULL
);
if (NewDeviceInfoSet == INVALID_HANDLE_VALUE)
{
writeErrorLog(L"SetupDiGetClassDevsEx failed: ", GetLastError());
return ret;
} for (i = ;; i++)
{
BOOL bResult = SetupDiEnumDeviceInfo(NewDeviceInfoSet,
i, &DeviceInfoData);
if (!bResult)
{
if (GetLastError() != NO_ERROR &&GetLastError() != ERROR_NO_MORE_ITEMS)
{
writeErrorLog(L"SetupDiEnumDeviceInfo ERROR ", GetLastError());
return ret;
}
break;
}
else
{
char DeviceID[MAX_DEV_LEN];
bool resHardwareID = SetupDiGetDeviceRegistryPropertyA(NewDeviceInfoSet, &DeviceInfoData, SPDRP_HARDWAREID, , (PBYTE)DeviceID, MAX_DEV_LEN, NULL);
if (!resHardwareID)
{
ZeroMemory(&DeviceID, sizeof(DeviceID));
}
else{
//写入注册表,并break;
setRegKey(DeviceID, name_monitor);
}
}
}
SetupDiDestroyDeviceInfoList(DeviceInfoSet);
return TRUE;
}

(2)将MonitorID写入到注册表

LPCTSTR SubKey = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";

void setRegKey(char* value, LPCWSTR name){
    //将Ansi字符串转换成Unicode字符串
LPWSTR pwszOut = NULL;// Typedef WCHAR* LPWSTR
if (value != NULL)
{
// Double NULL Termination
int nOutputStrLen = MultiByteToWideChar(CP_ACP, 0, value, -1, NULL, 0);//获取字符的长度
pwszOut = new TCHAR[nOutputStrLen]; memset(pwszOut, 0, nOutputStrLen);
MultiByteToWideChar(CP_ACP, 0, value, -1, pwszOut, nOutputStrLen);
} HKEY key = NULL;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, SubKey, 0, KEY_ALL_ACCESS, &key) == ERROR_SUCCESS){//打开注册表项
writeDebugEventLog(L"[Service] RegOpenKeyEx ok ", EVENTLOG_INFORMATION_TYPE);
if (RegSetValueEx(key, name, 0, REG_SZ, (unsigned const char*)pwszOut, sizeof(TCHAR)*(lstrlenW(pwszOut) + 1)) == ERROR_SUCCESS){
writeDebugEventLog(L"[Service] setRegKey ok ", EVENTLOG_INFORMATION_TYPE);
}
else{
writeErrorLog(L"[Service] RegSetValueEx ", GetLastError());
}
}
else {
writeErrorLog(L"[Service] RegOpenKeyEx ", GetLastError());
}
if (key != NULL) RegCloseKey(key); if (pwszOut != NULL) delete[] pwszOut;
}

  

(3)从注册表中读取MonitorID

void readRegKey(LPCWSTR name,LPWSTR id){
HKEY key;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, SubKey, 0, KEY_ALL_ACCESS | KEY_WOW64_32KEY, &key) == ERROR_SUCCESS){ DWORD nType, nLen;
WCHAR buff[MAX_DEV_LEN];
RegQueryValueEx(key, name, 0, &nType, (LPBYTE)buff, &nLen);
writeDebugEventLog(L"[MonitorHelp] readRegKey RegQueryValueEx ok ", EVENTLOG_INFORMATION_TYPE);
RegCloseKey(key);
lstrcpyW(id,buff);
}
else{
printf("readRegKey RegOpenKeyEx fail");
writeDebugEventLog(L"[MonitorHelp] readRegKey RegQueryValueEx fail ", EVENTLOG_INFORMATION_TYPE);
}
}

  

windows 注册表编程的更多相关文章

  1. 10#Windows注册表的那些事儿

    引言 用了多年的Windows系统,其实并没有对Windows系统进行过深入的了解,也正是由于Windows系统不用深入了解就可以简单上手所以才有这么多人去使用.笔者是做软件开发的,使用的基本都是Wi ...

  2. 关于windows注册表

    Windows 注册表 应该是一个 数据库.里面包含操作系统以及在其上的软件配置信息和旗下的硬件配置信息,有点就是整体和全面,控制面包和gpedit.msc 组策略应该是抽象过后的注册表配置信息, W ...

  3. 【API】注册表编程基础-RegCreateKeyEx、RegSetValueEx

    1.环境: 操作系统:Windows 10 x64 编译器:VS2015 2.关键函数 LONG WINAPI RegCreateKeyEx( _In_ HKEY hKey, _In_ LPCTSTR ...

  4. C++ 注册表编程

    原文 C++ 注册表编程 1.基础知识 注册表的组织方式跟文件目录比较相似,主要分为根键.子键和键值项三部分,与文件目录对应的话就是根目录.子目录和文件.分别介绍一下这三部分: (1)根键.分为5个, ...

  5. 一些实用的Windows注册表

    一些实用的Windows注册表 1.去掉快捷方式文件名后面自动添加的"-快捷方式" 在给某个文件创建快捷方式时(选中文件-->右键-->发送到-->桌面快捷方式) ...

  6. 使用Java修改Windows注册表

    使用Java修改Windows注册表,使用最基本的就是cmd命令. 事例和运行结果如下所示: package day01; import java.io.IOException; /* 1,reg a ...

  7. Java 修改Windows注册表,以实现开机自启动应用程序。

    使用Java修改Windows注册表,使用最基本的就是cmd命令. 事例和运行结果如下所示: package day01; import java.io.IOException; /* 1,reg a ...

  8. Windows注册表的基本知识及应用

    转帖:Windows注册表的基本知识及应用 2009-12-23 11:30:56 分类: Windows注册表的基本知识及应用  一.注册表的重要性 在DOS年代,对计算机的内存管理及系统配置主要通 ...

  9. 1.3 Windows注册表

    如何打开Windows注册表呢? 方法一:Win+R打开命令行,再输入regetdit,回车. 方法二:打开计算机,进入系统所在盘,进入Windows\System32文件夹,找到regedt32,双 ...

随机推荐

  1. [Math] Beating the binary search algorithm – interpolation search, galloping search

    From: http://blog.jobbole.com/73517/ 二分检索是查找有序数组最简单然而最有效的算法之一.现在的问题是,更复杂的算法能不能做的更好?我们先看一下其他方法. 有些情况下 ...

  2. PEP8 Python 编码规范

    一 代码编排1 缩进.4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格.2 每行最大长度79,换行可以使用反斜杠,最好使用圆括号.换行点要在操作符的后边敲回车.3 类 ...

  3. python 在sublime 中的配置

    首先可以先装package control 方法——按ctrl+`,然后在命令行里复制粘贴以下代码, import urllib2,os;pf='Package Control.sublime-pac ...

  4. Android注解编程的第一步---模仿ButterKnife的ViewBinder机制

    ButterKnife的使用极大方便了Android程序员的开发,实际上,我们可以自己模仿一下实现. 首先就是要了解Java注解的使用. 我们首先要声明一个@interface,也就是注解类: @Ta ...

  5. C#对象与XMl文件之间的相互转换

    C#提供三种序列化方式,分别为: 1.是使用BinaryFormatter进行串行化: 2.使用SoapFormatter进行串行化: 3.使用XmlSerializer进行串行化.其中对于Binar ...

  6. 启动Mysql时发生的一个关于PID文件错误问题

      今天启动mysql时出现了如下错误: [root@host1 /]# service mysql start Starting MySQL.. ERROR! The server quit wit ...

  7. java:[1,1] 需要class, interface或enum

    状态: cmd编译.java文件时报异常:java:[1,1] 需要class, interface或enum异常原因: 主要原因是java文件的编码问题. 在中文操作系统中,使用一贯的"j ...

  8. Web 前端颜色值--字体--使用,整理整理

    做网页时经常挑选不好颜色吧...多看看颜色值,或者自己配吧.... 颜色值 CSS 颜色使用组合了红绿蓝颜色值 (RGB) 的十六进制 (hex) 表示法进行定义.对光源进行设置的最低值可以是 0(十 ...

  9. vs2012中编译时出现程序集所使用的版本高于所引用的版本

    我在运行别人的项目时出现版本不兼容的问题:

  10. web ppt

    先记录,以后再试试 https://github.com/gnab/remark/wiki http://segmentfault.com/blog/sweetdum/1190000000484121 ...