Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как получить список COM-портов в MS Windows?
Форум на CrossPlatform.RU > Библиотеки > Другие библиотеки
Litkevich Yuriy
Есть ли ветка в реестре которая содержит список COM-портов?
ViGOur
В реестре есть, но не помню где, вот так можно получить список:
#include <windows.h>
#include <TCHAR.H >
#include <conio.h>
#include <stdio.h>

void EnumerateSerialPorts()
{
    // В какой системе работаем?
    OSVERSIONINFO osvi;
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    BOOL bGetVer = GetVersionEx(&osvi);

    // В NT используем API QueryDosDevice
    if(bGetVer && (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT))
    {
        // Используем QueryDosDevice для просмотра всех устройств похожих на COMx.
        // Это наилучшее решение, так как порты не требуется открывать
        TCHAR szDevices[65535];
        DWORD dwChars = QueryDosDevice(NULL, szDevices, 65535);
        if(dwChars)
        {
            int i=0;
            for (;;)
            {
                // Получаем текущее имя устройства
                TCHAR* pszCurrentDevice = &szDevices[i];
                
                // Если похоже на "COMX" выводим на экран
                int nLen = _tcslen(pszCurrentDevice);
                if(nLen > 3 && _tcsnicmp(pszCurrentDevice, _T("COM"), 3) == 0)
                {
                    printf(pszCurrentDevice);
                    printf("\n");
                }
                // Переходим к следующему символу терминатору
                while(szDevices[i] != _T('\0'))
                    i++;

                // Перескакиваем на следующую строку
                i++;
                
                // Список завершается двойным симмволом терминатором, так что если символ
                // NULL, мы дошли до конца
                if(szDevices[i] == _T('\0'))
                    break;
            }
        }
    }
    else
    {
        // В 95/98 открываем каждый порт для определения его существования
        // Поддерживается до 255 COM портов, так что мы проходим пл всему списку
        // Если мы не можем открыть порт, или происходит ошибка при открытии,
        // получаем access denied или общую ошибку все эти случаи указывают на
        // то, что под таким номером есть порт.
        for (UINT i=1; i<256; i++)
        {
            // Формируем сырое имя устройства
            char sPort[10];
            sprintf(sPort,"\\\\.\\COM%d", i);
            
            // Пытаемся открыть каждый порт
            BOOL bSuccess = FALSE;
            HANDLE hPort = ::CreateFile(sPort, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
            if(hPort == INVALID_HANDLE_VALUE)
            {
                DWORD dwError = GetLastError();
                
                // Смотрим что получилось при открытии
                if(dwError == ERROR_ACCESS_DENIED || dwError == ERROR_GEN_FAILURE)
                    bSuccess = TRUE;
            }
            else
            {
                // Порт открыт успешно
                bSuccess = TRUE;
                
                // Не забываем закрывать каждый открытый порт,
                // так как мы не собираемся с ним работать...
                CloseHandle(hPort);
            }

            // Выводим на экран название порта
            if(bSuccess)
            {
                printf(sPort);
                printf("\n");
            }
        }
    }
}

int main()
{
    EnumerateSerialPorts();
    getch();
    return 0;
}
Litkevich Yuriy
да я умышленно про реестр, к нему из разных библиотек доступ получить можно, как я понимаю.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.