<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=351794&amp;view=findpost&amp;p=3119601</guid>
        <pubDate>Mon, 16 Apr 2012 14:04:25 +0000</pubDate>
        <title>Перечисление портов последовательного доступа (COM port enumeration)</title>
        <link>https://forum.sources.ru/index.php?showtopic=351794&amp;view=findpost&amp;p=3119601</link>
        <description><![CDATA[Filka: <div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">procedure EnumComPorts(Ports: TStrings);</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp;PortsCount = 255;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;PortNumber: Integer;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;procedure GetComPort(i: Integer);</div><div class="code_line">&nbsp;&nbsp;var</div><div class="code_line">&nbsp;&nbsp; &nbsp;sr: TSearchRec;</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;if FindFirst(&#39;\.\COM&#39; + IntToStr(i), FILE_ATTRIBUTE_NORMAL, sr) = 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Ports.Add(sr.Name);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Inc(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PortNumber := i;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;GetComPort(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;until FindNext(sr) &#60;&#62; 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;FindClose(sr);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;PortNumber := 1;</div><div class="code_line">&nbsp;&nbsp;while PortNumber &#60; PortsCount do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;GetComPort(PortNumber);</div><div class="code_line">&nbsp;&nbsp; &nbsp;Inc(PortNumber);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
Пример:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">EnumComPorts(Memo1.Lines);</div></ol></div></div></div></div>]]></description>
        <author>Filka</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=351794&amp;view=findpost&amp;p=3119332</guid>
        <pubDate>Mon, 16 Apr 2012 10:55:41 +0000</pubDate>
        <title>Перечисление портов последовательного доступа (COM port enumeration)</title>
        <link>https://forum.sources.ru/index.php?showtopic=351794&amp;view=findpost&amp;p=3119332</link>
        <description><![CDATA[Krid: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=351794&view=findpost&p=3108357'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>jack128 &#064; <time class="tag-quote__quoted-time" datetime="2012-03-31T15:54:36+00:00">31.03.12, 15:54</time></span><div class='quote '>это не коректный код. вполне возможна ситуация,когда существует ком2, но не существует ком1 </div></div><br>
Это да. Правда, у мя работает. Но только с ком1 (хотя комов - четыре). Но это, думаю, сути не меняет.<br>
<br>
Вообще, код конечно пользительный, но его изменить надо бы, ИМХО..]]></description>
        <author>Krid</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=351794&amp;view=findpost&amp;p=3108357</guid>
        <pubDate>Sat, 31 Mar 2012 15:54:36 +0000</pubDate>
        <title>Перечисление портов последовательного доступа (COM port enumeration)</title>
        <link>https://forum.sources.ru/index.php?showtopic=351794&amp;view=findpost&amp;p=3108357</link>
        <description><![CDATA[jack128: <strong class='tag-b'>Filka</strong><br>
это не коректный код. вполне возможна ситуация,когда существует ком2, но не существует ком1]]></description>
        <author>jack128</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=351794&amp;view=findpost&amp;p=3094025</guid>
        <pubDate>Sun, 11 Mar 2012 13:33:25 +0000</pubDate>
        <title>Перечисление портов последовательного доступа (COM port enumeration)</title>
        <link>https://forum.sources.ru/index.php?showtopic=351794&amp;view=findpost&amp;p=3094025</link>
        <description><![CDATA[Filka: Тоже стало интересно. Накодил:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">procedure EnumComPorts(Ports: TStrings);</div><div class="code_line">&nbsp;&nbsp;procedure GetComPort(i: Integer);</div><div class="code_line">&nbsp;&nbsp;var</div><div class="code_line">&nbsp;&nbsp; &nbsp;sr: TSearchRec;</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;if FindFirst(&#39;\.\COM&#39; + IntToStr(i), FILE_ATTRIBUTE_NORMAL, sr) = 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Ports.Add(sr.Name);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Inc(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;GetComPort(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;until FindNext(sr) &#60;&#62; 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;FindClose(sr);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;GetComPort(1);</div><div class="code_line">end;</div></ol></div></div></div></div><br>
Пример:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">EnumComPorts(Memo1.Lines);</div></ol></div></div></div></div>]]></description>
        <author>Filka</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=351794&amp;view=findpost&amp;p=3084222</guid>
        <pubDate>Fri, 24 Feb 2012 13:35:28 +0000</pubDate>
        <title>Перечисление портов последовательного доступа (COM port enumeration)</title>
        <link>https://forum.sources.ru/index.php?showtopic=351794&amp;view=findpost&amp;p=3084222</link>
        <description><![CDATA[--Ins--: Интересно, а FindFirst/FindNext порты перечисляет? Ни разу не пробовал, но пайпы и мэйлслоты точно прекрасно перечисляет]]></description>
        <author>--Ins--</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=351794&amp;view=findpost&amp;p=3083953</guid>
        <pubDate>Fri, 24 Feb 2012 08:20:56 +0000</pubDate>
        <title>Перечисление портов последовательного доступа (COM port enumeration)</title>
        <link>https://forum.sources.ru/index.php?showtopic=351794&amp;view=findpost&amp;p=3083953</link>
        <description><![CDATA[Romkin: <span class="tag-color tag-color-named" data-value="purple" style="color: purple"><span class='tag-size' data-value='14' style='font-size:14pt;'>Перечисление последовательных портов</span></span><br>
<br>
Вообще говоря, это просто сервис: показать список имеющихся COM портов, для выбора.<br>
<br>
На мой взгляд проще всего это сделать через WMI. Для этого сначала требуется получить (не создать&#33;) COM-объект по URI &#39;winmgmts:&#092;&#092;.&#092;root&#092;CIMV2&#39; и запросить у него список портов, с помощью запроса. &#39;&#092;&#092;.&#39; на самом деле здесь текуший компьютер, можно указать имя другой рабочей станции, но это уже требует привилегий администратора.<br>
Далее у WMI надо запросить список портов, делается это запросом к объекту Win32_SerialPort: &#39;SELECT * FROM Win32_SerialPort&#39;, который возвращает коллекцию, описывающую именно serial ports.<br>
Остается только пройти по коллекции и обратиться к свойствам ее элементов, в частности caption выдает читаемое имя порта, а DeviceID - его имя, COM1, COM2 и т.д.<br>
Разумеется, в современных версиях Delphi удобно создать нумератор для прохода по этой коллекции. <br>
Собственно, это все, что нужно сделать, исходник короткий, я соединяюсь с WMI поздним связыванием, поэтому моуль получился автономным:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">unit EnumSerialPorts;</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;Модуль перечисления последовательных портов.</div><div class="code_line">&nbsp;&nbsp;Используется WMI, берется минимальная информация.</div><div class="code_line">&nbsp;&nbsp;$Author: Roman $</div><div class="code_line">&nbsp;&nbsp;$Date:: 2012-02-21 15:37:00#$</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">interface</div><div class="code_line">&nbsp;</div><div class="code_line">uses SysUtils, Generics.Collections, ActiveX;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TSerialPortInfo = record</div><div class="code_line">&nbsp;&nbsp; &nbsp;Caption: string;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DeviceID: string;</div><div class="code_line">&nbsp;&nbsp; &nbsp;MaxBaudRate: cardinal;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ProviderType: string;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;TSerialPortEnum = class(TEnumerable&#60;TSerialPortInfo&#62;)</div><div class="code_line">&nbsp;&nbsp;strict private</div><div class="code_line">&nbsp;&nbsp; &nbsp;FWMIService: Variant;</div><div class="code_line">&nbsp;&nbsp;protected</div><div class="code_line">&nbsp;&nbsp; &nbsp;function DoGetEnumerator: TEnumerator&#60;TSerialPortInfo&#62;; override;</div><div class="code_line">&nbsp;&nbsp; &nbsp;type</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;TPortEnum = class(TEnumerator&#60;TSerialPortInfo&#62;)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;strict private</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;FEnum: IEnumVARIANT;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;FCurrentElem: OleVariant;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;protected</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;function DoGetCurrent: TSerialPortInfo; override;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;function DoMoveNext: Boolean; override;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;public</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;constructor Create(Enum: IEnumVariant);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;destructor Destroy; override;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;public</div><div class="code_line">&nbsp;&nbsp; &nbsp;constructor Create;</div><div class="code_line">&nbsp;&nbsp; &nbsp;destructor Destroy; override;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">implementation</div><div class="code_line">&nbsp;</div><div class="code_line">uses COMObj, Variants;</div><div class="code_line">&nbsp;</div><div class="code_line">//стандартные флаги для запроса</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp;wbemFlagForwardOnly = ;</div><div class="code_line">&nbsp;&nbsp;wbemFlagBidirectional = {text};</div><div class="code_line">&nbsp;&nbsp;wbemFlagReturnImmediately = ;</div><div class="code_line">&nbsp;&nbsp;wbemFlagReturnWhenComplete = {text};</div><div class="code_line">&nbsp;&nbsp;wbemQueryFlagPrototype = ;</div><div class="code_line">&nbsp;&nbsp;wbemFlagUseAmendedQualifiers = 000;</div><div class="code_line">&nbsp;</div><div class="code_line">function GetVariantEnumerator(obj: Variant): IEnumVariant;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Enum: IUnknown;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Enum := obj._NewEnum;</div><div class="code_line">&nbsp;&nbsp;OleCheck(Enum.QueryInterface(IEnumVariant, Result));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function GetObject(const ObjName: WideString): Variant;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Temp: IDispatch;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;OleCheck(CoGetObject(PWideString(ObjName), nil, IDispatch, @Temp));</div><div class="code_line">&nbsp;&nbsp;Result := Temp;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">{ TSerialPortList }</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp;strMonName: WideString = &#39;winmgmts:\.\root\CIMV2&#39;;</div><div class="code_line">&nbsp;&nbsp;strQueryList: WideString = &#39;SELECT * FROM Win32_SerialPort&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">constructor TSerialPortEnum.Create;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;inherited;</div><div class="code_line">&nbsp;&nbsp;FWMIService := GetObject(strMonName);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">destructor TSerialPortEnum.Destroy;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;FWMIService := Unassigned;</div><div class="code_line">&nbsp;&nbsp;inherited;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TSerialPortEnum.DoGetEnumerator: TEnumerator&#60;TSerialPortInfo&#62;;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Items: OleVariant;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Items := FWMIService.ExecQuery(strQueryList, &#39;WQL&#39;, wbemFlagForwardOnly);</div><div class="code_line">&nbsp;&nbsp;Result := TPortEnum.Create(GetVariantEnumerator(Items));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">{ TSerialPortList.TPortEnum }</div><div class="code_line">&nbsp;</div><div class="code_line">constructor TSerialPortEnum.TPortEnum.Create(Enum: IEnumVariant);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;inherited Create;</div><div class="code_line">&nbsp;&nbsp;FEnum := Enum;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">destructor TSerialPortEnum.TPortEnum.Destroy;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;FEnum := nil;</div><div class="code_line">&nbsp;&nbsp;inherited;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TSerialPortEnum.TPortEnum.DoGetCurrent: TSerialPortInfo;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result.Caption := FCurrentElem.Caption;</div><div class="code_line">&nbsp;&nbsp;Result.DeviceID := FCurrentElem.DeviceID;</div><div class="code_line">&nbsp;&nbsp;Result.MaxBaudRate := FCurrentElem.MaxBaudRate;</div><div class="code_line">&nbsp;&nbsp;Result.ProviderType := FCurrentElem.ProviderType;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TSerialPortEnum.TPortEnum.DoMoveNext: Boolean;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Fetched: Cardinal;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := (FEnum.Next(1, FCurrentElem, Fetched) = S_OK);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">end.</div></ol></div></div></div></div><br>
Пример использования:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;PortInfo: TSerialPortInfo;</div><div class="code_line">&nbsp;&nbsp;PortEnum: TSerialPortEnum;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;PortEnum := TSerialPortEnum.Create;</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;for PortInfo in PortEnum do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ComboBox1.Items.Add(PortInfo.DeviceID);</div><div class="code_line">&nbsp;&nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp;PortEnum.Free;</div><div class="code_line">&nbsp;&nbsp;end;</div></ol></div></div></div></div>]]></description>
        <author>Romkin</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      </channel>
      </rss>
	