Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
_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;
}
некоторые джавамэны вот таким гордятся
> Internally the code provides 10 different ways (yes you read that right: Ten)
еще и выложено под ни с чем не совместимой лицензией
Ну, может, жизнь такая. Мало ли почему не открылся, но порт есть, пользователю надо показать - пусть сам решает. Может, у кого-то именно это значение вернуло.
Распарсить вывод mode.com. Ня забудь про кодировку кодовую страницу! ☆*:.。.o(≧▽≦)o.。.:*☆
Или "change port /QUERY" распарсить, там хотя бы кириллических букв нят.
WMI это же говно со скриптосахаром
сервис может быть отключен
или хуже, настроен неторопливо стартовать, когда ты туда полезешь
или даже еще хуже, не успеть обновить список чтобы туда включить девайс, который ты только что воткнул
gologub # 0
bormand # 0 ⇈
gologub # 0 ⇈
MAKAKA # 0 ⇈
выглядит как говно
bormand # 0 ⇈
MAKAKA # 0 ⇈
Извините
Steve_Brown # 0 ⇈
PolinaAksenova # 0
Вообще-то up to 256.
gologub # 0 ⇈
но... если копнуть глубже окажется, что искаропки поддерживается up to 1024 и расширяемо до 4096, а если забить на "com name arbiter" то ∞
а несчастный примат этот код 23 года вылизывал, а он оказался полной хуйней
MAKAKA # 0 ⇈
Это какая-то станция для дайлап пула в крупном провайдере из 1999-го года?
gologub # 0 ⇈
bormand # 0 ⇈
guest # 0 ⇈
Старый можно удалить, если сказать show hidden devices
Кто настолько старый, что помнит переменную
bormand # 0 ⇈
Ну там через какое-нибудь setupapi запросить по классу "последовательный порт" или что-то подобное...
PolinaAksenova # 0 ⇈
Или "change port /QUERY" распарсить, там хотя бы кириллических букв нят.
MAKAKA # 0 ⇈
ебать откуда ты это знаеш
guest # 0 ⇈
c:\> change logon /disable
на знакомом сервере
gologub # 0 ⇈
gologub # 0 ⇈
https://docs.microsoft.com/en-us/windows-hardware/drivers/serports/external-naming-of-com-ports
MAKAKA # 0 ⇈
MAKAKA # 0
bormand # 0 ⇈
MAKAKA # 0 ⇈
собирать под 14-й vc. Под 17-й нужно явно отключать strictString (с ним wbem не собирается, ссаный BSTR виноват) и с unicode строками
Нужно сделать обработку ошибок, и завернуть наверное комы в ATL, но я пьяный
bormand # 0 ⇈
Оно и видно... кто по трезвости полезет ворошить WMI голыми руками...
MAKAKA # 0
bormand # 0 ⇈
Заебись, с USB COM девайсами это в принципе не работает, я думаю? У них не меньше 5 и дырки в нумерации, емнип.
guest # 0 ⇈
MAKAKA # 0
PolinaAksenova # 0 ⇈
guest # 0 ⇈
gologub # 0 ⇈
сервис может быть отключен
или хуже, настроен неторопливо стартовать, когда ты туда полезешь
или даже еще хуже, не успеть обновить список чтобы туда включить девайс, который ты только что воткнул
avamana # 0