В Delphi, в файле Windows.pas, ф-ция CreateWindowExA описана так: Код (Text): function CreateWindowExA(dwExStyle: DWORD; lpClassName: PAnsiChar; lpWindowName: PAnsiChar; dwStyle: DWORD; X, Y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND; var FPUCW: Word; begin FPUCW := Get8087CW; Result := _CreateWindowExA(dwExStyle, lpClassName, lpWindowName, dwStyle, X, Y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); Set8087CW(FPUCW); end; -- function Get8087CW: Word; asm PUSH 0 FNSTCW [ESP].Word POP EAX end; procedure Set8087CW(NewCW: Word); begin Default8087CW := NewCW; asm FNCLEX // don't raise pending exceptions enabled by the new flags {$IFDEF PIC} MOV EAX,[EBX].OFFSET Default8087CW FLDCW [EAX] {$ELSE} FLDCW Default8087CW {$ENDIF} end; end; Зачем и для чего это так сделано?
Да фиг его знает Это наверное в 7.0 наворотили, т.к. раньше этого не было. И винда вроде как FPU CW не изменяет. Поэтому возможно это для совместимости с линухом сделано, если он изменяет FPU CW при создании окна ???
Точно, это Delphi 7.0 Наткнулся случайно, когда в asm-вставке это не сработало: Код (Text): push 0 push hInstance push 0 push 0 push CW_USEDEFAULT push CW_USEDEFAULT push CW_USEDEFAULT push CW_USEDEFAULT push WS_OVERLAPPEDWINDOW push dword ptr[lpWindowName] push dword ptr[lpClassName] push 0 call CreateWindowExA mov hMainWnd,eax а в HLL-виде всё было нормально: Код (Text): hMainWnd := CreateWindowEx(0, lpClassName, lpWindowName, OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, nil); Ага, FPU CW не изменяется, как в линухе не знаю - нет возможности посмотреть %)