C++获取计算机的COM口(串口号)

刚开始转做上位机,然后要使用串口通信。其实项目不需要获取串口号,开始不知道,就去获取了串口号。
整理了一下,以后要用的话也方便使用。

环境:VS2013 + QT5.7

QStringList ConfigInterfaceDevice::getEnableCommPort()
{
	QStringList CommPortList;

	QString strCommPath = tr("HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM");
	QSettings *settings = new QSettings(strCommPath, QSettings::NativeFormat);
	QStringList keyList = settings->allKeys();

	if (!keyList.isEmpty())
	{
		for (int i = 0; i < keyList.count(); i++)
			CommPortList.append(getComm(i,true));
	}

	return CommPortList;
}

// nIndex为索引号 bValue选择返回值为key还是value,默认为value
QString ConfigInterfaceDevice::getComm(int nIndex, bool bValue)
{
	QString strCommRet = tr("");
	HKEY hKey;

	// RegOpenKeyEx windowsApi 成功返回0 需要加头文件
	if (::RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_READ, &hKey) != 0)
	{
		QMessageBox::warning(this, tr("注册表"), tr("无法打开注册表!"), QMessageBox::Ok);
		return tr(""); // 无法打开注册表
	}

	QString strKeyMsg;      // 键名
	QString strValueMsg;    // 键值
	wchar_t keyName[256];   // 键名数组
	char keyValue[256];     // 键值数组

	ulong nKeySize = sizeof(keyName);
	ulong nValueSize = sizeof(keyValue);
	ulong nType;

	if (::RegEnumValue(hKey, nIndex, keyName, &nKeySize, 0, &nType, (BYTE*)keyValue, &nValueSize) == 0) // 列举键名
	{
		// 读取键名
		for (uint i = 0; i < nKeySize; i++)
		{
			if (keyName[i] != 0x00)
				strKeyMsg.append(keyName[i]);
		}

		// 读取键值
		for (uint j = 0; j < nValueSize; j++)
		{
			if (keyValue[j] != 0x00)
				strValueMsg.append(keyValue[j]);
		}

		if (bValue)
			strCommRet = strValueMsg;
		else
			strCommRet = strKeyMsg;
	}//if
	else
	{
		::RegCloseKey(hKey); // 关闭注册表
		return tr("");  // 无可用串口
	}

	return strCommRet;
}

你可能感兴趣的:(C++获取计算机的COM口(串口号))