InitializeCriticalSection(FLock) hiba - ntdll.dll Delphi7

InitializeCriticalSection(FLock) hiba - ntdll.dll Delphi7
2019-01-30T15:32:56+01:00
2019-01-31T13:03:58+01:00
2022-12-05T19:15:40+01:00
PizzaProgram
begin
  inherited create;
  InitializeCriticalSection(FLock); // A.V. error!

Találkozott bárki olyan esettel, amikor ez az egyszerű függvény Access Violation hibát dob? Mi okozhatja?
- Ez egy "alap osztály", amit örököltetek (Thread-Safe tömbkezeléshez)
- A programban vannak más class-ok is, ott gond nélkül lefut.
- a Windows.GetLastError nem ad semmi használható információt.
Köszönöm a válaszokat!
Mutasd a teljes hozzászólást!
Egy debugger valószínűleg többet tud neked segíteni, mint amit mi látatlanban találgatni tudunk. Az várható, hogy a GetLastError nem fog visszaadni semmit, mivel a kód még azelőtt védelmi hibára fut, hogy az InitializeCriticalSection be tudná állítani a hibakódot.

Alapvetően azért lehet védelmi hiba az InitializeCriticalSection-ben, ami miatt a saját kódodban is szokott lenni: null pointert adsz neki át, vagy érvénytelen pointert adsz neki. (Azt az esetet kizárhatjuk, hogy az InitializeCriticalSection kódja bugos, és védelmi hibát okoz érvényes paraméterekkel. Bár nem lehetetlen, de nagyon valószínűtlen.) Az érvénytelen pointer úgy is létrejöhetett, hogy valami más írta túl a saját memóriaterületét, és felülírta ezt a mezőt. Egy debugger legalább annyit meg fog tudni mondani neked, hogy az FLock érvényes-e közvetlenül a hívás előtt.
Mutasd a teljes hozzászólást!

  • Jogos volt a felvetés, valóban nem ad át megfelelő változót a függvény meghívásakor, ezért keletkezik már a Delphi-ben a hiba.
    Tehát a valódi kérdés, hogyhogy nem inicializálódik az "FLock".
    Debugolva azt mutatja, hogy "inaccessible value", ami persze elvileg képtelenség, hiszen előtte lefut az
    inherited Create;

    Több órányi keresgélés után egyetlen ilyen esetről találtam beszámolót:
    Inaccessible field error

    Az illető arról számol be, hogy:

    The last time I got this problem I simply fixed it by copying the code into a new Unit and deleting the old one, so I assumed it had something to do with the precompiled .dcu files.

    Azaz átmásolja egy új UNIT-ba a classt.
    Nos, megpróbáltam mindent, de semmi sem segít. Nyitok egy új Topikot erre.
    https://prog.hu/tudastar/205215-1/inaccessible-value-delphi-7-class-..
    Mutasd a teljes hozzászólást!
  • Mi az a függvény, aminek lefut az inherited Create;  eljárása?
    Az eljárás a fő programban van, vagy a thread szálban?
    Mutasd a teljes hozzászólást!
  • Semmilyen függvény nem fut le, egyszerűen a Class declation -nak a constructorának első sora az kell, hogy legyen, hogy létrejöjjön maga az üres class.

    Simán a fő-szálban fut.
    próbáltam a unit aljára is rakni:
    ....
    initialization
     Tomb_.Create;

    de ugyanaz a végeredmény.

    Mint már írtam:
     - MÁSIK, UGYANILYEN class gond nélkül létrejön. Nem a class deklarációval magával van a baj.
    Tehát ez valamiféle Delphi7 compiler hiba, esetleg valamely csatolt unit-ok zavarnak be.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd