Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Strange registry bug


Thaddy ©   (2005-06-30 20:46:00) 

Jon send me the following code:
------------
function GetSerialPortNames: string;
var
 reg: HKEY;
 l,v: PStrList;
 n: integer;
begin
 l := NewStrList;
 v := NewStrList;
 reg := RegKeyOpenRead(HKEY_LOCAL_MACHINE, 'HARDWARE\DEVICEMAP\SERIALCOMM');
 try
   RegKeyGetValueNames(reg,l);
   for n := 0 to l.Count - 1 do
     v.Add(RegKeyGetStr(reg,l.Items[n]));
 finally
   RegKeyClose(reg);
 end;
 Result := l.Text;
 l.Free;
 v.Free
end;
--------------------
//TDK//Here's his comment, I can reproduce this!

---------------

The result that I expect is:

Result = 'COM3'#$D#$A'COM4'#$D#$A'COM2'#$D#$A'COM1'#$D#$A

But one of the registry values is NOT null-terminated (COM4 length is 4, not 5).
I have used 'Registry Commander' and 'Resplendent Registrar' to confirm this.
So I get unexpected results, such as these:

Result = 'COM3'#$D#$A'COM42'#$D#$A'COM2'#$D#$A'COM1'#$D#$A
Result = 'COM3'#$D#$A'COM4\Dev"'#$D#$A'COM2'#$D#$A'COM1'#$D#$A
Result = 'COM3'#$D#$A'COM4M4$'#$D'1'#$D#$A#$D#$A'COM2'#$D#$ A'COM1'#$D#$A
Result = 'COM3'#$D#$A'COM4(003)'#$D#$A'COM2'#$D#$A'COM1'#$D #$A
Result = 'COM3'#$D#$A'COM4Ü'#$D#$A''COM2'#$D#$A'COM1'#$D#$A

When I try similar code with the VCL,
---------------------
v.Add(reg.ReadString(l[n]));
---------------------
results are always correct.

Is this a bug in KOL or I am using it incorrectly?
I have tried using RegKeyGetBinary but I don't know how to use it - I don't really understand pointers and buffers.

The registry key is automatically re-created when Windows starts and is always the same.

Many thanks in advance.
-------------------------


ECM   (2005-07-01 17:25:00) [1]

2Thaddy: а как удалось получить в реестре "one of the registry values is NOT null-terminated"


ECM   (2005-07-01 11:02:00) [2]

Я не совсем понял проблему... но может быть поможет реально работающий кусок кода (из wTerm) - там проблем  мною не замечено...:
---------
procedure TSetForm.SetCheckHdw(const Value: Boolean);
var
 i: Integer;
 RKey: HKEY;
 ComList,RegList: PStrList;
 S: String;
begin
 if fCheckHdwr <> Value then begin
   fCheckHdwr := Value;
   cbCheckHdwr.Checked := Value;
   // COM-Ports Enums
   cbComName.Clear;
   if fCheckHdwr then begin
     RKey := RegKeyOpenRead(HKEY_LOCAL_MACHINE,'HARDWARE\DEVICEMAP\SERIALCOMM');
     if RKey <> 0 then begin
       RegList := NewStrList();
       ComList := NewStrList();
       if RegKeyGetValueNames(RKey,RegList) then begin
         for i:=0 to RegList.Count-1 do begin
           S := RegKeyGetStr(RKey,RegList.Items[i]);
           if S <> '' then ComList.Add(S);
         end;
       end;
       if ComList.Count>0 then begin
         ComList.Sort(FALSE);
         for i:=0 to ComList.Count-1 do begin
           cbComName.Items[i] := ComList.Items[i];
         end;
         i := ComList.IndexOf(ComName);
         cbComName.CurIndex := i;
       end;
       Free_And_Nil(RegList);
       Free_And_Nil(ComList);
       RegKeyClose(RKey);
       RKey := 0;
     end;
------


Наверх

Титульная страница Поиск, карта сайта Написать письмо