文章目录
前言代码在这里:使用查找注册表键值对得到串口设备列表注意:前言
这些名字是凭感觉取的,没有专门学过Windows API。以前用Qt读写串口 挺方便的,但是现在要不依赖于Qt读写串口,遇到查找串口的问题,所以操作了封装了一下。
代码在这里:
github:
git clone /MisakaMikoto128/WinRegister.git
网盘:http://liuyuanlin.xyz:666/#s/6LnvBrVg
头文件
#pragma once#define SERIALPATH _T("Hardware\\DeviceMap\\SerialComm")void wcharTochar(const wchar_t* wcharSrc, char* chrDst, int chrDstlength);bool QueryRegKey(LPCWSTR keyPath, LPCWSTR ValueName, char* Value, int valueLength);vector<string> QuerySerialPort();
使用
查找注册表键值对
_T
等同于TEXT
,_T("")
是一个宏,定义于tchar.h下。因为Windows使用两种字符集ANSI和UNICODE,如果你编译一个程序为ANSI方式,_T实际不起任何作用。
而如果编译一个程序为UNICODE
方式,则编译器会把_T("Hello")
字符串以UNICODE方式保存。_T和_L的区别在于,_L不管你是以什么方式编译,一律以UNICODE方式保存。
L是表示字符串资源为Unicode的。
#include "WinReg.h"int main(){LPCWSTR keyPath = SERIALPATH;LPCWSTR ValueName = _T("\\Device\\Serial2");char Value[MAX_PATH];int valueLength = MAX_PATH;if(QueryRegKey(keyPath, ValueName , Value, valueLength))printf("query success : %s!\n", Value);return 0;}
得到串口设备列表
对比注册表符合。
#include "WinReg.h"#include <string>#include <vector>#include <iostream>using namespace std;int main(){vector<string> COMList = QuerySerialPort();for(string& var : COMList){cout << var << endl;}return 0;}
注意:
字符集默认只 支持Unicode
其他:
RegQueryValueEx函数默认第5个类型是,LPBYTE,若定义选择此,输入将只有一个字母C
参考:
[1] 串口编程-枚举遍历串口、获取PC所有串口名称、遍历注册表项、RegEnumValue用法
[2] 微软官方文档
[3] C++ 读取windows注册表 值
[4] 百度百科._T