Конференция "WinAPI" » SendMessage(WM_MDIMAXIMIZE), несоотвествие типов Integer
 
  • Дмитрий Белькевич (17.12.10 09:45) [0]
    С включенной проверкой границ иногда появляется Range Check Error на SendMessage.

    Делаю так:


    SendMessage(Application.MainForm.ClientHandle, WM_MDIMAXIMIZE, Form14.Handle, 0);



    Особенность в том, что у SendMessage параметр wParam - Integer, а передаётся туда Handle - LongWord. Как это исправить?
  • MBo © (17.12.10 09:55) [1]
    Integer(Form14.Handle) ?
  • Дмитрий Белькевич (17.12.10 09:58) [2]

    > Integer(Form14.Handle) ?


    Это будет нормально работать - в смысле - хэндлы после приведения не 'побьются'?
  • Дмитрий Белькевич (17.12.10 10:01) [3]
    Или там реально преобразований никаких нет - просто Range Check отключится? Нужно, чувствую, ассемблер смотреть...
  • Anatoly Podgoretsky © (17.12.10 11:18) [4]
    > Дмитрий Белькевич  (17.12.2010 09:58:02)  [2]

    Это всего лишь указание, считать что аргумент типа Integer
    Это называется приведение.
  • Anatoly Podgoretsky © (17.12.10 11:20) [5]
    > Дмитрий Белькевич  (17.12.2010 10:01:03)  [3]

    Range Check не отключится, но его значени от MinInt до MaxInt единственная
    проблема может быть с FFFFFFFF, а может и не быть, но не из-за Range Check,
    а из-аз WinApi
  • Игорь Шевченко © (17.12.10 11:43) [6]

    > Особенность в том, что у SendMessage параметр wParam - Integer,
    >  а передаётся туда Handle - LongWord. Как это исправить?
    >


    че ?
  • Дмитрий Белькевич (17.12.10 13:39) [7]
    >че ?

    wParam: WPARAM, WPARAM = INT_PTR, INT_PTR = Integer
    Handle: HWND, HWND = type LongWord
  • Дмитрий Белькевич (17.12.10 13:42) [8]

    > Это называется приведение.


    В общем случае - приведение никогда никаких преобразований не делает? Или зависит?
  • Игорь Шевченко © (17.12.10 14:25) [9]

    > wParam: WPARAM, WPARAM = INT_PTR, INT_PTR = Integer
    > Handle: HWND, HWND = type LongWord


    function SendMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;

     UINT = LongWord;
     LPARAM = Longint;
     WPARAM = Longint;
     LRESULT = Longint;
     HWND = type LongWord;


    > Это будет нормально работать - в смысле - хэндлы после приведения
    > не 'побьются'?


    Приведение к 4-байтовому числу со знаком 4-х байтного числа без знака не приводит ни к каким изменениям исходного числа (и результата тоже).

    Приведение к параметра типу не влияет на исходное значение вообще никак.
    Не знаю, как с этим в .Net дело обстоит, но, я сильно надеюсь, что на Delphi для .Net ты не пишешь.
  • Anatoly Podgoretsky © (17.12.10 14:49) [10]
    > Дмитрий Белькевич  (17.12.2010 13:42:08)  [8]

    Никогда, надо точно знать, что приведение, а не преобразование или функция,
    синтаксис то одинаков
  • Leonid Troyanovsky © (17.12.10 19:17) [11]

    > Дмитрий Белькевич   (17.12.10 09:45)  

    > С включенной проверкой границ иногда появляется Range Check
    > Error на SendMessage.

    Похоже, что проблем не в этом. Что-то вроде "наведенной" ошибки.
    Т.е., надо смотреть раньше вызова.

    --
    Regards, LVT.
  • Дмитрий Белькевич (17.12.10 21:04) [12]

    > Игорь Шевченко ©   (17.12.10 14:25) [9]


    Ну вот - в SendMessage в параметре 'wParam' передаю хэндл окна, который HWND - каша в типах же.


    > Похоже, что проблем не в этом. Что-то вроде "наведенной"
    > ошибки.


    Видел ошибку один раз, локально, почти сразу после запуска программы. Никаких наводок вроде бы не было.


    > Никогда, надо точно знать, что приведение, а не преобразование
    > или функция, синтаксис то одинаков


    Понятно.
  • Игорь Шевченко © (17.12.10 22:49) [13]

    > Ну вот - в SendMessage в параметре 'wParam' передаю хэндл
    > окна, который HWND - каша в типах же.


    SendMessage это абсолютно пофиг. Почитай MSDN
  • Rouse_ © (17.12.10 23:50) [14]

    > Дмитрий Белькевич   (17.12.10 21:04) [12]
    > каша в типах же.

    Нет - с типами все правильно...
  • Юрий Зотов © (18.12.10 18:44) [15]
    > Дмитрий Белькевич   (17.12.10 21:04) [12]

    Передаются 4 байта. Так, как есть, без всяких преобразований. Трактовать их на стороне приемника сообщения можно как угодно - хоть знаковое целое, хоть беззнаковое, хоть любой указатель, хоть что угодно еще. А при отправке сообщения надо просто привести тип, тем самым указав компилятору, что программист знает, что делает и не надо возмущаться.

    Паскаль тем и хорош, что страхует программиста от случайных ошибок, но при этом нисколько не ограничивает его возможностей.
  • Дмитрий Белькевич (20.12.10 09:13) [16]
    Спасибо, всё понятно.
 
Конференция "WinAPI" » SendMessage(WM_MDIMAXIMIZE), несоотвествие типов Integer
Есть новые Нет новых   [134431   +11][b:0][p:0.001]