例子:将本地计算机的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. 数组、单链表和双链表介绍 以及 双向链表的C/C++/Java实现

    概要 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列.本章先介绍线性表的几个基本组成部分:数组.单向链表.双向链表:随后给出双向链表的C.C++和Java三种语言的实现. ...

  2. Android 布局之GridLayout

    Android 布局之GridLayout 1 GridLayout简介 GridLayout是Android4.0新提供的网格矩阵形式的布局控件. GridLayout的继承关系如下:java.la ...

  3. 解决 ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510)异常

    ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510) 解决方案: 在java_opts="-Xd ...

  4. iOS-动态计算Label的高度

    一. 要求 1.根据网络请求的回来的字符串内容,动态计算Label的高度. 二. 注意点 1. 要注意设置label 的 numberOfLines 为0; 2. MAXFLOAT 的作用. 设置高度 ...

  5. The Linux Process Principle,NameSpace, PID、TID、PGID、PPID、SID、TID、TTY

    目录 . 引言 . Linux进程 . Linux命名空间 . Linux进程的相关标识 . 进程标识编程示例 . 进程标志在Linux内核中的存储和表现形式 . 后记 0. 引言 在进行Linux主 ...

  6. 用cryptico.js实现RSA加密(应对cryptico不支持PEM)

    问题: 随手分享一下好了,这个问题困扰了很久. cryptico.js这个加密算法库很全,很适合在前端用到各种加密解密算法的需求.但是美中不足的是,它的RSA加密不支持PEM格式,所以如果你后端用ja ...

  7. VC Windows API获得桌面所有窗口句柄的方法

    VC Windows API应用之GetDesktopWindow ——获得桌面所有窗口句柄的方法 Windows API Windows 这个多作业系统除了协调应用程序的执行.分配内存.管理资源…之 ...

  8. 数据库sqlserver2008登陆名密码登陆不了怎么办?

    我用的是sql server2008数据库,原先创建的登录名是sa,但是密码就忘了.总是出现这个连接问题

  9. 常用jsp include用法,三种include的区别

    <@ include file=””> :静态导入,jsp指令,同一个request , <jsp:include page=”” flush=””>:动作元素,不同一个req ...

  10. Qt 框架 开发HTTP 服务器 开发记录

    最近需求需要开发一款 HTTP ,然后由于先前接触过Qt,就直接用Qt写HTTP服务器了,也是为了当作练手,要不然是直接上HTTP框架的. 后端用C++ Qt框架 前端为了练手 当然是纯生的 js h ...