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