Правильное получение списка COM-портов в Delphi

    Правильное получение списка COM-портов в Delphi

    Задачи работы с железом – частая штука для Delphi разработчиков. Но если почти все знают, как работать с COM-портом – открывать его, отправлять и принимать данные, то практически нигде не описан наиболее корректный вариант получения списка портов. Давайте, для начала рассмотрим несколько наиболее часто встречаемые в интернете варианты и попробуем разобраться в них.

    Прежде всего определимся, что среди COM-портов в Windows есть 2 типа устройств – непосредственно COM-порты и модемы:

    Их следует разделять, например, когда надо автоматически подключится к какому-то определённому устройству или не выводить модемы. Поэтому было бы неплохо получить не просто список, но и типы устройств и их имена.

    Вариант 1. Опрос всех портов по очереди

    Решение «в лоб», что называется. Давайте будем открывать по очереди список COM-порты, а какие откроются – выведем в списке. Выглядит как-то так:

    1. procedure TForm1.EnumPorts1();
    2. var i: integer;
    3.     h: THandle;
    4. begin
    5.   for i:=1 to 32 do
    6.     begin
    7.     h:=CreateFile(PChar('COM'+IntToStr(i)),
    8.       GENERIC_READ or GENERIC_WRITE,
    9.       0,
    10.       nil,
    11.       OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
    12.     If(h<>INVALID_HANDLE_VALUE)then
    13.       ComPort.Items.Add('COM'+IntToStr(i));
    14.     CloseHandle(h);
    15.     end;
    16. end;

    Честно говоря, вариант хреноватенький. Из плюсов – разве что очевидная реализация и возможность получить список COM-портов без прав администратора. Минусов тут огромнейшее множество:

    • У пользователя может быть, к примеру, виртуальный порт COM158, следовательно циклом в 32 порта не ограничишься, а опрос большого количества портов занимает немало времени.
    • Всякие «левые» устройства – виртуальные Bluetooth порты (которые встречаются в каждом втором ноутбуке) и прочее железо может неадекватно реагировать на открытие порта – вплоть до зависания системы.
    • Нельзя определить имя устройства в системе и тип устройства (порт или модем)

    Как показывает практика (да и здравый смысл тоже), процент зависаний и отказов для такого варианта довольно велик. Так что для коммерческой программы такой вариант вовсе не подойдёт, хотя процент коммерческих программ, опрашивающих таким способом железо, довольно велико.

    Вариант 2. Чтение списка из реестра

    Оказывается, в ветке HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM хранится список активных портов системы. Можно их просто прочитать и всё будет ок.

    1. procedure TForm1.EnumPorts2();
    2. var reg  : TRegistry;
    3.     l    : TStringList;
    4.     i    : integer;
    5. begin
    6.   l := TStringList.Create;
    7.   reg:=TRegistry.Create;
    8.   try
    9.     reg.RootKey := HKEY_LOCAL_MACHINE;
    10.     reg.OpenKey('HARDWARE\DEVICEMAP\SERIALCOMM', false);
    11.     reg.GetValueNames(l);
    12.     for i:=0 to l.Count-1 do
    13.       ComPort.Items.Add(reg.ReadString(l[i]));
    14.   finally
    15.     reg.Free;
    16.     l.Free;
    17.   end;
    18. end;

    Кстати, данный вариант пользуется большой популярностью. Причина тому одна – он быстрый и работал (во времена Windows XP) практически безотказно. Однако и у него есть минусы:

    • Во времена Windows XP всё работало безотказно, но поскольку ветка HKEY_LOCAL_MACHINE в Windows Vista, Windows 7 и Windows 8 закрыта для не-админа (не для пользователей группы «Администраторы», а для пользователя аналога root в Linux), то программу приходится запускать от имени администратора. Можно, конечно, добавить manifest, что решит 99% проблем, но останется тот 1% (например, home-версия Windows) и неприятный осадок.
    • Нельзя определить имя устройства в системе и тип устройства (порт или модем)

    Данный вариант вполне приемлемый для коммерческого решения, однако есть приёмчики получше.

    Вариант 3. Правильный. Используем Windows Driver Kit

    Наиболее сложный, но и наиболее правильный вариант.

    1. const
    2.   GUID_DEVICEINTERFACE_COMPORT:TGUID=(
    3.     D1 : $86E0D1E0;
    4.     D2 : $8089;
    5.     D3 : $11D0;
    6.     D4 : ($9C,$E4,$08,$00,$3E,$30,$1F,$73);
    7.    );
    8.   GUID_DEVICEINTERFACE_MODEM:TGUID=(
    9.     D1 : $2C7089AA;
    10.     D2 : $2E0E;
    11.     D3 : $11D1;
    12.     D4 : ($B1,$14,$00,$C0,$4F,$C2,$AA,$E4);
    13.    );
    14. function TForm1.EnumPorts3(
    15.    const guid:TGUID;
    16.    PortClass :TPortClass):boolean;
    17. var h             : THandle;
    18.     devinfo       : SP_DEVICE_INTERFACE_DATA;
    19.     bMoreItems    : boolean;
    20.     nIndex        : longint;
    21.     hDeviceKey    : HKEY;
    22.     szData        : array[0..255]of Char;
    23.     dwType,dwSize : DWORD;
    24.     item          : TComPortInfo;
    25. begin
    26.   h:=SetupDiGetClassDevs(
    27.       @guid,
    28.       nil,
    29.       0,
    30.       DIGCF_PRESENT or DIGCF_INTERFACEDEVICE
    31.       );
    32.   if(h=INVALID_HANDLE_VALUE)then
    33.       begin
    34.       exit(false);
    35.       end;
    36.   try
    37.     nIndex:=0;
    38.     bMoreItems:=true;
    39.     while(bMoreItems)do
    40.       begin
    41.       devinfo.cbSize:=sizeof(SP_DEVICE_INTERFACE_DATA);
    42.       bMoreItems:=SetupDiEnumDeviceInfo(
    43.         h,
    44.         nIndex,
    45.         @devinfo
    46.         );
    47.       if(bMoreItems)then
    48.         begin
    49.         hDeviceKey:=SetupDiOpenDevRegKey(
    50.            h,
    51.            @devinfo,
    52.            DICS_FLAG_GLOBAL,
    53.            0,
    54.            DIREG_DEV,KEY_QUERY_VALUE);
    55.         item.name:='';
    56.         item.DevDesc:='';
    57.         item.PortClass:=PortClass;
    58.         if(hDeviceKey>0)then
    59.           begin
    60.           szData[0]:=#0;
    61.           dwSize:=sizeof(szData);
    62.           dwType:=0;
    63.           if(RegQueryValueEx(
    64.               hDeviceKey,
    65.               'PortName',
    66.               nil,
    67.               @dwType,
    68.               @szData,
    69.               @dwSize)=0)and(dwSize>=2)then
    70.                  item.name:=szData;
    71.           RegCloseKey(hDeviceKey);
    72.           end;
    73.         if(item.name<>'')then
    74.           begin
    75.           szData[0]:=#0;
    76.           dwSize:=sizeof(szData);
    77.           dwType:=0;
    78.           if(SetupDiGetDeviceRegistryPropertyW(
    79.               h,
    80.               @devinfo,
    81.               SPDRP_DEVICEDESC,
    82.               dwType,
    83.               szData,
    84.               dwSize,
    85.               dwSize))and(dwType = REG_SZ)then
    86.                 item.DevDesc:=szData;
    87.           FItems.Add(item);
    88.           end;
    89.         end;
    90.       inc(nIndex);
    91.       end;
    92.     result:=true;
    93.   finally
    94.     SetupDiDestroyDeviceInfoList(h);
    95.   end;
    96. end;

    Вызываем следующим образом:

    1. FItems.Clear;
    2. EnumPortsSetupAPI(GUID_DEVICEINTERFACE_COMPORT,pcComPort);
    3. EnumPortsSetupAPI(GUID_DEVICEINTERFACE_MODEM,pcModem);

    Плюс ко всему, необходим pas-файл для библиотеки SETUPAPI.dll

    Плюсы очевидны – работает быстро, стабильно, мы получаем всю необходимую информацию об устройстве, не требует прав администратора.

    Минус единственный – для новичка непонятен код.

    Выводы

    Лично я рекомендую последний метод как единственный правильный, однако у вас может быть своё мнение – высказывайте его в комментариях.

    Комментарии

    02.07.2014 12:42:24
    Avatar of Юрий ГалинЮрий Галин
    Не буду повторно писать свой комментарий, злая капча.
    02.07.2014 09:52:05
    Avatar of КонсервКонсерв
    @Юрий Галин
    У тебя же есть аккаунт. Залогинься и забудь о капче.
    16.08.2014 10:09:05
    Avatar of 202202
    Спасибо за статью
    17.08.2014 02:26:33
    Avatar of КонсервКонсерв
    @202 Пожалуйста! :-)
    05.10.2014 08:05:25
    Avatar of OlegOleg
    А где взять Windows Driver Kit?
    В каком USES ?
    06.10.2014 03:05:56
    Avatar of КонсервКонсерв
    @Oleg
    Заголовочную библиотеку можно загуглить по названию любой функции.

    На днях скину рабочий пример.
    07.10.2014 12:31:33
    Avatar of АндрейАндрей
    Метод 1, однозначно, неприемлем.

    Успешно пользуюсь методом 2 под Vista+ x64 без прав администратора. Просто ключ нужно открывать только на чтение (reg.OpenKeyReadOnly)

    Метод 3, насколько я понимаю, чуть более продвинут, чем метод 2, т.к. тоже получает данные из реестра, только из других ключей.

    Было бы интересно почитать как определить свободен ли COM-порт (с этим вроде как понятно) и, если занят, то каким приложением (это уже интересно).
    08.10.2014 10:08:32
    Avatar of КонсервКонсерв
    @Андрей
    Я долгое время пользовался методов 2, пока не встретился с нюансами во всяких Home версиях. Главные плюсы метода 3 - он работает безукоризненно и даёт более информативную картину.

    Process Explorer показывает открытые файлы (а значит и COM-порты) и их хендлы. Можно покопать в его сторону или поискать решение на MSDN.
    27.10.2014 08:34:07
    Avatar of СтаниславСтанислав
    А что такое TPortClass и TComPortInfo? Самописные какие-то классы? В сети нет упоминания о таких...
    27.10.2014 09:12:03
    Avatar of СтаниславСтанислав
    И, кстати, под XE5 не компилируется, ругается на несовпадение типов h и значения ф-ции SetupDiGetClassDevs, а также на неверный тип devinfo : SP_DEVICE_INTERFACE_DATA; который он хочет как SP_DEVINFO_DATA... Может, нужен какой-то особенный SetupApi.pas?
    27.10.2014 09:33:14
    Avatar of СтаниславСтанислав
    При попытке компиляции из D2007 получил следующие ошибки:
    E2010 Incompatible types: 'Cardinal' and 'Pointer' - строка 26
    E2010 Incompatible types: 'Pointer' and 'Cardinal' - строка 42
    E2033 Types of actual and formal var parameters must be identical - строка 42
    E2010 Incompatible types: 'Pointer' and 'Cardinal' - строка 49
    E2010 Incompatible types: 'Pointer' and 'Cardinal' - строка 78
    E2010 Incompatible types: 'PByte' and 'Array' - строка 78
    E2010 Incompatible types: 'Pointer' and 'Cardinal' - строка 94
    05.11.2014 02:56:09
    Avatar of КонсервКонсерв
    @Станислав
    Да, класы самописные. На днях вырежу из готового проекта небольшой пример и закину исходник.

    SetupApi тоже закину.
    17.12.2014 08:04:54
    Avatar of АлександрАлександр
    Извините, а можно рабочий пример?
    вроде как уже месяц прошел )
    01.04.2015 06:15:04
    Avatar of СергейСергей
    Добрый день!
    Выложите пример реализации вашего функционала! Есть задача, а ваш пример её решает как нельзя лучше !
    Заранее благодарен !
    02.04.2015 05:21:24
    Avatar of СергейСергей
    Пришлось писать самому (не без помощи данность статьи,конечно)

    Выложу, может кому еще надо:
    Получилось примерно так:

    // Юнит с нашими функциями
    unit detectmodems;

    interface

    uses
    Windows, SysUtils, Forms, SETUPAPI;

    type
    TGUIDDeviceInfo = record
    name: string;
    portname: string;
    portnumber: integer;
    end;

    TDevices = array of TGUIDDeviceInfo;

    function GetGUIDdevice ():TDevices;

    implementation

    function GetGUIDdevice ():TDevices;
    var
    Guid : TGUID;
    PnPHandle: HDevInfo;
    DeviceInfoData : SP_DEVINFO_DATA;
    DeviceInterfaceData: SP_DEVICE_INTERFACE_DATA;
    i : Cardinal;
    Success: LongBool;
    DataT, buffersize: Cardinal;
    buffer : PByte;
    //
    hDeviceKey : HKEY;

    szData : array[0..255]of Char;
    dwType,dwSize : DWORD;
    //

    Const
    Modems : TGUID = '{4d36e96d-e325-11ce-bfc1-08002be10318}';
    ComLpt : TGUID = '{4d36e978-e325-11ce-bfc1-08002be10318}';
    begin

    Guid:=Modems;


    PnPHandle:= SetupDiGetClassDevs(@Guid, nil, 0, DIGCF_PRESENT);


    Try
    i:= 0;
    DeviceInfoData.cbSize:= SizeOf(SP_DEVINFO_DATA);
    DeviceInterfaceData.cbSize := SizeOf(SP_DEVICE_INTERFACE_DATA);
    Repeat
    Success:= SetupDiEnumDeviceInfo(PnPHandle, i, DeviceInfoData);

    If Success then
    begin
    buffer:= nil;
    buffersize:= 0;

    while not SetupDiGetDeviceRegistryProperty(PnPHandle,DeviceInfoData,SPDRP_DEVICEDESC,@DataT,buffer,buffersize,@buffersize)
    do begin
    if (GetLastError() = ERROR_INSUFFICIENT_BUFFER) then
    begin
    if (buffer <> nil) then FreeMem(buffer);
    buffer:= AllocMem(buffersize);
    end
    else
    begin
    break;
    end;
    end;

    //ListBox1.Items.Add(Format('%d: %s',[i, StrPas(PChar(buffer))]));
    SetLength(Result,i+1);
    Result[i].name:=StrPas(PChar(buffer));
    if (buffer <> nil) then FreeMem(buffer);
    // Ïûòàåìñÿ íîìåð ïîðòà îïðåäåëèòü

    hDeviceKey:=SetupDiOpenDevRegKey(PnPHandle,DeviceInfoData, DICS_FLAG_GLOBAL,0,DIREG_DEV,KEY_QUERY_VALUE);
    if(hDeviceKey>0)then
    begin

    szData[0]:=#0;
    dwSize:=sizeof(szData);
    dwType:=0;
    if(RegQueryValueEx(hDeviceKey,'PortName',nil,@dwType,@szData,@dwSize)=0)and(dwSize>=2)then
    Result[i].portname:=szData;
    Result[i].portnumber:=StrToInt(StringReplace(szData, 'COM', '',[rfReplaceAll, rfIgnoreCase]));
    RegCloseKey(hDeviceKey);
    end;

    // Ïûòàåìñÿ íîìåð ïîðòà îïðåäåëèòü


    End;
    Inc(i);
    Application.ProcessMessages;
    until not Success;


    Finally
    SetupDiDestroyDeviceInfoList(PnPHandle);
    End;
    end;

    end.


    --------------------

    Вызов примерно так:

    procedure TMain.sBitBtn2Click(Sender: TObject);
    var
    mas:TDevices;
    i:integer;
    begin
    mas:=GetGUIDdevice();

    for i:=0 to Length(mas)-1 do
    begin
    sListBox1.Items.Add(intToStr(i+1)+' '+mas[i].name+' '+mas[i].portname+' '+IntToStr(mas[i].portnumber));
    end;

    end;
    01.07.2015 10:47:45
    Avatar of КонсервКонсерв
    @Сергей
    Спасибо за поддержку :-).
    Я так заработался, что совсем блог забросил.
    03.10.2015 04:29:39
    Avatar of ГригорийГригорий
    Хотелось бы увидеть TPortClass и TComPortInfo, для полноты картины!
    08.10.2015 07:43:40
    Avatar of maxmax
    с нетерпением ждем TPortClass и TComPortInfo, а также SetupApi!
    31.01.2016 03:57:03
    Avatar of МракМрак
    Модуль то найти можно для setupapi.dll, но они все имеют разные названия переменных и не все функции.
    01.03.2016 12:16:34
    Avatar of КонстантинКонстантин
    Метод оказался неработоспособным в случаях, когда виртуальные COM-порты не отображаются в диспетчере задач.
    01.03.2016 12:49:24
    Avatar of КонсервКонсерв
    @Константин
    Вы, наверное, имели в виду диспетчер устройств?

    Ни разу не видел, чтобы были COM-порты, которых нет в диспетчере устройств...
    02.03.2016 07:39:15
    Avatar of КонстатнтинКонстатнтин
    Да, диспетчер устройств, извиняюсь. А такое бывает. Впервые я столкнулся с таким при использовании преобразователя Ethernet - RS-485. Там ставится утилита, которая создает виртуальные COM-порты, но их не видно в диспетчере задач. Однако они есть и программное обеспечение с ними абсолютно нормально работает. Другой пример - программа Virtual Serial Port Emulator. Я её использую, как эмулятор нуль-модема. Она создает два виртуальных com-порта, и связывает их меж собой. Таким образом между собой общаются два приложения. Так вот, эти порты тоже не видны в диспетчере устройств. Кстати, первые два способа, озвученные Вами, эти порты определяют нормально.
    02.03.2016 03:19:36
    Avatar of КонсервКонсерв
    @Констатнтин
    Интересно, буду в курсе.

    Третий способ - это и есть, по сути, то, что использует диспетчер устройств.

    Весьма странно, что есть устройство, но его нет в диспетчере устройств...
    23.03.2016 03:20:12
    Avatar of ЕвгенийЕвгений
    Короче полезность материала без SetupApi.pas который использовал автор вызывает очень большие сомнения, по крайней мере у меня не заработало как бы я ни старался. По поводу кода, который опубликовал Сергей та же ситуация. Прошло столько времени с момента создания топика, а обещания выложить рабочий пример так и остались обещаниями...
    26.04.2016 02:53:40
    Avatar of ГригорийГригорий
    Да , виртуальные COM порты не видит
    28.05.2016 05:21:14
    Avatar of AndrewTishkinAndrewTishkin
    Так и не понял, почему в статье используется GUID_DEVICEINTERFACE_COMPORT, но при этом на скриншоте обведены устройства из класса ports, имеющего совсем другой GUID = {4D36E967-E325-11CE-BFC1-08002BE10318}

    А если гаджет попал в другую категорию - смотрите GUID класса в диспетчере устройств на вкладке "Сведения".

    Ну и касаясь темы статьи - не поминается ещё один способ, минус которого только в отсутствии названий найденных портов. Имеется в виду получение полного списка девайсов через QueryDosDevice и далее вычленение из него строк, начинающихся с COM.

    Справедливости ради, есть и ещё способы
    http://stackoverflow.com/questions/1388871/how-do-i-get-a-list-of-available-serial-ports-in-win32/1394301#1394301

    http://naughter.com/enumser.html
    Internally the CEnumerateSerial provides 9 different ways (yes you read that right: Nine) of enumerating serial ports: Using CreateFile, QueryDosDevice, GetDefaultCommConfig, two ways using the Setup API, EnumPorts, WMI, Com Database & enumerating the values under the registry key HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM.
    04.07.2020 07:57:42
    Avatar of allnickallnick
    Очень давно с дельфями не работал.
    Поэтому приведу маленький пример на билдере, а там и переделать недолго.
    Компилируется как в 32, так и в 64 бита.
    Единственно что виндовс нужен версии от XP.
    Примечателен тем, что крайне прост и находит абсолютно все порты, включая виртуальные не открывая их.

    int coms[256]; // Список портов
    int comcnt = 0; // Количество портов
    int i=0;
    int pos;
    TCHAR devs[65535];

    DWORD dwChars = QueryDosDevice(NULL, devs, 65535);
    if(dwChars){
    while(devs[i]){
    UnicodeString str = &devs[i];
    if((pos = str.Pos("COM"))){
    str.Delete(1, pos+2);
    try{
    coms[comcnt++] = StrToInt(str);
    }catch(...){}
    }
    while(devs[i++] != _T('\0'));
    }
    }

    А вот пример основанный в том числе и на инфе отсюда, только тоже находит все порты включая виртуальные, для наглядности дополнительная инфа о порте сбрасывается в TMemo *m1;
    m1 нужно добавить на форму, если хотите посмотреть что находит пример.
    Это разумеется необязательно, и порты ищутся только те, что удовлетворяют неким дополнительным условиям, что тоже можно выключить, как и считывание лишних параметров.

    #include <setupapi.h>

    static const UnicodeString DESC = L"Arduino Uno";
    static const UnicodeString CLASS = L"Ports";
    static const UnicodeString SERV = L"usbser";
    static const UnicodeString ID = L"USB\\VID_2341&PID_0043&REV_0001";

    UnicodeString strPort;
    UnicodeString strDesc;
    UnicodeString strClass;
    UnicodeString strServ;
    UnicodeString strId;
    UnicodeString strName;

    int coms[256]; // Список портов
    int comcnt = 0; // Количество портов
    int pos;
    bool succ;
    HDEVINFO hDevInfo;
    SP_DEVINFO_DATA devinfo;
    HKEY hKey;
    Char bBuf[256];
    DWORD dwSize;

    if((hDevInfo = SetupDiGetClassDevs(NULL, NULL, 0, DIGCF_PRESENT | DIGCF_ALLCLASSES)) != INVALID_HANDLE_VALUE){
    devinfo.cbSize = sizeof(devinfo);
    try{
    for(DWORD nDev = 0; SetupDiEnumDeviceInfo(hDevInfo, nDev, &devinfo); nDev++){
    if((hKey = SetupDiOpenDevRegKey(hDevInfo, &devinfo, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_QUERY_VALUE)) != INVALID_HANDLE_VALUE){
    bBuf[0] = L'\0';
    dwSize = sizeof(bBuf);
    if(!RegQueryValueEx(hKey, L"PortName", NULL, NULL, (LPBYTE)bBuf, &dwSize)){
    strPort = bBuf;
    if((pos = strPort.Pos(L"COM"))){
    m1->Lines->Add(strPort);
    strPort.Delete(1, pos+2);
    bool ok = true;
    if((succ = SetupDiGetDeviceRegistryProperty(hDevInfo, &devinfo, SPDRP_DEVICEDESC, NULL, (LPBYTE)bBuf, sizeof(bBuf), NULL))){
    strDesc = bBuf;
    m1->Lines->Add(bBuf);
    }
    ok &= succ;
    if((succ = SetupDiGetDeviceRegistryProperty(hDevInfo, &devinfo, SPDRP_FRIENDLYNAME, NULL, (LPBYTE)bBuf, sizeof(bBuf), NULL))){
    strName = bBuf;
    m1->Lines->Add(bBuf);
    }
    if((succ = SetupDiGetDeviceRegistryProperty(hDevInfo, &devinfo, SPDRP_CLASS, NULL, (LPBYTE)bBuf, sizeof(bBuf), NULL))){
    strClass = bBuf;
    m1->Lines->Add(bBuf);
    }
    ok &= succ;
    if((succ = SetupDiGetDeviceRegistryProperty(hDevInfo, &devinfo, SPDRP_SERVICE, NULL, (LPBYTE)bBuf, sizeof(bBuf), NULL))){
    strServ = bBuf;
    m1->Lines->Add(bBuf);
    }
    ok &= succ;
    if((succ = SetupDiGetDeviceRegistryProperty(hDevInfo, &devinfo, SPDRP_HARDWAREID, NULL, (LPBYTE)bBuf, sizeof(bBuf), NULL))){
    strId = bBuf;
    m1->Lines->Add(bBuf);
    }
    ok &= succ;
    if(ok && strDesc == DESC && strClass == CLASS && strServ == SERV && strId == ID)
    try{
    coms[comcnt++] = StrToInt(strPort);
    m1->Lines->Add(UnicodeString(L"Это наш порт № ") + coms[comcnt-1]);
    }catch(...){}
    else
    m1->Lines->Add(L"Это не наш порт");
    m1->Lines->Add(L"");
    }
    RegCloseKey(hKey);
    }
    }
    }
    }__finally{
    SetupDiDestroyDeviceInfoList(hDevInfo);
    }
    }

    m1->Lines->Add(UnicodeString(L"Всего найдено наших портов: ") + comcnt);

    Лень было оформлять в виде функций, так, что всё свалено в кучу, и глобальные с локальными переменными и собственно код.
    Но там раскидать что куда недолго, зато ничего самописного и не приведённого в примере нет, есть всё необходимое для запуска, даже заголовочный файл.
    04.07.2020 08:38:45
    Avatar of allnickallnick
    Чё-то я зарапортовался, оставил кое-что лишнее в первом примере, так что он на самом деле ещё проще:

    int coms[256]; // Список портов
    int comcnt = 0; // Количество портов
    int i=0;
    TCHAR devs[65535];

    DWORD dwChars = QueryDosDevice(NULL, devs, 65535);
    if(dwChars){
    while(devs[i]){
    UnicodeString str = &devs[i];
    if(str.Pos("COM") == 1){
    str.Delete(1, 3);
    try{
    coms[comcnt++] = StrToInt(str);
    }catch(...){}
    }
    while(devs[i++] != _T('\0'));
    }
    }
    10.12.2021 11:25:26
    Avatar of RbaMWRbaMW
    https://recipesalllife.ru/
    13.12.2021 06:19:16
    Avatar of RuiZORuiZO
    <a href="https://instrument-elbor.ru/">buy trazodone without a prescription</a>
    16.12.2021 05:04:42
    Avatar of LsdXWLsdXW
    <a href="https://pepcid4all.top/generic-pepcid-overview/">generic pepcid</a>
    20.12.2021 08:38:55
    Avatar of al-61al-61
    Я использую Lazarus версия 2.0.12.
    Попробовал "вариант 2. Чтение списка из реестра". Прекрасно работает в Windows 10 и 8 не требуется прав админа. Надо только изменить немного 7 строку.

    uses Registry,
    В место :
    7. reg:=TRegistry.Create;
    у меря
    reg:=TRegistry.Create(KEY_READ);

    21.12.2021 10:04:53
    Avatar of SfmONSfmON
    ivermectin rabbit <a href="https://stromectollife.com/">stromectollife.com</a> ivermectin active ingredient
    21.12.2021 11:14:18
    Avatar of EduRIEduRI
    cialis dosage 40 mg <a href="https://topiccialis.net/">cialis</a> cialis effects
    22.12.2021 04:28:04
    Avatar of XqfNRXqfNR
    <a href="https://cephalexin4all.top">buy cephalexin online</a>
    22.12.2021 05:16:56
    Avatar of VbmRLVbmRL
    <a href="https://claritin4all.top">can i buy claritin</a>
    22.12.2021 07:40:41
    Avatar of GttALGttAL
    <a href="https://doxycyclineph.top/">doxycycline</a>
    05.01.2022 11:21:51
    Avatar of XgjBBXgjBB
    pfizer viagra <a href="https://topsildenafilcustomer.net/">viagra boys</a> generic sildenafil
    05.01.2022 01:13:34
    Avatar of RisONRisON
    viagra in india <a href="http://viagrawallet.org/">generic viagra cost</a> generic for viagra
    05.01.2022 03:09:30
    Avatar of SosLWSosLW
    generic viagra usa <a href="https://sildenafilbag.com/">buy real viagra</a> viagra fuck
    05.01.2022 05:07:05
    Avatar of WtlKTWtlKT
    cialis price <a href="https://cialistadalafilcustomer.org/">cialis information</a> cialis strength
    08.01.2022 09:11:59
    Avatar of BvpOEBvpOE
    is there a generic for cialis <a href="https://cialistadalafilcustomer.org/">cialis canadian pharmacy ezzz</a> coupon for cialis
    viagra from canada <a href="https://sildenafilbag.com/">sildenafil over the counter</a> sildenafil davis pdf
    viagra memes <a href="http://viagrawallet.org/">women taking viagra</a> sildenafil citrate 100mg
    viagra pill <a href="https://topsildenafilcustomer.net/">viagra cialis levitra</a> sildenafil citrate tablets 100mg
    10.01.2022 01:18:50
    Avatar of WvlNVWvlNV
    cheap generic cialis <a href="https://cialistobag.com/">cialis from canada</a> when will cialis become generic
    10.01.2022 02:30:04
    Avatar of UpiHYUpiHY
    brand cialis <a href="https://cialiswallet.com/">when does cialis patent expire</a> what is cialis for
    10.01.2022 05:44:43
    Avatar of BwuGZBwuGZ
    buy generic 100mg viagra online <a href="https://menviagrashopping.com/">menviagrashopping.com</a> sildenafil 20 mg
    10.01.2022 06:31:08
    Avatar of LcqUALcqUA
    cheap viagra <a href="https://topviagracash.com/">generic viagra</a> itsoktocry viagra
    12.01.2022 07:32:13
    Avatar of CfiKZCfiKZ
    viagra pill <a href="https://postviagratops.net/">sildenafil 20 mg</a> generic viagra online
    12.01.2022 09:03:56
    Avatar of HstMQHstMQ
    cialis vs levitra <a href="https://tadalafilworldlife.org/">tadalafil generic</a> cialis 5 mg
    14.01.2022 06:17:42
    Avatar of NwjHQNwjHQ
    <a href="https://san-epidem.ru/dezinsekciya/unichtozhenie-tarakanov/">службы по уничтожению тараканов обработка от тараканов в москве</a>
    17.01.2022 02:19:22
    Avatar of VnaDFVnaDF
    vardenafil dose recommendations <a href="https://mylevitrabag.net/">levitra women</a> vardenafil 20
    17.01.2022 03:07:38
    Avatar of ZotXWZotXW
    lowest price vardenafil <a href="https://stoplevitrashop.com/">vardenafil reviews</a> can norco block effects of vardenafil
    17.01.2022 03:55:29
    Avatar of XmvLIXmvLI
    where is vardenafil elder scrolls map <a href="https://levitravardenafilone.org/">levitra kopen</a> vardenafil oral jelly
    17.01.2022 03:56:31
    Avatar of ZvkXEZvkXE
    <a href="https://minsk-apart1.by/">снять квартиру на сутки минск</a>
    18.01.2022 09:25:50
    Avatar of PvtVBPvtVB
    <a href="http://rusluge.ru/dengi/kredity/chastnye-zaymy/srochnye/">Срочные частные займы в Москве</a>
    21.01.2022 01:23:06
    Avatar of GmwXIGmwXI
    Новое на holzen.ru <a href="https://holzen.ru/production/winter-gardens.html">престиж, дуб люкс 78х78, 2х- камерный степлопакет 2.0-40мм, уплотнительdeventer </a>
    21.01.2022 08:37:58
    Avatar of MjdMAMjdMA
    <a href="http://www.centrum-czyzyny.pl/">Kurwa mac</a>
    23.01.2022 05:37:28
    Avatar of JtwLKJtwLK
    low price viagra <a href="https://armaviagra.org/">price for viagra</a> sildenafil prescription online
    23.01.2022 06:59:48
    Avatar of ArrSPArrSP
    cialis buy <a href="https://tadalafilcustomer.net/">cialis buy online</a> cialis after prostate surgery
    24.01.2022 10:12:10
    Avatar of GfjWTGfjWT
    <a href="https://quartz-city.ru/kvartsevye-stoleshnitsy/">Купить столешницу из кварцевого алгомерата в Москве</a>
    25.01.2022 01:26:30
    Avatar of BiqXBBiqXB
    <a href="https://moiinterier.com/">пример</a>
    31.03.2022 06:56:32
    Avatar of TravisEndagTravisEndag
    what happens when a girl takes viagra <a href=" https://edviagralove.com/# ">long term side effects of viagra</a> is viagra covered by medicare
    03.04.2022 11:53:42
    Avatar of ArtrsholeArtrshole
    professional viagra cialis <a href=" https://cls20.com/# ">generic cialis from canada</a> what\'s works better viagra or cialis?
    06.04.2022 10:06:24
    Avatar of StrodutStrodut
    information on ivermectin <a href=" https://stromectolns.com/# ">stromectol uk buy</a> ivermectin usa price
    09.04.2022 04:25:47
    Avatar of EdwardOmincEdwardOminc
    buy generic cialis online overnight <a href=" http://cialiscnd.com/# ">generic cialis buy</a> generic cialis in canada
    10.04.2022 03:15:49
    Avatar of EdwardOmincEdwardOminc
    cialis reviews photos <a href=" http://cialiscnd.com/# ">cialis canada and paypal</a> where to get generic cialis without prescription
    12.04.2022 04:14:31
    Avatar of FrankScazyFrankScazy
    how to get doxycycline without prescription <a href=" http://doxycyclinefast.store/# ">doxycycline 120mg</a> doxycycline 20 mg capsules
    14.04.2022 04:53:36
    Avatar of FrankScazyFrankScazy
    clomid prescription discount <a href=" https://clomiden.fun/# ">buy clomid without script</a> how to get clomid online
    15.04.2022 01:53:13
    Avatar of FrankScazyFrankScazy
    chlomid <a href=" http://clomidfast.site/# ">clomid generic price</a> cheap clomid free shipping
    16.04.2022 11:54:29
    Avatar of FrankScazyFrankScazy
    clomid 25mg for sale <a href=" http://clomidfast.site/# ">where can i get clomid uk</a> clomid pharmacy online
    18.04.2022 06:34:02
    Avatar of FrankScazyFrankScazy
    doxycycline 50 mg <a href=" https://doxycyclinemst.com/# ">doxycycline for sale online</a> doxycycline tablets in india
    19.04.2022 01:01:00
    Avatar of FrankScazyFrankScazy
    amoxicillin over the counter in canada <a href=" https://amoxilmst.com/# ">generic amoxicillin 500mg</a> amoxicillin 500mg pill
    22.04.2022 07:29:21
    Avatar of HaroldkinueHaroldkinue
    best online pharmacy <a href=" http://drugsfast.store/# ">prescription without a doctor's prescription</a> ed drugs online
    23.04.2022 02:21:02
    Avatar of HaroldkinueHaroldkinue
    natural ed cures <a href=" https://drugsus.shop/# ">cheap drugs</a> best ed drug
    24.04.2022 08:18:45
    Avatar of HaroldkinueHaroldkinue
    ed drugs online <a href=" https://drugsus.shop/# ">comfortis for dogs without vet prescription</a> ed prescription drugs
    26.04.2022 02:16:25
    Avatar of HaroldkinueHaroldkinue
    sexual dysfunction in men <a href=" http://drugsen.site/# ">erectile dysfunction treatments</a> sildenafil without a doctor's prescription
    28.04.2022 06:36:44
    Avatar of StacyhalStacyhal
    how long does ivermectin take to work <a href=" https://stromectol.company/# ">ivermectin 0.5 lotion india</a> soolantra ivermectin cream
    29.04.2022 06:48:42
    Avatar of StacyhalStacyhal
    stromectol france <a href=" http://stromectol.icu/# ">ivermectin pancreatic cancer</a> ivermectin walmart
    01.05.2022 06:45:47
    Avatar of StacyhalStacyhal
    prednisone uk buy <a href=" https://deltasone.shop/# ">how to get prednisone without a prescription</a> prednisone in canada
    02.05.2022 12:33:12
    Avatar of StacyhalStacyhal
    impotence pills <a href=" http://cheapdrugs.icu/# ">how to get prescription drugs without doctor</a> over the counter erectile dysfunction pills
    03.05.2022 06:37:54
    Avatar of CharlesHogCharlesHog
    <a href=" https://stromectol.company/# ">tractor supply ivermectin for dogs</a> ivermectin paste for guinea pigs
    04.05.2022 05:01:14
    Avatar of MonteBubMonteBub
    <a href=http://cheapdrugs.store/#>online ed pills</a>
    05.05.2022 02:59:45
    Avatar of JeffreyBobJeffreyBob
    prednisone 20 mg tablet <a href=" https://prednisonemrt.com/# ">prednisone 4mg</a> prednisone best price
    06.05.2022 07:03:29
    Avatar of JeffreyBobJeffreyBob
    cialis extra <a href=" https://cialismrt.com/# ">cialis 20 mg best price</a> cialis & dapoxitine
    06.05.2022 08:46:58
    Avatar of JeffreyBobJeffreyBob
    prednisone without prescription <a href=" https://prednisonemrt.online/# ">generic prednisone</a> medicine prednisone 5mg
    07.05.2022 08:56:29
    Avatar of JeffreyBobJeffreyBob
    ver to bay cialis 20mg <a href=" https://cialismrt.com/# ">cheapest cialis usa</a> cialis and viagra together
    08.05.2022 07:00:14
    Avatar of JeffreyBobJeffreyBob
    ivermectin oral for dogs <a href=" https://stromectolmrt.com/# ">ivermectin coronavirus</a> ivermectin and permethrin
    08.05.2022 09:32:55
    Avatar of JeffreyBobJeffreyBob
    ed medications online <a href=" https://cheapdrugsmrt.com/# ">new ed treatments</a> buy prescription drugs online
    09.05.2022 10:02:46
    Avatar of JeffreyBobJeffreyBob
    prednisone 1 mg for sale <a href=" https://prednisonemrt.online/# ">order prednisone</a> prednisone 5mg price
    09.05.2022 10:31:38
    Avatar of JeffreyBobJeffreyBob
    ivermectin pill cost <a href=" https://stromectolmrt.com/# ">what is stromectol</a> cost of ivermectin 1% cream
    11.05.2022 12:50:10
    Avatar of RogerfexRogerfex
    propecia india <a href=" https://finasteridemen.com/# ">finasteride 1 mg</a> where to get propecia
    12.05.2022 05:02:09
    Avatar of RogerfexRogerfex
    best ed treatment <a href=" https://edpillcanada.com/# ">ed pills for sale</a> pills for ed
    14.05.2022 03:40:56
    Avatar of RogerfexRogerfex
    how can i order prescription drugs without a doctor <a href=" https://canadapillsshop.com/# ">mexican pharmacy without prescription</a> amoxicillin without a doctor's prescription
    14.05.2022 07:36:47
    Avatar of RogerfexRogerfex
    ed drugs <a href=" https://edpillcanada.com/# ">new ed pills</a> ed pills otc
    15.05.2022 09:40:48
    Avatar of RogerfexRogerfex
    best ed pills non prescription <a href=" https://canadapillsshop.com/# ">best non prescription ed pills</a> ed meds online without prescription or membership
    15.05.2022 10:21:00
    Avatar of RogerfexRogerfex
    fincar <a href=" https://finasteridemen.com/# ">finasteride 5 mg prices</a> where to get propecia
    16.05.2022 04:04:33
    Avatar of NormandedNormanded
    best non prescription ed pills <a href=" https://edpilldrs.com/# ">ed drug prices</a> cheapest ed pills
    17.05.2022 07:22:53
    Avatar of NormandedNormanded
    canadian pharmacy online ship to usa <a href=" https://canadadrs.online/# ">meds online without doctor prescription</a> buying from canadian online pharmacies
    17.05.2022 09:33:54
    Avatar of NormandedNormanded
    aarp approved canadian online pharmacies <a href=" https://canadadrs.online/# ">buying from canadian online pharmacies</a> canadian pharmacies not requiring prescription
    18.05.2022 12:26:31
    Avatar of NormandedNormanded
    ed pills for sale <a href=" https://edpilldrs.online/# ">best non prescription ed pills</a> ed pills that really work
    19.05.2022 03:23:12
    Avatar of NormandedNormanded
    india pharmacy <a href=" https://indiadrs.online/# ">legitimate online pharmacies india</a> legitimate online pharmacies india
    19.05.2022 01:47:43
    Avatar of JohnnymibJohnnymib
    tadalafil without a doctor's prescription <a href=" https://cialistlf.com/# ">generic tadalafil 20mg india</a> cialis 20mg
    20.05.2022 05:17:48
    Avatar of JohnnymibJohnnymib
    buy clomid 50mg <a href=" https://clomidclo.com/# ">buy clomid 50mg</a> buy clomid 50mg
    20.05.2022 08:41:19
    Avatar of JohnnymibJohnnymib
    price for viagra <a href=" https://viagrasln.com/# ">viagra pills</a> sildenafil 20 mg
    21.05.2022 11:23:35
    Avatar of JohnnymibJohnnymib
    buy clomid <a href=" https://clomidclo.com/# ">buy clomid 50mg online</a> buy clomid 50mg online
    22.05.2022 03:03:57
    Avatar of JohnnymibJohnnymib
    tadalafil 20 mg buy online <a href=" https://cialistlf.com/# ">cialis pills</a> cialis 20 mg price
    22.05.2022 05:00:33
    Avatar of JohnnymibJohnnymib
    clomid tablets for sale <a href=" https://clomidclo.com/# ">buy clomid 50mg online</a> clomid tablets
    23.05.2022 11:24:28
    Avatar of EddiezopEddiezop
    stromectol tablets for humans <a href=" https://stromectol.company/# ">stromectol tablets for humans</a> stromectol for humans for sale
    24.05.2022 04:45:11
    Avatar of EddiezopEddiezop
    stromectol for humans for sale <a href=" https://stromectol.company/# ">traitement gale stromectol</a> stromectol tablets for humans
    24.05.2022 07:09:34
    Avatar of EddiezopEddiezop
    ivermectin for goat mites <a href=" https://stromectol.company/# ">stromectol for sale</a> stromectol tablets for humans
    25.05.2022 02:58:56
    Avatar of MichaelgeoseMichaelgeose
    price of viagra <a href=" https://viagrasus.com/# ">viagra pills</a> viagra without a doctor prescription
    26.05.2022 06:40:18
    Avatar of MichaelgeoseMichaelgeose
    buy viagra online canada <a href=" https://viagrasus.com/# ">sildenafil 20 mg</a> viagra from india
    26.05.2022 10:11:17
    Avatar of MichaelgeoseMichaelgeose
    when will viagra be generic <a href=" https://viagrasus.com/# ">viagra coupon</a> best over the counter viagra
    27.05.2022 01:18:03
    Avatar of HomerlafHomerlaf
    buy cialis 10 tab <a href=" https://tadalafilusi.com/# ">tadalafil 20mg best price</a> buy cialis overnight delivery
    28.05.2022 04:42:40
    Avatar of HomerlafHomerlaf
    cialis uk <a href=" https://tadalafilusi.com/# ">tadalafil 20mg best price</a> cialis dosage 40 mg
    28.05.2022 06:48:23
    Avatar of HomerlafHomerlaf
    cialis wiki <a href=" https://tadalafilusi.com/# ">tadalafil 20mg</a> buy cialis 20mg
    29.05.2022 10:52:06
    Avatar of HomerlafHomerlaf
    is cialis a vasodilator <a href=" https://tadalafilusi.com/# ">cialis 50mg price</a> cialis on line australia
    30.05.2022 12:31:09
    Avatar of HomerlafHomerlaf
    sell of cialis <a href=" https://tadalafilusi.com/# ">generic version of cialis</a> cialis on line pharm
    30.05.2022 10:48:37
    Avatar of VernonAnipsVernonAnips
    generic cialis au <a href=" https://tadalafilusi.com/# ">cialis</a>
    30.05.2022 01:47:35
    Avatar of HomerlafHomerlaf
    cialis half life <a href=" https://tadalafilusi.com/# ">price of cialis 20 mg</a> cialis (generic)
    04.06.2022 09:47:13
    Avatar of IverBlordIverBlord
    stromectol tab price <a href=" https://stromectolgf.com/# ">stromectol</a>
    04.06.2022 10:12:03
    Avatar of ChesterBonChesterBon
    https://stromectolgf.online/# buy ivermectin
    04.06.2022 02:29:45
    Avatar of StromasymnStromasymn
    <a href=https://stromectolgf.online/#>stromectol 6 mg dosage</a> stromectol buy
    05.06.2022 04:17:57
    Avatar of RalphvetRalphvet
    cialis on line purchase <a href=" https://tadalafilusi.com/# ">best price for daily cialis</a>
    06.06.2022 10:16:46
    Avatar of StromasymnStromasymn
    <a href=https://stromectolgf.com/#>ivermectin oral solution</a> ivermectin oral solution
    07.06.2022 12:02:14
    Avatar of ChesterBonChesterBon
    https://stromectolgf.online/# stromectol
    10.06.2022 06:06:07
    Avatar of ThomasNowThomasNow
    <a href=https://drwithoutdoctorprescription.com/#>prescription drugs online</a> best ed pills non prescription
    11.06.2022 05:21:49
    Avatar of CameronbutCameronbut
    pain medications without a prescription <a href=" https://drwithoutdoctorprescription.com/# ">without doctor prescription</a>
    11.06.2022 11:22:53
    Avatar of StevenRawStevenRaw
    https://drwithoutdoctorprescription.online/# buy prescription drugs
    11.06.2022 05:01:51
    Avatar of RalphvetRalphvet
    cialis on line paypal payment <a href=" https://tadalafilusi.com/# ">how to get maximum effect fr om cialis</a>
    11.06.2022 07:20:46
    Avatar of ThomasNowThomasNow
    <a href=https://drwithoutdoctorprescription.online/#>canadian drugs online</a> cat antibiotics without pet prescription
    11.06.2022 10:53:08
    Avatar of CameronbutCameronbut
    comfortis without vet prescription <a href=" https://drwithoutdoctorprescription.com/# ">without doctor prescription</a>
    17.06.2022 04:54:28
    Avatar of JamisonFogJamisonFog
    buy viagra online usa <a href=" https://sildenafilmg.com/# ">viagra pills</a>
    https://sildenafilmg.online/# п»їviagra pills
    <a href=https://sildenafilmg.com/#>viagra for men</a> buy real viagra online
    17.06.2022 11:39:14
    Avatar of MichaelFloopMichaelFloop
    https://sildenafilmg.com/ viagra without a doctor prescription
    17.06.2022 03:54:39
    Avatar of MichaelskitaMichaelskita
    <a href=https://sildenafilmg.shop/#>viagra shop</a> cheap viagra online
    18.06.2022 03:52:01
    Avatar of BrandonJesBrandonJes
    over the counter viagra <a href=" https://sildenafilmg.shop/# ">viagra from india</a>
    18.06.2022 10:41:51
    Avatar of MichaelFloopMichaelFloop
    https://sildenafilmg.online/# viagra over the counter
    18.06.2022 01:29:06
    Avatar of JamisonFogJamisonFog
    order viagra online <a href=" https://sildenafilmg.shop/# ">sildenafil</a>
    https://sildenafilmg.online/# viagra cost per pill
    <a href=https://sildenafilmg.shop/#>viagra</a> viagra cost
    19.06.2022 12:11:12
    Avatar of MichaelskitaMichaelskita
    <a href=https://sildenafilmg.shop/#>viagra shop</a> viagra over the counter
    19.06.2022 02:25:50
    Avatar of BrandonJesBrandonJes
    viagra over the counter walmart <a href=" https://sildenafilmg.online/# ">viagra discount</a>
    19.06.2022 09:31:07
    Avatar of MichaelFloopMichaelFloop
    https://sildenafilmg.online/# over the counter viagra
    20.06.2022 01:39:51
    Avatar of BrandonJesBrandonJes
    where to buy viagra <a href=" https://sildenafilmg.online/# ">when will viagra be generic</a>
    20.06.2022 04:18:39
    Avatar of MichaelFloopMichaelFloop
    https://sildenafilmg.com/ best over the counter viagra
    20.06.2022 06:59:11
    Avatar of JamisonFogJamisonFog
    п»їviagra pills <a href=" https://sildenafilmg.shop/# ">sildenafil</a>
    https://sildenafilmg.online/# viagra price
    <a href=https://sildenafilmg.shop/#>viagra shop</a> viagra amazon
    20.06.2022 08:31:22
    Avatar of MichaelskitaMichaelskita
    <a href=https://sildenafilmg.com/#>viagra coupons 75% off</a> viagra without a doctor prescription usa
    21.06.2022 12:55:03
    Avatar of BrandonJesBrandonJes
    cost of viagra <a href=" https://sildenafilmg.online/# ">where to buy viagra</a>
    21.06.2022 06:39:34
    Avatar of JamisonFogJamisonFog
    price of viagra <a href=" https://sildenafilmg.shop/# ">viagra shop</a>
    https://sildenafilmg.online/# buy viagra online usa
    <a href=https://sildenafilmg.com/#>sildenafil 20 mg</a> viagra without a doctor prescription usa
    22.06.2022 03:51:03
    Avatar of GeorgepakGeorgepak
    order amoxicillin no prescription <a href=" https://amoxilforsale.best/# ">amoxicillin canada price</a>
    22.06.2022 03:27:28
    Avatar of StephenTusStephenTus
    https://clomidforsale.life/# clomid tablets australia
    22.06.2022 10:53:22
    Avatar of GeorgepakGeorgepak
    prednisone in mexico <a href=" https://prednisoneforsale.store/# ">where can i get prednisone over the counter</a>
    23.06.2022 01:50:12
    Avatar of RobertKnineRobertKnine
    clomid uk purchase <a href=" https://clomidforsale.life/# ">cheapest clomid uk</a>
    23.06.2022 02:39:40
    Avatar of ShelbyToFShelbyToF
    <a href=https://amoxilforsale.best/#>amoxicillin capsule 500mg price</a> can you buy amoxicillin over the counter in canada
    23.06.2022 09:28:59
    Avatar of RaymondVawRaymondVaw
    can i buy zithromax over the counter in canada <a href=" https://zithromaxforsale.shop/# ">zithromax for sale us</a>
    23.06.2022 11:02:22
    Avatar of HomerlafHomerlaf
    where can i get clomid tablets <a href=" https://clomidforsale.life/# ">clomid online from india</a>
    https://zithromaxforsale.shop/# zithromax for sale cheap
    <a href=https://zithromaxforsale.shop/#>zithromax online usa</a> zithromax without prescription
    23.06.2022 06:02:27
    Avatar of GeorgepakGeorgepak
    zithromax without prescription <a href=" https://zithromaxforsale.shop/# ">purchase zithromax online</a>
    23.06.2022 08:32:26
    Avatar of StephenTusStephenTus
    https://amoxilforsale.best/# generic amoxicillin cost
    25.06.2022 04:35:15
    Avatar of PhilipsmagoPhilipsmago
    lasix 20 mg <a href=" https://buylasix.icu/# ">lasix 40 mg</a>
    https://buylasix.icu/# lasix online
    <a href=https://buymetformin.best/#>metformin 850 mg cost</a> best generic metformin
    25.06.2022 07:40:39
    Avatar of HomerlafHomerlaf
    <a href=https://buylipitor.store/#>lipitor atorvastatin calcium</a> lipitor over the counter
    25.06.2022 11:10:39
    Avatar of RaymondVawRaymondVaw
    https://buynolvadex.store/# tamoxifen menopause
    26.06.2022 05:04:44
    Avatar of PhilipsmagoPhilipsmago
    furosemide 100 mg <a href=" https://buylasix.icu/# ">furosemida</a>
    https://buylasix.icu/# buy furosemide online
    <a href=https://buylipitor.store/#>lipitor 10mg tablet price</a> lipitor 10 mg tablet price
    26.06.2022 08:47:18
    Avatar of HomerlafHomerlaf
    <a href=https://buylipitor.store/#>buy lipitor cheap</a> lipitor prescription
    26.06.2022 09:25:17
    Avatar of RickyBumRickyBum
    buy tamoxifen <a href=" https://buynolvadex.store/# ">nolvadex pct</a>
    https://buylasix.icu/# lasix online
    <a href=https://buytadalafil.men/#>generic tadalafil canada</a> cheap generic tadalafil 5mg
    27.06.2022 03:54:08
    Avatar of RaymondVawRaymondVaw
    https://buynolvadex.store/# tamoxifen endometrium
    27.06.2022 05:11:08
    Avatar of EdwardpreriEdwardpreri
    metformin 825 mg <a href=" https://buymetformin.best/# ">metformin 50</a>
    27.06.2022 09:22:12
    Avatar of WilliamSixWilliamSix
    lasix generic <a href=" https://buylasix.icu/# ">lasix furosemide 40 mg</a>
    28.06.2022 07:25:07
    Avatar of GeorgerahGeorgerah
    https://erectionpills.best/# otc ed pills
    29.06.2022 01:42:52
    Avatar of JeffreyDokJeffreyDok
    cipro 500mg best prices <a href=" https://cipro.best/# ">buy cipro online without prescription</a>
    https://gabapentin.icu/# neurontin 1000 mg
    <a href=https://cipro.best/#>purchase cipro</a> buy cipro cheap
    29.06.2022 01:45:22
    Avatar of MichealRuismMichealRuism
    <a href=https://erectionpills.best/#>ed meds online</a> cheap erectile dysfunction
    29.06.2022 05:23:57
    Avatar of RobertpaymnRobertpaymn
    https://cipro.best/# buy ciprofloxacin over the counter
    29.06.2022 04:57:40
    Avatar of JefferySarveJefferySarve
    buy cheap neurontin online <a href=" https://gabapentin.icu/# ">neurontin rx</a>
    30.06.2022 12:57:14
    Avatar of ThomashausaThomashausa
    where to get diflucan without a prescription <a href=" https://diflucan.icu/# ">can i buy diflucan over the counter uk</a>
    https://gabapentin.icu/# buy gabapentin online
    <a href=https://withoutprescription.store/#>ed meds online without doctor prescription</a> buy prescription drugs without doctor
    30.06.2022 01:57:14
    Avatar of IsiahnitIsiahnit
    neurontin pfizer <a href=" https://gabapentin.icu/# ">neurontin 400 mg cost</a>
    30.06.2022 01:28:02
    Avatar of RobertpaymnRobertpaymn
    https://erectionpills.best/# ed treatment drugs
    30.06.2022 08:40:19
    Avatar of JeffreyDokJeffreyDok
    neurontin sale <a href=" https://gabapentin.icu/# ">neurontin cost generic</a>
    https://cipro.best/# buy ciprofloxacin over the counter
    <a href=https://erectionpills.best/#>non prescription ed pills</a> best ed pills non prescription
    01.07.2022 12:36:33
    Avatar of JefferySarveJefferySarve
    canadian drugs online <a href=" https://withoutprescription.store/# ">buy prescription drugs from india</a>
    01.07.2022 02:44:57
    Avatar of IsiahnitIsiahnit
    neurontin 900 mg <a href=" https://gabapentin.icu/# ">neurontin online pharmacy</a>
    01.07.2022 04:16:49
    Avatar of ThomashausaThomashausa
    ordering neurontin online <a href=" https://gabapentin.icu/# ">32 neurontin</a>
    https://gabapentin.icu/# neurontin 300mg
    <a href=https://erectionpills.best/#>mens ed pills</a> impotence pills
    01.07.2022 05:36:40
    Avatar of AndrewDipAndrewDip
    cipro ciprofloxacin <a href=" https://cipro.best/# ">purchase cipro</a>
    https://diflucan.icu/# buy generic diflucan
    <a href=https://erectionpills.best/#>best ed pills</a> male erection pills
    01.07.2022 09:42:17
    Avatar of RobertpaymnRobertpaymn
    https://withoutprescription.store/# pet antibiotics without vet prescription
    02.07.2022 08:18:15
    Avatar of JefferySarveJefferySarve
    neurontin tablets 100mg <a href=" https://gabapentin.icu/# ">buy neurontin uk</a>
    02.07.2022 09:29:50
    Avatar of GeorgerahGeorgerah
    https://diflucan.icu/# diflucan cream prescription
    02.07.2022 12:32:27
    Avatar of MichealRuismMichealRuism
    <a href=https://withoutprescription.store/#>buy prescription drugs from canada cheap</a> prescription drugs
    02.07.2022 04:29:52
    Avatar of JeffreyDokJeffreyDok
    cipro for sale <a href=" https://cipro.best/# ">purchase cipro</a>
    https://erectionpills.best/# the best ed pill
    <a href=https://cipro.best/#>cipro online no prescription in the usa</a> ciprofloxacin
    Captcha Обновить
    Go Top