Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2]  Все   Вниз
  Печать  
Автор Тема: определить СОМ порты под разными версиями Windows  (Прочитано 66117 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #30 : 29-06-2004 08:35 » 

Цитата: Джон
MOPO3,  Слушай я что-то не вижу ....  Она у тебя наверно тут висит:

WaitForSingleObject(OL.hEvent, INFINITE);

Если так, то ставь время поменьше и прверяй переданные байты и решай оборвать или нет только проверяй WaitForSingleObject(OL.hEvent, 1000); на TIME_OUT

время задержки выбери согласно твоим условиям (скорости железа и тд)


Да, висит именно на WaitForSingleObject(OL.hEvent, INFINITE);
Ок, попробую с таймаутом поиграться.
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #31 : 30-06-2004 05:30 » 

Цитата: Pu
MOPO3,  я думал что есть какие либо решения которые показывают то , что прописано в режистри. Если порт открыт, соответственно получим INVALID_HANDLE_VALUE, а хотелось бы и его увидеть в списке

Вот как вывести порты даже если получим INVALID_HANDLE_VALUE :
Код:
String comm_port;
    for(int i = 1; i < 255; i++)
    {
        comm_port = "\\\\.\\COM" + IntToStr(i);

        hComm_test = CreateFile(comm_port.c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
        if(hComm_test == INVALID_HANDLE_VALUE)
        {
            DWORD dwError = GetLastError();
            if(dwError == ERROR_ACCESS_DENIED || dwError == ERROR_GEN_FAILURE)
            {
                ComPort->Items->Add("COM" + IntToStr(i));
            }
            CloseHandle(hComm_test);
        }
        else
        {
            ComPort->Items->Add("COM" + IntToStr(i));
            CloseHandle(hComm_test);
        }
    }

Во как Улыбаюсь и не надо в реджистри лезть  Ага
« Последнее редактирование: 28-11-2007 18:54 от Алексей1153++ » Записан

MCP, MCAD, MCTS:Win, MCTS:Web
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #32 : 30-06-2004 11:18 » 

MOPO3,  Я думаю это зависит от задачи. Ведь если один СОМ уже занят, то он тебе не будет показан, хотя он существует. Этот метод хорош для свободных портов.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #33 : 30-06-2004 11:23 » 

Джон, будет показан даже занятый порт Улыбаюсь Я уже проверил Улыбаюсь Покажет после обработки вот этого блока
Код:
 if(dwError == ERROR_ACCESS_DENIED || dwError == ERROR_GEN_FAILURE) 
            {
                ComPort->Items->Add("COM" + IntToStr(i));
            }
« Последнее редактирование: 28-11-2007 18:56 от Алексей1153++ » Записан

MCP, MCAD, MCTS:Win, MCTS:Web
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #34 : 30-06-2004 12:16 » 

MOPO3,  Сорри  :oops:  Не увидел. "Галопом по европам."
Но с другой стороны, а если он в самом деле ERROR_GEN_FAILURE, можно ли говорить о существовании этого порта? :l_smile:
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #35 : 30-06-2004 12:23 » new

Джон, тогда правильнее будет проверять только ERROR_ACCESS_DENIED. Думаю что это выдаётся только для существующих портов ИМХО.
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
Scorpion
Гость
« Ответ #36 : 24-03-2009 18:43 » 

Прошло много лет...

Реализовал я идею МОРОЗ'а.

Скажу только что я часто работаю с разными шнурками USB-COM. Которые в системе создают виртуальный COM-порт. Дырок USB в компе много, один и тот же шнурок можно воткнуть в разные дырки - получаться разные виртуальные COM-порты. И вот набралось у меня этих виртуальных компортов в системе немало. Поскольку многие программы умеют работать только с псевдонимами (COM1..COM8) то приходилось в свойствах драйвера устанавливать COM13 -> COM5 (например) и говорить что так и надо. В итоге - множество записей в реестре о когда либо воткнутых в компутер шнурках как о COM портах :


SYSTEM\CurrentControlSet\Enum\FTDIBUS\VID_0403+PID_6001+A4004WiIA\0000\\Device Parameters
COM5 - USB Serial Port (COM5)
FTSER2K

SYSTEM\CurrentControlSet\Enum\FTDIBUS\VID_0403+PID_6001+A9004FJTA\0000\\Device Parameters
COM13 - USB Serial Port (COM13)
FTSER2K

SYSTEM\CurrentControlSet\Enum\FTDIBUS\VID_0403+PID_6001+A9004FQHA\0000\\Device Parameters
COM5 - USB Serial Port (COM5)
FTSER2K

SYSTEM\CurrentControlSet\Enum\FTDIBUS\VID_0403+PID_6001+ftDGUR6QA\0000\\Device Parameters
COM2 - USB Serial Port (COM2)
FTSER2K

SYSTEM\CurrentControlSet\Enum\FTDIBUS\VID_0403+PID_6001+ftDHIXHUA\0000\\Device Parameters
COM6 - USB Serial Port (COM6)
FTSER2K

SYSTEM\CurrentControlSet\Enum\NMWCD\VID_0421&PID_04f9&IF_JAVACOMM\7&ff26118&0&09\\Device Parameters
COM12 - Nokia 6300 USB (COM12)
usbser

SYSTEM\CurrentControlSet\Enum\umpport\com\6&501705c&0&0000\\Device Parameters
COM4 - MSP-FET430UIF - Serial Port (COM4)
umpusbxp

SYSTEM\CurrentControlSet\Enum\USB\Vid_067b&Pid_2303\5&3512b308&0&1\\Device Parameters
COM5 - DCU-11 USB-to-Serial Bridge (COM5)
Ser2pl

SYSTEM\CurrentControlSet\Enum\USB\Vid_067b&Pid_2303\5&3512b308&0&2\\Device Parameters
COM7 - DCU-11 USB-to-Serial Bridge (COM7)
Ser2pl

SYSTEM\CurrentControlSet\Enum\USB\Vid_067b&Pid_2303\5&63ec2dd&0&1\\Device Parameters
COM7 - DCU-11 USB-to-Serial Bridge (COM7)
Ser2pl

SYSTEM\CurrentControlSet\Enum\USB\Vid_067b&Pid_2303\5&63ec2dd&0&2\\Device Parameters
COM4 - DCU-11 USB-to-Serial Bridge (COM4)
Ser2pl

SYSTEM\CurrentControlSet\Enum\USB\Vid_067b&Pid_2303\6&337a5645&0&4\\Device Parameters
COM7 - DCU-11 USB-to-Serial Bridge (COM7)
Ser2pl

SYSTEM\CurrentControlSet\Enum\USB\Vid_0e55&Pid_110b\5&3512b308&0&1\\Device Parameters
COM7 - MS3303H USB-to-Serial Bridge (COM7)
Ser2pl

SYSTEM\CurrentControlSet\Enum\USB\Vid_0e55&Pid_110b\5&3512b308&0&2\\Device Parameters
COM6 - MS3303H USB-to-Serial Bridge (COM6)
Ser2pl

SYSTEM\CurrentControlSet\Enum\USB\Vid_4348&Pid_5523\5&3512b308&0&1\\Device Parameters
COM8 - USB-SERIAL CH340 (COM8)
CH341SER

SYSTEM\CurrentControlSet\Enum\USB\Vid_4348&Pid_5523\5&3512b308&0&2\\Device Parameters
COM2 - USB-SERIAL CH340 (COM2)
CH341SER

SYSTEM\CurrentControlSet\Enum\USB\Vid_4348&Pid_5523\5&63ec2dd&0&1\\Device Parameters
COM2 - USB-SERIAL CH340 (COM2)
CH341SER

SYSTEM\CurrentControlSet\Enum\USB\Vid_4348&Pid_5523\5&63ec2dd&0&2\\Device Parameters
COM7 - USB-SERIAL CH340 (COM7)
CH341SER

SYSTEM\CurrentControlSet\Enum\USB\Vid_4348&Pid_5523\6&337a5645&0&2\\Device Parameters
COM8 - USB-SERIAL CH340 (COM8)
CH341SER

SYSTEM\CurrentControlSet\Enum\USB\Vid_4348&Pid_5523\6&a993ce3&0&2\\Device Parameters
COM8 - USB-SERIAL CH340 (COM8)
CH341SER

SYSTEM\CurrentControlSet\Enum\USB\Vid_4348&Pid_5523\6&a993ce3&0&4\\Device Parameters
COM6 - USB-SERIAL CH340 (COM6)
CH341SER

SYSTEM\CurrentControlSet\Enum\USB\Vid_6547&Pid_0232\5&3512b308&0&1\\Device Parameters
COM6 - USB Data Cable (COM6)
usb2vcom

SYSTEM\CurrentControlSet\Enum\USB\Vid_6547&Pid_0232\5&3512b308&0&2\\Device Parameters
COM3 - USB Data Cable (COM3)
usb2vcom

SYSTEM\CurrentControlSet\Enum\USB\Vid_6547&Pid_0232\6&a993ce3&0&4\\Device Parameters
COM10 - USB Data Cable (COM10)
usb2vc
om
[/tt]

Кстати, в список попадает так же LPT1 порт, так как для него ClassName == "Ports" а также ClassGUID тот же что и для последовательных портов. Как их различить ?

Получается не очень красиво:


Ну а хочется то видеть собственно


т.е. реально присутствующие в системе порты.
Сразу попрошу не предлагать пытаться открывать найденные в реестре порты, так как хотелось бы видеть в описании порта "FriendlyName" актуальную подпись !
Может быть в реестре делается пометка что это устройство сейчас подключено ?

Как такого добиться ?

* serials.GIF (6.94 Кб - загружено 936 раз.)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #37 : 24-03-2009 20:12 » 

Scorpion, я вот такой код себе написал, переделай по своему вкусу )

Код:
//получить список COM-портов в системе
void CRegWork2::st_EnumCOMports(
CStringArray& csaCOMzList,
bool bClearListBeforeWork,
CComboBox* const pcbx,
const CStringArray* const p_csaCOMzList_dontTouchComboIfNewListEqualToThis,
bool* pbWasCha
)
{
if(pbWasCha)*pbWasCha=false;
CRegWork2 rw2;
if(rw2.OpenKeyIn_HKEY_LOCAL_MACHINE("HARDWARE\\DEVICEMAP\\SERIALCOMM"))
{
if(bClearListBeforeWork)csaCOMzList.RemoveAll();

LONG res;
char currParName[MAX_PATH+1];
memset(currParName,0,sizeof(currParName));
DWORD dwdNameLenToUse=0;

BYTE currCOMName[100+1];
memset(currCOMName,0,sizeof(currCOMName));
DWORD dwdcurrCOMnameLen=0;

DWORD dwdType=REG_SZ;

CString csTemp;
for(DWORD dwd=0;;dwd++)
{
dwdNameLenToUse=sizeof(currParName)-1;
dwdcurrCOMnameLen=sizeof(currCOMName)-1;
res=RegEnumValue(rw2.GetHKEY(),dwd,currParName,&dwdNameLenToUse,0,&dwdType,currCOMName,&dwdcurrCOMnameLen);

if(res!=ERROR_SUCCESS)break;

if(dwdcurrCOMnameLen && dwdcurrCOMnameLen<=sizeof(currCOMName)-1)
{
currCOMName[dwdcurrCOMnameLen]=0;
csaCOMzList.Add(currCOMName);

//сортируем по возрастанию
if(csaCOMzList.GetSize()>1)
{
int i;
for(i=csaCOMzList.GetSize()-1; i>=1; i--)
{
if(csaCOMzList[i]>=csaCOMzList[i-1])break;

csTemp=csaCOMzList[i];
csaCOMzList[i]=csaCOMzList[i-1];
csaCOMzList[i-1]=csTemp;
}
}
}
}
}

//определяем похожесть на предыдущий список
bool bIsLikeTo=true;
if(!p_csaCOMzList_dontTouchComboIfNewListEqualToThis)
{
bIsLikeTo=false;
}
else
{
if(p_csaCOMzList_dontTouchComboIfNewListEqualToThis->GetSize()!=csaCOMzList.GetSize())
{
bIsLikeTo=false;
}
else
{
//размеры списков равны
int i;
for(i=0; i<csaCOMzList.GetSize(); i++)
{
if(csaCOMzList[i]!=(*p_csaCOMzList_dontTouchComboIfNewListEqualToThis)[i])
{
bIsLikeTo=false;
break;
}
}
}
}


//csaCOMzList - отсортирован по возрастанию

if(pcbx && !bIsLikeTo)
{
if(pbWasCha)*pbWasCha=true;

pcbx->ResetContent();

//компорты
int i;
for(i=0;i<csaCOMzList.GetSize();i++)
{
pcbx->AddString(csaCOMzList[i]);
}
}
}
Записан

Scorpion
Гость
« Ответ #38 : 24-03-2009 21:01 » 

Дружище, ты бы мне идею саму подсказал  !
Ладно, завтра на свежу голову покурю твой код....
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #39 : 24-03-2009 21:11 » 

ммм, наверное я что то не понял. Скажи в двух словах - в чём проблема основная заключается ?

1) список комов получить
2) отличить USB железки одна от другой

