Discussion:
CreateComObject und Set8087CW
(zu alt für eine Antwort)
Sven Lanoster
2017-01-02 20:26:23 UTC
Permalink
Moin, moin.

Ich stöbere grade durch den Quellcode von CreateComObject. Der sieht
aufs Wesentliche gekürzt so aus:

function CreateComObject(const ClassID: TGUID): IUnknown;
begin
try
try
Set8087CW( Default8087CW or $08);
// hier Ole-Zeug
finally
Reset8087CW;
end;
except
//raise
end;
end;

Wobei Set8087CW die globale Variable Default8087CW zuerst einmal mit dem
übergebenen neuen Wert füllt (hier also: Default8087CW or $08).
Reset8087CW stellt dann Default8087CW ein, also immer noch
(Default8087CW or $08).

Das ist doch nicht so gedacht, oder?

Gruß,
Sven.
--
Seltsam? Aber so steht es geschrieben...
Peter Below
2017-01-03 18:24:25 UTC
Permalink
Post by Sven Lanoster
Moin, moin.
Ich stöbere grade durch den Quellcode von CreateComObject. Der sieht
function CreateComObject(const ClassID: TGUID): IUnknown;
begin
try
try
Set8087CW( Default8087CW or $08);
// hier Ole-Zeug
finally
Reset8087CW;
end;
except
//raise
end;
end;
Wobei Set8087CW die globale Variable Default8087CW zuerst einmal mit
dem übergebenen neuen Wert füllt (hier also: Default8087CW or $08).
Reset8087CW stellt dann Default8087CW ein, also immer noch
(Default8087CW or $08).
Das ist doch nicht so gedacht, oder?
Doch, das ist so gedacht. Das Ganze ist eine Absicherung gegen COM
DLLs, die beim Laden das 8087 control word ändern und damit zu
Problemen mit dem Handling von floating point Fehlern etc. in Delphi
Kode führen.
--
Peter Below
TeamB
Sven Lanoster
2017-01-03 20:17:21 UTC
Permalink
Post by Peter Below
Post by Sven Lanoster
Wobei Set8087CW die globale Variable Default8087CW zuerst einmal mit
dem übergebenen neuen Wert füllt (hier also: Default8087CW or $08).
Reset8087CW stellt dann Default8087CW ein, also immer noch
(Default8087CW or $08).
Das ist doch nicht so gedacht, oder?
Doch, das ist so gedacht. Das Ganze ist eine Absicherung gegen COM
DLLs, die beim Laden das 8087 control word ändern und damit zu
Problemen mit dem Handling von floating point Fehlern etc. in Delphi
Kode führen.
Ahh, jetzt. Danke!

Verwirrend finde ich, dass da kein Kommentar im Code ist. Und dass es
offenbar wichtig ist, dass Bit $08 unter allen Umständen maskiert
bleibt. Ich habe zwar neulich in der Intel-Doku nachgesehen, wofür
dieses Bit gut ist, aber ich habs inzwischen wieder verdrängt.

Wird schon seine Richtigkeit haben.

Gruß,
Sven.
--
Seltsam? Aber so steht es geschrieben...
Loading...