// (C) Фролов Г.В., 1995
// Адрес E-mail: frolov@glas.apc.org

// ===================================================================
// Определение доступных COM-портов
// ===================================================================

#define	STRICT
#include	<windows.h>

BYTE FAR FindCOMPorts( void );

// ===================================================================
// Функция WinMain
// ===================================================================
#pragma argsused

int PASCAL
WinMain( HINSTANCE hInstance,
			HINSTANCE hPrevInstance,
			LPSTR lpCmdLine,
			int nCmdShow )
{
	char  szMsg[ 60 ] = "";
	BYTE  bFindPort;

	// Определяем доступные для использования COM-порты
	bFindPort = FindCOMPorts();

	// Формируем строку результата с названиями доступных портов
	for (int nBitNum = 0; nBitNum < 8; nBitNum++)
	{
		if (bFindPort & (BYTE) (1 << (BYTE)nBitNum))
		wsprintf( szMsg, "%sCOM%d ", (LPSTR) szMsg, nBitNum + 1 ) ;
	}

	// Отображаем на экране сообщение с названиями доступных
	// COM-портов
	MessageBox(NULL, szMsg, "Обнаружены COM-порты:",
				  MB_OK | MB_ICONINFORMATION);

	return 0;
}


// ===================================================================
// Функция FindCOMPorts
// Функция вызывает драйвер асинхронного адаптера и определяет какие
// COM-порты установлены на компьютере и доступны для использования
// ===================================================================

BYTE FAR FindCOMPorts( void )
{
	// Буфер для подготовки имени порта
	char	szCommPattern[8];	
	// Идентификатор COM-порта
	int	idComDev;
   // Переменная для формирования результата
	BYTE	bFindPort = 0;
	// Вспомагательная переменная nBitNum 
	int	nBitNum = 1;

	// Пробуем открыть COM-порты COM1 - COM8
	for(int i = 0; i < 8; i++) {
		
		wsprintf( szCommPattern, "COM%d", i + 1 ) ;

		// Открываем COM-порт
		idComDev = OpenComm(szCommPattern, 1024, 1024);

		if (idComDev >= 0)
		{
			// Если COM-порт n успешно открыт, тогда устанвливаем
			// в переменной bFindPort n-ый бит
			bFindPort = bFindPort | nBitNum;

			// Закрываем COM-порт
			CloseComm(idComDev);
		}
		nBitNum <<= 1;
	}

   // Возвращаем результат
	return bFindPort;
}


