⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xcomenum.pas

📁 delphi串口通讯控件,简单易用
💻 PAS
字号:
unit XComEnum;
(**************************************************************************
 *     This unit is part of XComDrv.                                      *
 *                                                                        *
 *     Communication ports enumerator                                     *
 *                                                                        *
 *     Author     : Alexander Grischenko, Latvia                          *
 *     Mail       : gralex@mailbox.riga.lv                                *
 *                                                                        *
 *     Version    : 1.0                                                   *
 *     Released   : 23 January, 2001                                      *
 *     Type       : Freeware                                              *
 *                                                                        *
 *     Target     : Delphi 4 - Delphi 5                                   *
 *                                                                        *
 *                                                                        *
 **************************************************************************)

{$H+,R-,B-}

interface

uses
  Windows, WinSpool, SysUtils, Classes;

type
  TPortOption  = (poCOM, poLPT, poFAX, poPrinters);
  TPortOptions = set of TPortOption;

function EnumNeededPorts(Ports:TStrings; PortOptions: TPortOptions): Boolean;
function EnumComPorts(Ports:TStrings): Boolean;

implementation
uses XComErr;

function EnumComPorts(Ports: TStrings): boolean;
begin
   Result := EnumNeededPorts(Ports, [poCOM]);
end;

function EnumNeededPorts(Ports: TStrings; PortOptions: TPortOptions): boolean;
var
  BytesNeeded, Returned, i: DWORD;
  PortsPtr, InfoPtr: PPortInfo1;
  TempStr: String;
begin
  Result := EnumPorts(
    nil, // this computer
    1,   // structure type 1 (port names only)
    nil, // no data needed
    0,   // info about structure size needed
    BytesNeeded,
    Returned);

  if (not Result) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) then
  begin
    GetMem(PortsPtr, BytesNeeded);  // Get needed memory
    try
      Result := EnumPorts(
        nil,
        1,
        Pointer(PortsPtr),
        BytesNeeded,
        BytesNeeded,
        Returned);

      InfoPtr := PortsPtr;
      Ports.Clear;
      for i := 0 to Returned - 1 do begin
        TempStr := InfoPtr^.pName;
        Inc(InfoPtr);

        // Remove last ':'
        if Copy(TempStr, 1, 2) <> '\\'
           then Delete(TempStr, Length(TempStr), 1);

        // check for COM
        if (poCOM in PortOptions) then
        begin
          if (Copy(TempStr, 1, 3)='COM') then
            Ports.Add(TempStr)
        end
        else

        // check for LPT
        if poLPT in PortOptions then
        begin
          if (Copy(TempStr, 1, 3)='LPT') then
            Ports.Add(TempStr);
        end
        else

        // check for network printers
        if poPrinters in PortOptions then
        begin
          if (Copy(TempStr, 1, 2)='\\') then
            Ports.Add(TempStr);
        end
        else

        // check for FAX
        if poFAX in PortOptions then
        begin
          if (pos('FAX',TempStr)>0) then
            Ports.Add(TempStr);
        end;
      end;

    finally
      FreeMem(PortsPtr);
    end;
  end;

  if not Result then XCommWin32Error(SEnumFailed, DEC_ENUMFAILED);
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -