Problém Ranorex a Delphi DLL

vložil Radek Červinka 5. prosince 2018 21:58

Minulý týden jsem narazil na problém kdy testovací oddělení začalo hlásit problémy při běhu programu na kterém spolupracuji pod Ranorexem.

Odbočka: Ranorex nedávno získala IDERA, tj. vlastník Embarcadero. Tím rozšířila své portfolio pro vývoj aplikací o další zářez, kompletní seznam je na ideracorp.com a obsahuje kromě Embarcadero další akvizice z nedávné doby jako Sencha, Whole Tomato, Test Rail atd. přičemž některé produkty jsou nyní přibalovány k vyšším edicím Delphi. Mimochodem když se podíváte na ideracorp.com/news, uvidíte, že všechny akvizice jsou až po získání Delphi - celkem velké investice do rozšíření portfolia a celkem ve svižném tempu.

Ale zpět k našemu problému s Ranorexem.

Při testování naší aplikace (32 bit EXE + DLL) pod Ranorexem v nové verzi se začal systém chovat divně a dávat v některých případech nesprávné výsledky. Problém byl, že se problém neprojevil přímočaře, ale až nepřímo tak mne to hned netrklo.

Vím, že používáme v některých případech reálná čísla s velkým rozsahem a protože je mi známo, že při používání Delphi DLL z jiných jazyků může nastat problém v případě, že volaná aplikace mění 8087 Control word, kterým se určuje chování při výpočtu s reálnými čísly a tak jsem se na to zaměřil (problém nastal až po nedávné nové verzi Ranorexu).

Po prozkoumání jsem zjistil, že Ranorex opravdu částečně změnil 8087 Control word (8087CW).

Uvedu příklad (zjišťování je přes System.Get8087CW)

Při běhu bez Ranorexu byl

8087CW = 0000137F -> 0001 0011 0111 1111

S Ranorexem

8087CW = 0000027F -> 0000 0010 0111 1111

Pozorný čtenář si všiml změny na 8 a 12 bitu. Pro mne byl signifikantní bit 8, protože bity 8 a 9 určují přesnost

Precision bits

00 - Single precision (24 bit mantisa)
10 - Double precision (53 bit mantisa)
11 - Extended precision (64 bit mantisa)
01 - reserved

Takže Ranorex snížil přesnost z Extended na Double (což je mimochodem max. přesnost v 64bit, tak třeba to byl ten důvod).

Jako dočasné řešení jsem po vstupu do procedury v DLL nastavil SetPrecisionMode(pmExtended), což je takové zapouzdření pro manipulaci s 8087CW, což není optimální ale funguje to.

Tagy:

Praxe

Komentování ukončeno

Naše nabídka

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy).

love Delphi

O Delphi.cz

Delphi je moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64, Mac OSX, Linux a na iPhone a Android.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Poslední komentáře

Comment RSS

Dle měsíců