zoukankan      html  css  js  c++  java
  • 关于枚举电脑串口的一个小问题

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

  • 相关阅读:
    lintcode:Binary Search 二分查找
    lintcode:1-10题
    leetcode 5 :Longest Palindromic Substring 找出最长回文子串
    leetcode 4 : Median of Two Sorted Arrays 找出两个数组的中位数
    Project Euler 78:Coin partitions
    Project Euler 77:Prime summations
    Project Euler 76:Counting summations
    筛选法求素数
    Codeforces D546:Soldier and Number Game
    Project Euler 75:Singular integer right triangles
  • 原文地址:https://www.cnblogs.com/jankerxp/p/7774039.html
Copyright © 2011-2022 走看看