Не могли бы вы помочь мне понять, что происходит с FPU Control Word в моем приложении Delphi на платформе Win32.
Когда мы создаем новое приложение VCL, управляющее слово устанавливается до 1372 часов. Это первое, что я не понимаю, почему это 1372h вместо 1332h, который является Default8087CW
, определенным в System
.
Разница между этими двумя:
1001101110010 //1372h
1001100110010 //1332h
- это 6-й бит, который согласно документации зарезервирован или не используется.
Второй вопрос касается CreateOleObject
.
function CreateOleObject(const ClassName: string): IDispatch;
var
ClassID: TCLSID;
begin
try
ClassID := ProgIDToClassID(ClassName);
{$IFDEF CPUX86}
try
Set8087CW( Default8087CW or $08);
{$ENDIF CPUX86}
OleCheck(CoCreateInstance(ClassID, nil, CLSCTX_INPROC_SERVER or
CLSCTX_LOCAL_SERVER, IDispatch, Result));
{$IFDEF CPUX86}
finally
Reset8087CW;
end;
{$ENDIF CPUX86}
except
on E: EOleSysError do
raise EOleSysError.Create(Format('%s, ProgID: "%s"',[E.Message, ClassName]),E.ErrorCode,0) { Do not localize }
end;
end;
Вышеуказанная функция меняет управляющее слово на 137Ah
, поэтому он включает 3-й бит (Overflow Mask). Я не понимаю, почему он вызывает Reset8087CW
после, вместо восстановления состояния слова, которое было перед входом в функцию?