crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Как получить список COM-портов в MS Windows?
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Litkevich Yuriy Дата 17.10.2008, 10:06
  да я умышленно про реестр, к нему из разных библиотек доступ получить можно, как я понимаю.
ViGOur Дата 17.10.2008, 7:52
  В реестре есть, но не помню где, вот так можно получить список:
#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 Дата 16.10.2008, 21:21
  Есть ли ветка в реестре которая содержит список COM-портов?
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 19.4.2024, 15:30