Извращённая CreateWindowEx в Delphi?

Тема в разделе "WASM.BEGINNERS", создана пользователем RideX, 3 ноя 2005.

  1. RideX

    RideX New Member

    Публикаций:
    0
    Регистрация:
    18 авг 2004
    Сообщения:
    6
    В Delphi, в файле Windows.pas, ф-ция CreateWindowExA описана так:
    Код (Text):
    1.  
    2. function CreateWindowExA(dwExStyle: DWORD; lpClassName: PAnsiChar;
    3.   lpWindowName: PAnsiChar; dwStyle: DWORD; X, Y, nWidth, nHeight: Integer;
    4.   hWndParent: HWND; hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND;
    5. var
    6.   FPUCW: Word;
    7. begin
    8.   FPUCW := Get8087CW;
    9.   Result := _CreateWindowExA(dwExStyle, lpClassName, lpWindowName, dwStyle,
    10.     X, Y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
    11.   Set8087CW(FPUCW);
    12. end;
    13. --
    14. function Get8087CW: Word;
    15. asm
    16.         PUSH    0
    17.         FNSTCW  [ESP].Word
    18.         POP     EAX
    19. end;
    20.  
    21. procedure Set8087CW(NewCW: Word);
    22. begin
    23.   Default8087CW := NewCW;
    24.   asm
    25.         FNCLEX  // don't raise pending exceptions enabled by the new flags
    26. {$IFDEF PIC}
    27.         MOV     EAX,[EBX].OFFSET Default8087CW
    28.         FLDCW   [EAX]
    29. {$ELSE}
    30.         FLDCW   Default8087CW
    31. {$ENDIF}
    32.   end;
    33. end;
    34.  




    Зачем и для чего это так сделано?
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Да фиг его знает ;) Это наверное в 7.0 наворотили, т.к. раньше этого не было. И винда вроде как FPU CW не изменяет. Поэтому возможно это для совместимости с линухом сделано, если он изменяет FPU CW при создании окна ???
     
  3. RideX

    RideX New Member

    Публикаций:
    0
    Регистрация:
    18 авг 2004
    Сообщения:
    6
    Точно, это Delphi 7.0 :) Наткнулся случайно, когда в asm-вставке это не сработало:
    Код (Text):
    1.  
    2. push 0
    3. push hInstance
    4. push 0
    5. push 0
    6. push CW_USEDEFAULT
    7. push CW_USEDEFAULT
    8. push CW_USEDEFAULT
    9. push CW_USEDEFAULT
    10. push WS_OVERLAPPEDWINDOW
    11. push dword ptr[lpWindowName]
    12. push dword ptr[lpClassName]
    13. push 0
    14. call CreateWindowExA
    15. mov hMainWnd,eax
    16.  


    а в HLL-виде всё было нормально:
    Код (Text):
    1.  
    2. hMainWnd := CreateWindowEx(0, lpClassName, lpWindowName, OVERLAPPEDWINDOW,
    3.             CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
    4.             0, 0, hInstance, nil);
    5.  


    Ага, FPU CW не изменяется, как в линухе не знаю - нет возможности посмотреть %)