Autor Téma: Chyba při předání parametru  (Přečteno 2087 krát)

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 984
  • Karma: 27
    • Verze Delphi: XE8, Seattle
Chyba při předání parametru
« kdy: 20-09-2012, 15:57:00 »
Ahoj
je to asi hloupost, ale už se mi to několikrát stalo v jednoduchém kódu (v Delphi 2007).
Při předání řetězce S do jednoduché procedury CopyAsCommas(const S: string), dojde k chybě AV při vložení parametru (přesně na instrukci "004645A2 8B8070020000     mov eax,[eax+$00000270]").
Následující kód ilustruje příklad.
Kód: Delphi [Vybrat]
  1. procedure TForm3.FormCreate(Sender: TObject);
  2. var
  3.   S: string;
  4.   F: TADSI;
  5. begin
  6.   Caption := GetDomainName() + '/' + GetUserName();
  7.   F := TADSI.Create(nil);
  8.   try
  9.     S := '';
  10.     if F.GetUsersOfGroup(GetDomainName(), 'test_group', S) then
  11.     begin
  12.       S := F.UsersOfGroup;
  13.       if ContainsValComma(GetUserName(), S) then
  14.         ShowMessage('Yes');
  15.       CopyAsCommas(S); //<-zde dojde k chybě
  16.     end;
  17.   finally
  18.     F.Free;
  19.   end;
  20. end;
  21.  
tušil by někdo, v čem může být chyba resp. chyba v okamžiku když hodnota stringu opouští funkci?

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2668
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Chyba při předání parametru
« Odpověď #1 kdy: 20-09-2012, 16:07:34 »
Kód: Delphi [Vybrat]
  1.     if F.GetUsersOfGroup(GetDomainName(), 'test_group', S) then
  2.     begin
  3.       S := F.UsersOfGroup;
  4.       if ContainsValComma(GetUserName(), S) then
  5.         ShowMessage('Yes');
  6.       CopyAsCommas(S); //<-zde dojde k chybě
  7.  
  8.  
tušil by někdo, v čem může být chyba resp. chyba v okamžiku když hodnota stringu opouští funkci?

Rekl bych, ze se neco pokazi v metodach tridy F - nejspis to nejak prepisuje pamet.


Offline JaroB

  • Guru
  • *****
  • Příspěvků: 984
  • Karma: 27
    • Verze Delphi: XE8, Seattle
Re:Chyba při předání parametru
« Odpověď #2 kdy: 20-09-2012, 16:16:04 »
Tam se volá nějaký hnusný ADs objekt, psal jsem to podle dokumentace :( ale je v něm chráněný blok, který nic nechytí...

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 984
  • Karma: 27
    • Verze Delphi: XE8, Seattle
Re:Chyba při předání parametru
« Odpověď #3 kdy: 20-09-2012, 16:20:44 »
Tak to funguje bez chyby pouze v případě, když deklarace není uvnitř procedury OnCreate, ale třeba v private sekci formu. Čert ví proč...

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2668
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Chyba při předání parametru
« Odpověď #4 kdy: 20-09-2012, 16:59:56 »
Tak to funguje bez chyby pouze v případě, když deklarace není uvnitř procedury OnCreate, ale třeba v private sekci formu. Čert ví proč...
Deklarace ceho? Te promenne S?

Jestli jo, tak rozdil je persistence te promenne: uvnitr OnCreate je to lokalni automaticka promenna, ktera zanika po navratu ze subroutiny.
Z kodu cos poslal neni nic videt, ale tohle typicky indikuje predani odkaz na automatickou promennou mimo jeji scope.


Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2479
  • Karma: 103
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Chyba při předání parametru
« Odpověď #5 kdy: 20-09-2012, 18:19:39 »
Tak to funguje bez chyby pouze v případě, když deklarace není uvnitř procedury OnCreate, ale třeba v private sekci formu. Čert ví proč...

Protoze ti to prepise neco jineho :-) ?

Co na to FastMM a fulldebug mode?
Embarcadero MVP - Czech republic

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 984
  • Karma: 27
    • Verze Delphi: XE8, Seattle
Re:Chyba při předání parametru
« Odpověď #6 kdy: 20-09-2012, 19:54:21 »
Jo, omlouvám se, zapomněl jsem říct, co jsem přesunul. Deklaraci objektu F: TADSI (což je potomek TComponent) a ovládá některé přístupy k ActiveDirectory.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2668
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Chyba při předání parametru
« Odpověď #7 kdy: 20-09-2012, 20:25:40 »
Jo, omlouvám se, zapomněl jsem říct, co jsem přesunul. Deklaraci objektu F: TADSI (což je potomek TComponent) a ovládá některé přístupy k ActiveDirectory.

No ale to by vypadalo, ze bud ti tam dobihaji jeste nejake asynchronni zalezitosti po tom, co tu instanci TADSI killnes ev. ze by ti vracela referenci na nejaka data, ktera si naalokovala a po killnuti instance je pamet vracena, ale referenci se snazi nekdo pouzivat. Urcite bych sahnul po tom FastMM ve full debug mode, jak ti radil Radek, protoze to znamena, ze nekde je nejaka cunarna, ktera buhvi jak se muze projevovat.