"Sartorius78" <64632@users.rsdn.ru> wrote in message
news:2470883@news.rsdn.ru...
> Подскажите, как получить список доступных com портов в системе?
> Спасибо.
Попробовать открыть COMx где x от 1 до 9?
Posted via RSDN NNTP Server 2.0
Здравствуйте, Sartorius78, Вы писали:
S>Подскажите, как получить список доступных com портов в системе?
здесьАвтор: _const_
Дата: 12.05.06
Здравствуйте, Sartorius78, Вы писали:
S>Подскажите, как получить список доступных com портов в системе?
S>Спасибо.
У меня так сделано:
//adapt STL string to UNICODE
typedef std::string TStringA;
typedef std::wstring TStringW;
#ifdef _UNICODE
typedef std::wstring TString;
#else
typedef std::string TString;
#endif //_UNICODE
typedef std::vector<TString> TStrings;
...
bool GetComPortNames(TStrings& port_names)
{
//enumerate all devices
const size_t buffer_size = 16*KILOBYTE;
TCHAR buffer[buffer_size] = {};
if(FALSE == ::QueryDosDevice(NULL, buffer, buffer_size))
{
TraceLastError(_T("TOptions::TOptions() ::QueryDosDevice() failed"));
return false;
}
//get comport names
LPCTSTR buffer_end = buffer + buffer_size;
LPCTSTR device_name = buffer;
size_t device_name_size = ::_tcslen(device_name);
port_names.clear();
while(device_name < buffer_end)
{
if(0 == device_name_size) //"\0\0" sequance represents empty string
return true;
//is device_name represents com port?
if(device_name_size > 3 &&
_T('C') == device_name[0] &&
_T('O') == device_name[1] &&
_T('M') == device_name[2])
port_names.push_back(TString(device_name));
//get next device name
device_name += device_name_size + 1;
device_name_size = ::_tcslen(device_name);
}
return true;
}
Здравствуйте, Sartorius78, Вы писали:
S>Подскажите, как получить список доступных com портов в системе?
http://rsdn.rsdn.ru/Forum/Message.aspx?mid=460793&only=1Автор: Leonid Troyanovsky
Дата: 29.11.03
Здравствуйте, Sartorius78, Вы писали:
S>Подскажите, как получить список доступных com портов в системе?
S>Спасибо.
static bool EnumerateCOMPorts(std::set<int>& sComPortNumbers);
bool TCallManager::EnumerateCOMPorts(std::set<int>& sComPortNumbers)
{
static GUID GUID_DEVINTERFACE_COMPORT = {0x86E0D1E0L, 0x8089, 0x11D0, 0x9C, 0xE4, 0x08, 0x00, 0x3E, 0x30, 0x1F, 0x73};
HDEVINFO hDevInfo = SetupDiGetClassDevs((LPGUID) &GUID_DEVINTERFACE_COMPORT, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (hDevInfo == INVALID_HANDLE_VALUE) {
return false;
}
BOOL bMoreItems = TRUE;
int iIndex = 0;
SP_DEVINFO_DATA devInfoData;
while (bMoreItems) {
devInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
bMoreItems = SetupDiEnumDeviceInfo(hDevInfo, iIndex, &devInfoData);
if (bMoreItems) {
HKEY hDeviceKey = SetupDiOpenDevRegKey(
hDevInfo,
&devInfoData,
DICS_FLAG_GLOBAL,
0,
DIREG_DEV,
KEY_QUERY_VALUE);
TCHAR PortName[256];
if (hDeviceKey != INVALID_HANDLE_VALUE) {
DWORD dwSize = sizeof(PortName);
DWORD dwType;
memset(PortName, 0x00, sizeof(TCHAR) * 256);
if ((RegQueryValueEx(hDeviceKey, "PortName", NULL, &dwType, PortName, &dwSize) == ERROR_SUCCESS) && (dwType == REG_SZ)) {
//process port name here
if (_tcslen(PortName) > 3) {
int iPort;
if (sscanf(PortName, "COM%d", &iPort) == 1)
sComPortNumbers.insert(iPort);
}
}
RegCloseKey(hDeviceKey);
}
}
++iIndex;
}
SetupDiDestroyDeviceInfoList(hDevInfo);
return true;
}
Для успешной компиляции надо подключить setupapi.h
#include <setupapi.h>
#include <set>
using namespace std;
Этот код возвращает все доступные для открытия номера COM-портов системы.