- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
_Return_type_success_(return != false) bool CEnumerateSerial::UsingCreateFile(_Inout_ CPortsArray& ports)
{
//Reset the output parameter
ports.clear();
//Up to 255 COM ports are supported so we iterate through all of them seeing
//if we can open them or if we fail to open them, get an access denied or general error error.
//Both of these cases indicate that there is a COM port at that number.
for (UINT i=1; i<256; i++)
{
//Form the Raw device name
ATL::CAtlString sPort;
sPort.Format(_T("\\\\.\\COM%u"), i);
//Try to open the port
bool bSuccess = false;
ATL::CHandle port(CreateFile(sPort, GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, 0, nullptr));
if (port == INVALID_HANDLE_VALUE)
{
const DWORD dwError = GetLastError();
//Check to see if the error was because some other app had the port open or a general failure
if ((dwError == ERROR_ACCESS_DENIED) || (dwError == ERROR_GEN_FAILURE) || (dwError == ERROR_SHARING_VIOLATION) || (dwError == ERROR_SEM_TIMEOUT))
bSuccess = true;
}
else
{
//The port was opened successfully
bSuccess = true;
}
//Add the port number to the array which will be returned
if (bSuccess)
#pragma warning(suppress: 26489)
ports.push_back(i);
}
//Return the success indicator
return true;
}
gologub 23.05.2021 01:17 # 0
bormand 23.05.2021 01:21 # 0
gologub 23.05.2021 01:34 # 0
MAKAKA 23.05.2021 01:44 # 0
выглядит как говно
bormand 23.05.2021 01:45 # 0
MAKAKA 23.05.2021 01:48 # +1
Извините
Steve_Brown 24.05.2021 12:17 # +2
PolinaAksenova 23.05.2021 01:38 # 0
Вообще-то up to 256.
gologub 23.05.2021 01:47 # +3
но... если копнуть глубже окажется, что искаропки поддерживается up to 1024 и расширяемо до 4096, а если забить на "com name arbiter" то ∞
а несчастный примат этот код 23 года вылизывал, а он оказался полной хуйней
MAKAKA 23.05.2021 01:48 # 0
Это какая-то станция для дайлап пула в крупном провайдере из 1999-го года?
gologub 23.05.2021 02:16 # +1
bormand 23.05.2021 02:19 # 0
guest6 23.05.2021 03:10 # +1
Старый можно удалить, если сказать show hidden devices
Кто настолько старый, что помнит переменную
bormand 23.05.2021 01:49 # 0
Ну там через какое-нибудь setupapi запросить по классу "последовательный порт" или что-то подобное...
PolinaAksenova 23.05.2021 01:51 # +2
Или "change port /QUERY" распарсить, там хотя бы кириллических букв нят.
MAKAKA 23.05.2021 01:57 # 0
ебать откуда ты это знаеш
guest6 23.05.2021 02:02 # +1
c:\> change logon /disable
на знакомом сервере
gologub 23.05.2021 01:57 # +1
gologub 23.05.2021 01:53 # +2
https://docs.microsoft.com/en-us/windows-hardware/drivers/serports/external-naming-of-com-ports
MAKAKA 23.05.2021 01:55 # +1
MAKAKA 23.05.2021 03:02 # 0
bormand 23.05.2021 03:27 # +1
MAKAKA 23.05.2021 05:03 # +3
собирать под 14-й vc. Под 17-й нужно явно отключать strictString (с ним wbem не собирается, ссаный BSTR виноват) и с unicode строками
Нужно сделать обработку ошибок, и завернуть наверное комы в ATL, но я пьяный
bormand 24.05.2021 13:02 # +3
Оно и видно... кто по трезвости полезет ворошить WMI голыми руками...
MAKAKA 23.05.2021 03:41 # 0
bormand 23.05.2021 03:48 # 0
Заебись, с USB COM девайсами это в принципе не работает, я думаю? У них не меньше 5 и дырки в нумерации, емнип.
guest6 23.05.2021 05:05 # 0
MAKAKA 23.05.2021 03:49 # 0
PolinaAksenova 23.05.2021 03:56 # 0
guest6 23.05.2021 05:06 # 0
gologub 24.05.2021 00:32 # 0
сервис может быть отключен
или хуже, настроен неторопливо стартовать, когда ты туда полезешь
или даже еще хуже, не успеть обновить список чтобы туда включить девайс, который ты только что воткнул
avamana 04.10.2021 21:05 # 0