Tak jsem na to přišel. Chyba byla v 64 bitové verzi dll ovladačů od National instrument. Po jejím zavoláním mi volaný COM objekt přepisoval paměť, ale nevytvářela nikde žádnou výjimku. Zajímavé je, že problémy to začalo dělat až toto pondělí a to pouze na 1 PC.
Naštěstí mají Delphi remote debugging, díky čemuž máte tuto chybu šanci odhalit.
Léta jsem měl tuto aplikaci pouze 32 bitovou, 64 bitovou teprve od letošního května, přičemž ty ovladače byly z roku 2022.
Předpokládám, že to přepisuje v 64 bitech paměť i na ostatních PC, ale asi přepíše někde něco jiného.
ako si na to prisiel?
Nejdřív jsem provedl pro jistotu refaktoring pomocí "MMX" - rada od Radka Červinky - ještě jednou moc děkuji Radku, je to vynikající nástroj.
Myslel jsem, že chyba je v mém kódu - kde taky jinde
Začal jsem kontrolovat volání Win API, zda-li tam nemám jako návratová proměnnou místo 64 bit někde jen proměnnou velikostí 32 bit.
Typický případ je volání funkce "Winapi.Windows.CreateFile()" - zde musí být THandlem, což je NativeUInt. Jednou jsem měl natvrdo "Cardinal" a hned byl problém. Ale tady se mi výjimka generovala v mém kódu, tak se dala najít jednoduše.
Tady bylo vše ok, ale pro jistotu jsem v celé aplikaci zrušil typ "Byte" a nahradil jej 32 bit Integerem (kromě konstant, tam to fakt nehrozí).
Ale pořád to nepomohlo, evidentně byl problém někde jinde.
Mám nastavaní aplikace uloženo v "ini" souboru - nemohu zapisovat do registrů.
Je to celá sestava měřích přístrojů a teplotní komory, ovládané něco přes USB, RS 232 a GPIB.
Zkusil jsem vše vymazat a přidávat jednotlivé klíče. Jednotlivý klíč znamená použitý přístroj. A když jsem zadal Usb Gpib modul Keysight, tak to lehlo.
Trasoval jsem to dál, protože výjimku mi to v mém kódu nikde negenerovalo. Zkusil jsem pak odkomentovat metodu, kde si pomocí COM objektu v knihovně "GlobMgr.dll" zjišťuji adresu Usb GPIB modulu a když jsem to vypnul, tak vše fungovalo jak má.
Problém je v tom, že tu adresu toho Usb GPIB modulu potřebuji, bez ní nemohu ovládat některé přístroje, co mám na sběrnici GPIB.
Pak jsem si stáhnul nejnovější ovladače pro tento modul a aplikace opět bez problémů fungovala.
A pro jistotu jsem posunul generování třídy zajišťující tuto operaci o kousek dál v programu. Byla na úplném začátku v při vytváření main formu.
Teď, kdyby opět nastal stejný případ, tak se to "kousne" s info oknem "Inicializace přístrojů" a ne hned při generování main formu.
Tohle si zavedu i u ostaních měřících aplikací. Prostě se nikdy na nic nespoléhat