imho.ws |
![]() |
![]() |
|
Сообщения:
Перейти к новому /
Последнее
|
Опции темы |
![]() |
# 2 |
::VIP::
Регистрация: 19.03.2004
Сообщения: 1 329
![]() ![]() ![]() ![]() |
Либо проштудировать раздел реестра
Код:
HKEY_LOCAL_MACHINE\Hardware\DeviceMap\SerialComm перебором попыток открыть соответствующий порт напямую и анализом результата Код:
CreateFile(AnsiString("\\\\.\\COM"+IntToStr(i)).c_str(), GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); Последний раз редактировалось ЕЖ; 25.03.2005 в 00:15. |
![]() |
![]() |
# 5 |
Member
Регистрация: 02.09.2003
Сообщения: 215
![]() ![]() ![]() |
я делаю таким методом
Код:
#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; } // for ( ; ; ) } // if(dwChars) } // if(bGetVer && (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)) 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(hPort == INVALID_HANDLE_VALUE) // Выводим на экран название порта if(bSuccess) { printf(sPort); printf("\n"); } } // for (UINT i=1; i<256; i++) } // if(bGetVer && (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)) } //------------------------------------------------------------------------------ int main() { EnumerateSerialPorts(); getch(); return 0; } //------------------------------------------------------------------------------
__________________
не могу просто так сидеть, когда другие работают. пойду полежу. |
![]() |