Resetarea 8087CW în C ++ cauzând excepție în aplicația .NET

Lucrez cu o aplicație .NET 3.5 în C# care cheamă regulat un cod C ++. Am observat că apelarea în C ++ duce uneori la o operație aritmetică "Overflow sau underflow" atunci când am mouse-ul peste un Infragistics UltraGrid care are o listă dropdown. Am descoperit că acest lucru se întâmplă numai atunci când codurile C ++ fac următoarele:

Word SavedWord = Default8087CW;
Set8087CW(0x133f);//Disable all fpu exceptions

...

Set8087CW(SavedWord);

Dacă am comenta ultima linie, nu mai primesc eroarea în aplicația .NET. Nu am observat alte efecte secundare în restul cererii. Ca o reparație rapidă, aș dori să părăsesc această linie comentată. Care sunt consecințele dezactivării excepțiilor FPU și nu resetarea cuvântului de control?

0
@ 500-InternalServerError, cum aș verifica asta? Tot ce am putut confirma este că valoarea Default8087CW la ieșirea din codul C ++ este aceeași ca la intrare.
adăugat autor Everett, sursa
Din ceea ce pot spune Default8087CW este echivalentul lui Get8087CW (). Get8087CW() nu există de fapt în această versiune de C ++. Referință: docs.embarcadero.com/products/ rad_studio/delphiAndcpp2009/& hellip;
adăugat autor Everett, sursa
Valoarea implicită a Default8087CW este valoarea reală la intrarea în funcția C ++ sau este ceea ce crede că C ++ RTL este implicit? Cele două pot diferi.
adăugat autor 500 - Internal Server Error, sursa
Nu sunt familiarizat cu modul în care se poate face acest lucru în C ++. Nu există o funcție corespunzătoare Get8087CW ()?
adăugat autor 500 - Internal Server Error, sursa

2 răspunsuri

După testarea pe alte mașini, se pare că comentarea Set8087CW (SavedWord); linia fixează problema numai pe mașina mea. Se pare că există o eroare în versiunea mea de Infragistics (8.2.20082.2204). Înapoi la 8.2.20082.1000 a rezolvat problema.

0
adăugat
Acesta este un post foarte interesant, @HansPassant. Am revenit la noua versiune a Infragistics și am implementat soluția menționată acolo. Pare să lucreze. Doriți să adăugați un răspuns cu o referință la postarea respectivă?
adăugat autor Everett, sursa
Hmm, îndoielnic. Există un lot de cod care nu este compatibil cu modificările pe care timpul de execuție Borland le face cu cuvântul de control FPU. Orice cod .NET va fi vulnerabil. Trebuie să fi trecut deja într-un astfel de cod, având în vedere că ați găsit deja acest fragment în programul dvs. Iată un alt exemplu: stackoverflow.com/a/8357646/17034
adăugat autor Hans Passant, sursa

Soluția se găsește aici: " StackOverFlowException în wpf atunci când metoda de apel din biblioteca C ++ ".

Mulțumită lui Hans Passant pentru asta.

0
adăugat