Results 1 to 12 of 12

Thread: Free geeft crash op win2003 server

  1. #1
    (Mani as TMember).Post Mani's Avatar
    Join Date
    Aug 2002
    Location
    Het hoge noorden
    Posts
    563

    Free geeft crash op win2003 server

    Onderstaande code heeft altijd goed gewerkt met een gesequenste applicatie (gevirtualiseeerd). Tenminste zolang hij op een XP machine draaide.
    Na opstarten via Citrix (of eigenlijk draaien in een Win2003 schil) valt hij ineens over de laatste Free opdracht.
    Volgens mij maakt het voor Free niet uit of het object bestaat of niet.
    Is win2003 ineens anders geworden met afhandeling van objceten?

    Code:
      try
        F_PrinterInfoRecord := TPrinterInfoRecord(ComboBox_Printers.Items.Objects[ComboBox_Printers.ItemIndex]);
    
        if (F_PrinterInfoRecord.PrinterName = '') then
        begin //print to screen
          Label_UsedSystemPrinter.Caption := '-';
          Label_SystemPrinterStatus.Caption := '-';
        end
        else
        begin
          Label_UsedSystemPrinter.Caption := F_PrinterInfoRecord.PrinterName;
          Label_SystemPrinterStatus.Caption := '-';
          Printer.PrinterIndex := Printer.Printers.IndexOf(F_PrinterInfoRecord.PrinterName);
          ComboBox_PaperBins.Clear;
          F_StringList := TStringList.Create;
          GetBinNames(Printer, F_StringList);
          ComboBox_PaperBins.Items.Assign(F_StringList);
          ComboBox_PaperBins.ItemIndex :=
          GetIndexOfBin(ComboBox_PaperBins.Items, F_PrinterInfoRecord.PaperBin);
        end;
      finally
        F_StringList.Free;
      end;

  2. #2
    Supports INLDelphiMember Johan Stokking's Avatar
    Join Date
    Sep 2003
    Location
    Assen
    Posts
    649
    De F_StringList bestaat nu alleen in het geval dat F_PrinterInfoRecord.PrinterName niet leeg is. Het object moet wel degelijk bestaan wil je Free kunnen aanroepen. Een dirty oplossing is FreeAndNil(F_StringList) aanroepen.

    Altijd beter is destructors op hetzelfde niveau zetten als de constructor.

  3. #3
    (Mani as TMember).Post Mani's Avatar
    Join Date
    Aug 2002
    Location
    Het hoge noorden
    Posts
    563
    Zo heb ik het dus ook maar opgelost. Vreemd is wel dat het gewoon onder XP geen probleem geeft.

  4. #4
    Nog 3 maanden student :)
    Join Date
    Oct 2003
    Location
    Sittard
    Posts
    491
    windows2003 is oa gericht op veiligheid, dus heeft strengere regels op het geheugen.. en ook omdat het een server is.. zegt ie al snel tegen jou programma.. heej jij doet foute dingen, ik laat jou crashen.. voordat je mij laat crashen..

    zoiezo altijd je geheugen checken..

    [edit]
    Een dirty oplossing
    ?? want ??

    maar waarom niet:
    Code:
          F_StringList := TStringList.Create;
          try
            GetBinNames(Printer, F_StringList);
            ComboBox_PaperBins.Items.Assign(F_StringList);
            ComboBox_PaperBins.ItemIndex := GetIndexOfBin(ComboBox_PaperBins.Items, F_PrinterInfoRecord.PaperBin);
          finally
            F_StringList.Free;
          end;
    [/edit]

  5. #5
    Supports INLDelphiMember Johan Stokking's Avatar
    Join Date
    Sep 2003
    Location
    Assen
    Posts
    649
    Die laatste code is wat ik bedoelde met "Altijd beter is destructors op hetzelfde niveau zetten als de constructor.".

    Ik vind het niet netjes (dirty) als binnen een procedure FreeAndNil aangeroepen wordt op een onlogische plek zoals, in dit geval, op een ander niveau als de constructor.

    Het verbaast mij overigens dat andere Windows versies geen access violation geven op een dergelijk punt.

  6. #6
    Nog 3 maanden student :)
    Join Date
    Oct 2003
    Location
    Sittard
    Posts
    491
    maar waarom doe je dan wel zeggen dat ie het zo kan doen?

    hij heeft dat dus nu gebruikt, want dat werkte dus voor hem.. en dan blijft hij het fout doen..

    beetje jammer dat je dan een dirty oplossing geeft terwijl de normale nette oplossing net zo weinig aanpassen is..

  7. #7
    Supports INLDelphiMember Johan Stokking's Avatar
    Join Date
    Sep 2003
    Location
    Assen
    Posts
    649
    FreeAndNil gebruiken is niet fout. Ik geef aan dat het een dirty oplossing is en dat is impliciet afraden. De keus is aan hem of hij de dirty oplossing gebruikt of niet. Maar inderdaad, het is beter meteen een perfecte oplossing te geven dan een iets minder goede. Hoe weet je dat hij FreeAndNil heeft toegepast trouwens? Ik maak uit zijn antwoord op dat hij de laatst genoemde methode (constructor/destructor op gelijk niveau) gebruikt heeft.

  8. #8
    Nog 3 maanden student :)
    Join Date
    Oct 2003
    Location
    Sittard
    Posts
    491
    Zo heb ik het dus ook maar opgelost. Vreemd is wel dat het gewoon onder XP geen probleem geeft.
    uit die zin nam ik aan dat ie:
    1. Zo makkelijk mogelijk heeft gedaan en jou FreeAndNil heeft gecopieerd
    2. Het voorgoed neemt dat het eigenlijk vies (maar eigenlijk gewoon nog steeds fout) is

  9. #9
    Senior Member Lodewijk's Avatar
    Join Date
    Apr 2004
    Location
    Netherlands
    Posts
    1,934
    if Assigned(whatever) then whatever.free?

  10. #10
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Het verschil kan hem er al in zitten in minder/geen/meer/andere printers geinstalleerd op de win2003 bak

    Ook als er b.v. een exceptie in het eerste statement (f_...) komt, dan krijg je een onterechte free.

  11. #11
    (Mani as TMember).Post Mani's Avatar
    Join Date
    Aug 2002
    Location
    Het hoge noorden
    Posts
    563
    Ik heb dus gekozen voor de nette oplossing:
    "destructors op hetzelfde niveau zetten als de constructor"

    De eerste versie van het programma stamt nog uit 1997 toen win95 nog HOT was en Delphi3 (volgens mij) mijn tool was. Toen kon alles nog in windows en was mijn programmeerkennis een stuk minder.
    Het hele programma is na die tijd flink omgebouwd maar bepaalde units heb ik gewoon overgenomen en fouten komen naar boven als situaties wijzigen.

    Bij Citrix op NT4 zal het ongetwijfeld goed gaan maar Win2003 server is gewoon erg streng!

    Bij volgende code verbeterinig zal ik de "nette" oplossing dan ook doorvoeren.

  12. #12
    Senior Member PsychoMark's Avatar
    Join Date
    Nov 2001
    Location
    Raamsdonksveer
    Posts
    10,269
    Quote Originally Posted by Lodyx
    if Assigned(whatever) then whatever.free?
    Het probleem is dus dat whatever in dit geval nog een waarde heeft; hetzij van een vorige .Free (zonder := nil / FreeAndNil), hetzij omdat het een lokale variabele is (object/globale variabelen worden wel eerst op nil gezet). Zie ook deze uitleg over waarom FreeAndNil zo prettig is...

    Op zich is het dus geen punt om altijd Free/FreeAndNil aan te roepen aan het einde, ook al staat de constructor niet op hetzelfde niveau (alhoewel ik dat ook wel het netste vindt), mits je vantevoren er wel voor zorgt dat de variabele inderdaad nil is...
    Qui custodiet ipsos custodes

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •