Traversal serial number serial programming ---

1, direct traversal:

int CZzcSerial::TraveralCom(vector<string>& vName, vector<string>& vzName)
{
	int nNum = 0;
	vName.clear();

	for (int i = 0;i < 256;++i)
	{
		char szComName[MAX_PATH] = {0};
		sprintf_s(szComName, "\\\\.\\COM%d", i);

		HANDLE hPort = CreateFile(szComName,
			GENERIC_READ | GENERIC_WRITE ,
			0,
			0,
			OPEN_EXISTING,
			0,
			0);

		if (INVALID_HANDLE_VALUE == hPort)
		{
			if (ERROR_ACCESS_DENIED == GetLastError())
			{
				//当前串口被占用
				vzName.push_back(string(szComName));
			}
		} 
		else
		{
			++nNum;
			vName.push_back(string(szComName));
			CloseHandle(hPort);
			hPort = INVALID_HANDLE_VALUE;
		}
	}

	return nNum;
}

2, by reading the registry:

void CZzcSerial::TraveralCom(vector<string>& vName)
{
	HKEY hKey;
	char szportName[MAX_PATH], szcommName[MAX_PATH];

	if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, //主键
		"Hardware\\DeviceMap\\SerialComm",                  //子健
		NULL,
		KEY_READ,                                           //权限
		&hKey
		))
	{
		int i = 0;
		int mm = 0;
		vName.clear();
		DWORD  dwLong, dwSize;
		while (memset(szportName, 0, sizeof(szportName)) || memset(szcommName, 0, sizeof(szcommName)))
		{
			dwLong = dwSize = sizeof(szportName);
			// 枚举串口
			if (ERROR_NO_MORE_ITEMS == ::RegEnumValue(hKey, i, szportName, &dwLong, NULL, NULL, (PUCHAR)szcommName, &dwSize))   
			{
				break;
			}
			vName.push_back(szcommName);
			i++;
		}
		// 关闭注册表
		RegCloseKey(hKey);
	}
	else
	{
		MessageBox(NULL,"读取注册表失败.","警告",MB_OK);
	}
}

 

Guess you like

Origin blog.csdn.net/u012372584/article/details/93738976