Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как запихнуть LongWord в LongInt ? [D7, XP]


ANB ©   (2006-03-02 14:36:00) 

Имею объявление функции :
function SendMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;

Мне нужно передать в lParam хендл окна, а оно LongWord, т.е. может быть длиннее 2147483648. Такое число в LongInt не лезет. LParam объявлено как LongInt.

И таки я нарвался на ошибку :

При вызове :
  SendMessage(GetDesktopWindow(), WM_SYSCOMMAND, SC_HOTKEY, hMainWindow); // Один из способов поднять окно на верхний план.
если в hMainWindow число 2147483648, происходит ошибка Range Check Error. Как ее забороть ?


ANB   (2006-03-02 15:15:00) [1]

Я был не прав - приведение работает.


ANB   (2006-03-02 15:13:00) [2]


> Не совсем понятно, почему не подошло [2] или [3].

Хотя ща попробую . . .


begin...end   (2006-03-02 15:12:00) [3]

> ANB ©   (02.03.06 15:06) [4]

Не совсем понятно, почему не подошло [2] или [3].


ANB   (2006-03-02 15:12:00) [4]


> Integer(DwordVar)

Думаю, простым приведением вряд ли обойдемся, т.к. делфа сама неявно должна была приводить и словила ошибку.


umbra   (2006-03-02 15:09:00) [5]

отключить Range Checking для вызова этой функции, Т.е. перед вызовом написать {$R-}, а после него {$R+}


ANB   (2006-03-02 15:06:00) [6]

Так. Поясняю.
1. Реальный хендл вышел за maxint.
2.Отключать Range Checking неохота, т.к. ошибка может вылезти в другом месте, а пропускать их как то нехочется. Софт то еще дописывается.
3. Задачу решил, правда некузяво, так :

Объявил в интерфейсе

function SendMessageDWord(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: DWord): LRESULT; stdcall;

В реализации

function SendMessageDWord; external user32 name 'SendMessageA';

Ну и в коде заменил вызов на новую функцию. Ошибка больше не лезет.

Если кто знает решение лучше - плиз, подскажите.


MBo   (2006-03-02 15:00:00) [7]

просто привести тип не поможет?
Integer(DwordVar)
однако странно, что хэндл окна может вылезать за MaxInt


begin...end   (2006-03-02 14:59:00) [8]

LPARAM(hMainWindow ). Или отключить Range Checking.


umbra   (2006-03-02 14:56:00) [9]

а вообще реально иметь столько окон в системе?
а по сабжу - в свойствах проекта на закладке Compilerв группе Runtime errorsубрать галку Range Checking


Наверх

Титульная страница Поиск, карта сайта Написать письмо