?
Записан

Scorpion
Гость
« Ответ #40 : 25-03-2009 14:29 » 

Думал что описал все крайне подробно, но кажись переборщил - кто же осилит скока букав !
Попытаюсь в двух словах:

Метод МОРОЗа вытаскивает из реестра все СОМ порты когда либо установленные в системе (даже если девайс вытащили то COM порты остались жить в реестре)

Мне нужно получить список РЕАЛЬНО ПРИСУТСТВУЮЩИХ портов в системе, так как показывает Диспетчер Устройств.
Тупой перебор не катит так как не дает описания порта.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #41 : 25-03-2009 17:38 » 

Scorpion, мой код как раз для твоей задачи. Только он использует MFC+API, но если нужно, всё легко перекладывается чисто на АПИ )
Записан

zubr
Гость
« Ответ #42 : 25-03-2009 17:49 » 

Scorpion, смотри в сторону 2-х вариантов:
1. Используя API-функции SetupDiCreateDeviceInfoList, SetupDiGetClassDevsEx, SetupDiEnumDeviceInfo получить список оборудования определенного класса, в данном случае COM-порты.
2. Используя WMI получить список последовательных портов. В msdn есть пример, правда на VB:
Код:
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")
Set colSMBIOS = objWMIService.ExecQuery _
    ("Select * from Win32_SystemEnclosure")
