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