前言
这些名字是凭感觉取的,没有专门学过Windows API。以前用Qt读写串口 挺方便的,但是现在要不依赖于Qt读写串口,遇到查找串口的问题,所以操作了封装了一下。
代码在这里:
github:
git clone https://github.com/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