For Each objSMBIOS in colSMBIOS
    Wscript.Echo "Part Number: " & objSMBIOS.PartNumber
    Wscript.Echo "Serial Number: " _
        & objSMBIOS.SerialNumber
    Wscript.Echo "Asset Tag: " _
        & objSMBIOS.SMBIOSAssetTag
Next
А вот для USB:
Код:
strComputer = "."
Set objWMIService = GetObject(_
    "winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery( _
    "Select * from Win32_USBHub")
For Each objItem in colItems
    Wscript.Echo "Device ID: " & objItem.DeviceID
    Wscript.Echo "PNP Device ID: " _
        & objItem.PNPDeviceID
    Wscript.Echo "Description: " _
        & objItem.Description
    Wscript.Echo
Next
Записан
Scorpion
Гость
« Ответ #43 : 27-03-2009 09:36 » 

zubr, Мне нравится первый вариант.
Но у меня не получается использовать setupapi.h
При создании консольного проекта
Код:
#include <setupapi.h>
#include <stdio.h>

void main(){
printf("Hello world\n");
}

компилятор выдает ошибку:

Error   1   error C2143: syntax error : missing ';' before '*'   c:\program files\microsoft visual studio 8\vc\platformsdk\include\setupapi.h   56   
Error   2   error C4430: missing type specifier - int assumed. Note: C++ does not support default-int   c:\program files\microsoft visual studio 8\vc\platformsdk\include\setupapi.h   56   
Error   3   error C4430: missing type specifier - int assumed. Note: C++ does not support default-int   c:\program files\microsoft visual studio 8\vc\platformsdk\include\setupapi.h   56   


переходим на строку 56 в setupapi.h :
Код:
54:#ifndef __LPGUID_DEFINED__
55:#define __LPGUID_DEFINED__
56:typedef GUID *LPGUID;
57:#endif

сама setupapi.dll на компе есть.
Может нужно что то (доо/перо)пределить ?

Если имеете примерчик, бросьте пожалуйста !
Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #44 : 30-03-2009 12:49 » 

Попробуй самой верхней подключить windows.h.
Записан
zubr
Гость
« Ответ #45 : 30-03-2009 15:13 » 

Scorpion, пример могу дать, но только на Delphi.
Записан
Страниц: 1 [2]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines