-
С включенной проверкой границ иногда появляется Range Check Error на SendMessage. Делаю так:
SendMessage(Application.MainForm.ClientHandle, WM_MDIMAXIMIZE, Form14.Handle, 0);
Особенность в том, что у SendMessage параметр wParam - Integer, а передаётся туда Handle - LongWord. Как это исправить?
-
Integer(Form14.Handle) ?
-
> Integer(Form14.Handle) ?
Это будет нормально работать - в смысле - хэндлы после приведения не 'побьются'?
-
Или там реально преобразований никаких нет - просто Range Check отключится? Нужно, чувствую, ассемблер смотреть...
-
> Дмитрий Белькевич (17.12.2010 09:58:02) [2]
Это всего лишь указание, считать что аргумент типа Integer Это называется приведение.
-
> Дмитрий Белькевич (17.12.2010 10:01:03) [3]
Range Check не отключится, но его значени от MinInt до MaxInt единственная проблема может быть с FFFFFFFF, а может и не быть, но не из-за Range Check, а из-аз WinApi
-
> Особенность в том, что у SendMessage параметр wParam - Integer, > а передаётся туда Handle - LongWord. Как это исправить? >
че ?
-
>че ?
wParam: WPARAM, WPARAM = INT_PTR, INT_PTR = Integer Handle: HWND, HWND = type LongWord
-
> Это называется приведение.
В общем случае - приведение никогда никаких преобразований не делает? Или зависит?
-
> 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 ты не пишешь.
-
> Дмитрий Белькевич (17.12.2010 13:42:08) [8]
Никогда, надо точно знать, что приведение, а не преобразование или функция, синтаксис то одинаков
-
> Дмитрий Белькевич (17.12.10 09:45)
> С включенной проверкой границ иногда появляется Range Check > Error на SendMessage.
Похоже, что проблем не в этом. Что-то вроде "наведенной" ошибки. Т.е., надо смотреть раньше вызова.
-- Regards, LVT.
-
> Игорь Шевченко © (17.12.10 14:25) [9]
Ну вот - в SendMessage в параметре 'wParam' передаю хэндл окна, который HWND - каша в типах же.
> Похоже, что проблем не в этом. Что-то вроде "наведенной" > ошибки.
Видел ошибку один раз, локально, почти сразу после запуска программы. Никаких наводок вроде бы не было.
> Никогда, надо точно знать, что приведение, а не преобразование > или функция, синтаксис то одинаков
Понятно.
-
> Ну вот - в SendMessage в параметре 'wParam' передаю хэндл > окна, который HWND - каша в типах же.
SendMessage это абсолютно пофиг. Почитай MSDN
-
> Дмитрий Белькевич (17.12.10 21:04) [12] > каша в типах же.
Нет - с типами все правильно...
-
> Дмитрий Белькевич (17.12.10 21:04) [12]
Передаются 4 байта. Так, как есть, без всяких преобразований. Трактовать их на стороне приемника сообщения можно как угодно - хоть знаковое целое, хоть беззнаковое, хоть любой указатель, хоть что угодно еще. А при отправке сообщения надо просто привести тип, тем самым указав компилятору, что программист знает, что делает и не надо возмущаться.
Паскаль тем и хорош, что страхует программиста от случайных ошибок, но при этом нисколько не ограничивает его возможностей.
-
Спасибо, всё понятно.
|