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

一直在用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

原文地址:https://www.cnblogs.com/jankerxp/p/7774039.html