部分方式没结果,思路应该是没错。

  //7.
std::cout << "M8: SetupDiGetClassDevs " << std::endl;
//HDEVINFO hDevInfoSet = SetupDiGetClassDevs(&GUID_DEVINTERFACE_COMPORT, nullptr, nullptr, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
HDEVINFO hDevInfoSet = SetupDiGetClassDevs(&GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR, nullptr, nullptr, DIGCF_PRESENT);
if (hDevInfoSet != INVALID_HANDLE_VALUE)
{
int nIndex = ;
while (true)
{
SP_DEVINFO_DATA spDevInfo;
spDevInfo.cbSize = sizeof(SP_DEVINFO_DATA);
if (SetupDiEnumDeviceInfo(hDevInfoSet, nIndex++, &spDevInfo))
{
ATL::CRegKey RegKey;
RegKey.Attach(SetupDiOpenDevRegKey(hDevInfoSet, &spDevInfo, DICS_FLAG_GLOBAL, , DIREG_DEV, KEY_QUERY_VALUE)); unsigned char szSerialPort[] = { };
unsigned long szSerialPortSize = sizeof(szSerialPort);
if (ERROR_SUCCESS == RegKey.QueryStringValue("PortName", (char*)szSerialPort, &szSerialPortSize))
{
std::cout << szSerialPort << std::endl;
}
RegKey.Detach();
RegKey.Close();
continue;
}
break;
}
SetupDiDestroyDeviceInfoList(hDevInfoSet);
} //6. //test: win7 no results
std::cout << "M6: WMI " << std::endl;
//HRESULT hResult = CoInitialize(nullptr);
HRESULT hResult = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
if (!FAILED(hResult))
{
hResult = CoInitializeSecurity(nullptr, -, nullptr, nullptr, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, nullptr, EOAC_NONE, nullptr); if (!FAILED(hResult))
{
IWbemLocator* pLocator = NULL;
//ATL::CComPtr<IWbemLocator> pLocator;
hResult = CoCreateInstance(CLSID_WbemLocator, nullptr, CLSCTX_INPROC_SERVER, IID_IWbemLocator, reinterpret_cast<void**>(&pLocator));
if (!FAILED(hResult))
{
IWbemServices* pServices = NULL;
//ATL::CComPtr<IWbemServices> pServices;
hResult = pLocator->ConnectServer(L"ROOT\\CimV2", nullptr, nullptr, nullptr, , nullptr, nullptr, &pServices);
if (!FAILED(hResult))
{
IEnumWbemClassObject* pClassObject = NULL;
//ATL::CComPtr<IEnumWbemClassObject> pClassObject;
hResult = pServices->CreateInstanceEnum(L"Win32_SerialPort", WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_WBEM_COMPLETE, nullptr, &pClassObject);
if (!FAILED(hResult))
{
hResult = WBEM_S_NO_ERROR;
while (WBEM_S_NO_ERROR == hResult)
{
unsigned long nReturned;
IWbemClassObject* pArrClassObject;
//ATL::CComPtr<IWbemClassObject> pArrClassObject[10];
//hResult = pClassObject->Next(WBEM_INFINITE, 10, reinterpret_cast<IWbemClassObject**>(pArrClassObject), &nReturned);
hResult = pClassObject->Next(WBEM_INFINITE, , &(pArrClassObject), &nReturned);
//hResult = 0x80041003
if (SUCCEEDED(hResult))
{
for (unsigned long i = ; i < nReturned; i++)
{
VARIANT stVariant;
HRESULT hGet = pArrClassObject->Get(L"DeviceID", , &stVariant, nullptr, nullptr);
if (SUCCEEDED(hGet) && stVariant.vt == VT_BSTR)
{
/*std::string item = stVariant.bstrVal;
if (0 == item.compare(0, 3, "COM"))*/
std::cout << stVariant.bstrVal << std::endl;
}
VariantClear(&stVariant);
pArrClassObject->Release();
}
}
}
pClassObject->Release();
}
pServices->Release();
}
pLocator->Release();
}
}
CoUninitialize();
} //5. //test: win7 no results
std::cout << "M5: ComDBGetCurrentPortUsage " << std::endl;
HCOMDB hComDB = nullptr;
if (ERROR_SUCCESS == ComDBOpen(&hComDB))
{
unsigned long nComDBBufferSize = ;
if (ERROR_SUCCESS == ComDBGetCurrentPortUsage(hComDB, nullptr, , CDB_REPORT_BYTES, &nComDBBufferSize))
{
unsigned char* szComDBBuffer = new unsigned char[nComDBBufferSize]();
if (ERROR_SUCCESS == ComDBGetCurrentPortUsage(hComDB, szComDBBuffer, nComDBBufferSize, CDB_REPORT_BYTES, &nComDBBufferSize))
{
for (size_t i = ; i < nComDBBufferSize; i++)
{
/* std::string item = szComDBBuffer;
if (0 == item.compare(0, 3, "COM"))*/
std::cout << szComDBBuffer << std::endl;
}
}
delete[] szComDBBuffer;
}
ComDBClose(hComDB);
} //4. //test: win7 no results
std::cout << "M4: EnumPorts " << std::endl;
unsigned long nNeeded = , nPortsSize = ;
if (!EnumPorts(nullptr, , nullptr, , &nNeeded, &nPortsSize))
{
unsigned long nError = GetLastError();
if (RPC_S_SERVER_UNAVAILABLE == nError)
std::cout << "SERVER_UNAVAILABLE" << std::endl;
else
std::cout << "Unknown Error " << nError << std::endl;
}
else
{
unsigned char* szEnumPortsBuffer = new unsigned char[nNeeded]();
if (EnumPorts(nullptr, , szEnumPortsBuffer, nNeeded, &nNeeded, &nPortsSize))
{
PORT_INFO_2* pPortInfo2 = reinterpret_cast<PORT_INFO_2*>(szEnumPortsBuffer);
for (size_t i = ; i < nPortsSize; i++)
{
std::string item = pPortInfo2->pPortName;
if ( == item.compare(, , "COM"))
std::cout << item << std::endl;
}
}
delete[] szEnumPortsBuffer;
} //3.
std::cout << "M3: QueryDosDevice " << std::endl;
unsigned long nResultLength = ;
unsigned long nBufferLengthTemp = ;
char* szpBuffer = new char[nBufferLengthTemp]();
do
{
nResultLength = QueryDosDevice(nullptr, szpBuffer, nBufferLengthTemp);
if ( == nResultLength && ERROR_INSUFFICIENT_BUFFER == GetLastError())
{
delete[] szpBuffer;
nBufferLengthTemp *= ;
szpBuffer = new char[nBufferLengthTemp]();
continue;
}
break;
} while (true);
char* szpBufferMovable = szpBuffer;
do
{
std::string item = szpBufferMovable;
if ( == item.compare(, , "COM"))
std::cout << item << std::endl; nResultLength -= (item.length() + );
szpBufferMovable += (item.length() + );
} while ( < nResultLength);
delete[] szpBuffer; //2.
std::cout << "M2: RegQueryValue " << std::endl;
ATL::CRegKey RegKey;
if (ERROR_SUCCESS == RegKey.Open(HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\SERIALCOMM", KEY_QUERY_VALUE))
{
unsigned long nIndex = ;
while (true)
{
char szPorts[] = { };
unsigned long nPorts = sizeof(szPorts);
//一般为 ERROR_ACCESS_DENIED == 5
//if (ERROR_SUCCESS == RegKey.EnumKey(nIndex++, szPorts, &nPorts))
if (ERROR_SUCCESS == RegEnumValue(RegKey, nIndex++, szPorts, &nPorts, nullptr, nullptr, nullptr, nullptr))
{
char szPortsValue[] = { };
unsigned long nPortsValue = sizeof(szPortsValue);
if (ERROR_SUCCESS == RegKey.QueryStringValue(szPorts, szPortsValue, &nPortsValue))
{
std::cout << szPortsValue << std::endl;
continue;
}
}
break;
}
RegKey.Close();
} //1.
std::cout << "M1: CreateFile " << std::endl;
for (size_t i = ; i < ; i++)
{
char szPorts[] = { };
sprintf(szPorts, "\\\\.\\COM%d", i);
HANDLE hPorts = CreateFile(szPorts, GENERIC_READ | GENERIC_WRITE, , , OPEN_EXISTING, , );
if (INVALID_HANDLE_VALUE != hPorts)
{
std::cout << szPorts << std::endl;
CloseHandle(hPorts);
}
}

相关头文件库

using namespace std;
#include <string>
#include <vector>
#include <iostream>
#include <Windows.h>
#include <atlbase.h> //ATL::CRegKey
#include <winspool.h> //EnumPorts
#include <msports.h> //ComDBOpen
#pragma comment(lib, "msports.lib")
#include <WbemCli.h> //CLSID_WbemLocator
#pragma comment(lib, "WbemUuid.lib")
#include <setupapi.h> //SetupDiGetClassDevs

C++多种方法枚举串口号的更多相关文章

  1. 通过串口设备vid,pid自动获得该设备所对应的串口号

    用C#做串口通讯很方便,因为dotfx2.0已经集成了Serial Port控件,此控件使用上比MSComm控件更简单,当然它也有一个小bug (RecievedBytesThreshold设置有时候 ...

  2. CSS导航菜单水平居中的多种方法

    CSS导航菜单水平居中的多种方法 在网页设计中,水平导航菜单使用是十分广泛的,在CSS样式中,我们一般会用Float元素或是「display:inline-block」来解决.而今天主要讲解如何让未知 ...

  3. 用 Python 排序数据的多种方法

    用 Python 排序数据的多种方法 目录 [Python HOWTOs系列]排序 Python 列表有内置就地排序的方法 list.sort(),此外还有一个内置的 sorted() 函数将一个可迭 ...

  4. js判断移动端是否安装某款app的多种方法

    本文实例讲解了js判断移动端是否安装某款app的多种方法,分享给大家供大家参考,具体内容如下 第一种方法: 一:判断是那种设备 ? || u.indexOf(; //android终端或者uc浏览器 ...

  5. Gradle学习系列之二——创建Task的多种方法

    在本系列的上篇文章中,我们讲到了Gradle入门,在本篇文章中我们将讲到创建Task的多种方法. 请通过以下方式下载本系列文章的Github示例代码: git clone https://github ...

  6. SQL语句的添加、删除、修改多种方法

    SQL语句的添加.删除.修改虽然有如下很多种方法,但在使用过程中还是不够用,不知是否有高手把更多灵活的使用方法贡献出来? 添加.删除.修改使用db.Execute(Sql)命令执行操作╔------- ...

  7. 给ul中的li添加事件的多种方法

    给ul中的li添加事件的多种方法 这是一个常见,而且典型的前端面试题 <ul> <li>11111</li> <li>22222</li> ...

  8. PHP获取时间日期的多种方法

    分享下PHP获取时间日期的多种方法. <?php echo "今天:".date("Y-m-d")."<br>";     ...

  9. 转载“启动\关闭Oracle数据库的多种方法”--来自百度#Oracle

    启动\关闭Oracle数据库的多种方法 启动和关闭oracle有很多种方法. 这里只给出3种方法: l         Sql*plus l         OEM控制台 l         Wind ...

随机推荐

  1. Java实现 LeetCode 328 奇偶链表

    328. 奇偶链表 给定一个单链表,把所有的奇数节点和偶数节点分别排在一起.请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性. 请尝试使用原地算法完成.你的算法的空间复杂 ...

  2. Java实现 蓝桥杯VIP 算法训练 集合运算

    问题描述 给出两个整数集合A.B,求出他们的交集.并集以及B在A中的余集. 输入格式 第一行为一个整数n,表示集合A中的元素个数. 第二行有n个互不相同的用空格隔开的整数,表示集合A中的元素. 第三行 ...

  3. Java实现蓝桥杯VIP 算法训练 阶乘末尾

    试题 算法训练 阶乘末尾 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给定n和len,输出n!末尾len位. 输入格式 一行两个正整数n和len. 输出格式 一行一个字符串,表示 ...

  4. Java实现 LeetCode 242 有效的字母异位词

    242. 有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 示例 1: 输入: s = "anagram", t = " ...

  5. Java实现 蓝桥杯 历届真题 数字拆分

    正整数可以表示为若干正整数的累加和. 如,对于正整数n=6,可以分划为: 5+1 4+2 4+1+1 3+3 3+2+1 3+1+1+1 2+2+2 2+2+1+1 2+1+1+1+1 1+1+1+1 ...

  6. Java实现 蓝桥杯 历届试题 横向打印二叉树

    问题描述 二叉树可以用于排序.其原理很简单:对于一个排序二叉树添加新节点时,先与根节点比较,若小则交给左子树继续处理,否则交给右子树. 当遇到空子树时,则把该节点放入那个位置. 比如,10 8 5 7 ...

  7. PAT 福尔摩斯的约会

    大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm.大侦探很快就明白了,字条上奇 ...

  8. 全网最全测试点总结:N95 口罩应该如何测试?

    引言 随着”新冠疫情“慢慢地消散,各大企业都开始恢复正常的运行,因为疫情造成很多工作人员的流失,企业也开始疯狂的招聘新鲜的人才,这对于莘莘求职者无疑是个机会,但是因为求职者众多,很多面试官也开始想方设 ...

  9. Java基础(十)

    一.XML概述 属性文件是用来描述程序配置,属性文件包含了一组名/值对.属性文件采用的是一种单一的平面层次结构,同时属性文件要求键是唯一的. XML格式能够表达层次结构,并且重复的元素不会被曲解. H ...

  10. profile(/etc/profile)和bash_profile的区别

    profile(/etc/profile)和bash_profile的区别 profile(/etc/profile),用于设置系统级的环境变量和启动程序,在这个文件下配置会对所有用户生效.当用户登录 ...