• 关于枚举电脑串口的一个小问题


    一直在用Cport控件,也用了它带的一个枚举电脑串口的函数EnumComPorts(),原代码如下:

    procedure EnumComPorts(Ports: TStrings);
    var
      KeyHandle: HKEY;
      ErrCode, Index: Integer;
      ValueName, Data: string;
      ValueLen, DataLen, ValueType: DWORD;
      TmpPorts: TStringList;
    begin
      ErrCode := RegOpenKeyEx(
        HKEY_LOCAL_MACHINE,
        'HARDWARE\DEVICEMAP\SERIALCOMM',
        0,
        KEY_READ,
        KeyHandle);
    
    
      if ErrCode <> ERROR_SUCCESS then
      begin
        //raise EComPort.Create(CError_RegError, ErrCode);
        exit;
      end;
    
    
      TmpPorts := TStringList.Create;
      try
        Index := 0;
        repeat
          ValueLen := 256;
          DataLen := 256;
          SetLength(ValueName, ValueLen);
          SetLength(Data, DataLen);
          ErrCode := RegEnumValue(
            KeyHandle,
            Index,
            PChar(ValueName),
            {$IFDEF DELPHI_4_OR_HIGHER}
            Cardinal(ValueLen),
            {$ELSE}
            ValueLen,
              {$ENDIF}
            nil,
            @ValueType,
            PByte(PChar(Data)),
            @DataLen);
    
    
          if ErrCode = ERROR_SUCCESS then
          begin
            SetLength(Data, DataLen - 1);
            TmpPorts.Add(Data);
            Inc(Index);
          end
          else
            if ErrCode <> ERROR_NO_MORE_ITEMS then break;
              //raise EComPort.Create(CError_RegError, ErrCode);
    
    
        until (ErrCode <> ERROR_SUCCESS) ;
    
    
        TmpPorts.Sort;
        Ports.Assign(TmpPorts);
      finally
        RegCloseKey(KeyHandle);
        TmpPorts.Free;
      end;
    
    
    end;

    原来是用delphi7一直正常,现在用XE2,出了小问题。



    当把枚举出来的Ports分配到ComboBox时,一切显示正常


    但是,当把串口号变更值保存到注册表或ini文件后,下次启动程序时,没有保存变更的串口号,这是怎么回事呢?排除了各种错误后,检测这个函数检出的串口,发现串口号名称竟然变长了,比如com1本来为4,在Ports中保存的这个值长度为10,但是在comboBox中显示时,显示是正常的,杯具的是,我在程序启动时,是要检测电脑串口,然后根据保存注册表中的串号和Ports比较,如果有这个串口号,刚不变,否则就设置默认值。这样每次启动程序时,串口都恢复到默认值,因为"com1" <> "  com1  ",而且可能"  com1  "多余的字符不仅有空格,可能还有不可显示字符。用Trim解决不了问题。应当是在这个地方修正

    TmpPorts.Add(Data);
    修改成:

    TmpPorts.Add(PChar(Data));
    OK,我想这个主要是字符串的问题,ANSIString和UncodeString

  • 相关阅读:
    Linux 使用 ssh 命令远程连接另一台 Linux
    高并发连接导致打开文件过多:java.io.IOException: Too many open files 解决方法
    WEB安全:Tomcat 只可通过域名访问,禁止通过 IP 访问
    Jmeter
    CentOS 7 开启 SNMP 实现服务器性能监控
    SSM框架、Druid连接池实现多数据源配置(已上线使用)
    Tomcat 服务器安装 SSL证书,实现 HTTP 自动跳转 HTTPS
    java操作远程共享目录
    jobss目录结构
    oracle中if/else的三种实现方式
  • 原文地址:https://www.cnblogs.com/jankerxp/p/7774039.html
Copyright © 2020-2023  润新知