CALLBACK
От: Elf  
Дата: 19.12.02 19:54
Оценка:
Здравствуйте!

Может, глупый вопрос, но что есть CALLBACK функция?

И как пользоваться SetWindowsHookEx и EnumWindows?
Желательно с примером кода....

Заранее БОЛЬШОЕ спасибо!


Перенесено в WinAPI из С++. ДХ
Re: CALLBACK
От: Алексей Владимирович Миронов Россия  
Дата: 20.12.02 05:03
Оценка:
Здравствуйте, Elf, Вы писали:

Elf>Может, глупый вопрос, но что есть CALLBACK функция?


По-русски это "функция обратного вызова".
Это ваша функция, которую система может вызвать, чтобы, например, сообщить Вам о некотором событии. Типичный пример — оконная функция — она получает уведомления о событиях, относящихся к данному окну.

Elf>И как пользоваться SetWindowsHookEx и EnumWindows?


Лучше напишу про EnumWindows, так короче будет

#include <windows.h>
#include <stdio.h>

/* Вот наша функция обратного вызова */
BOOL CALLBACK MyEnumProc ( HWND hwnd, LPARAM lParam ) 
{
  char title[1024]; /* Для большинства окон должно хватить */

  GetWindowText ( hwnd, title, sizeof (title) );
  printf ( "%d: %s\n", hwnd, title );
  return TRUE; /* Продолжить перечисление */
}

void main ( void )
{
  EnumWindows ( (WNDENUMPROC)MyEnumProc, (LPARAM)NULL );
}


Результатом запуска программы будет список окон верхнего уровня.

Главные требования для подобных функций:

1) Наличие модификатора CALLBACK;
2) Совпадение количества и типов параметров и возвращаемого значения.

Обратите внимание, что экспортировать функцию не обязательно, Windows все равно сможет вызвать функцию, даже если Вы объявите ее static.
Re[2]: CALLBACK
От: LaFlour Австралия blog: http://spaces.live.com/laflour
Дата: 20.12.02 05:53
Оценка:
Здравствуйте, Алексей Владимирович Миронов, Вы писали:

АВМ>Здравствуйте, Elf, Вы писали:


Elf>>Может, глупый вопрос, но что есть CALLBACK функция?

АВМ>По-русски это "функция обратного вызова".
АВМ>Это ваша функция, которую система может вызвать, чтобы, например, сообщить Вам о некотором событии. Типичный пример — оконная функция — она получает уведомления

А есть ли ограничение на CALLBACK?
Т.е. все ли функции можно сделать callback или нет?
От чего это зависит?
... << RSDN@Home 1.0 beta 3 >>
Re[3]: CALLBACK
От: Patalog Россия  
Дата: 20.12.02 07:04
Оценка:
Здравствуйте, LaFlour, Вы писали:

LF>А есть ли ограничение на CALLBACK?

LF>Т.е. все ли функции можно сделать callback или нет?
LF>От чего это зависит?

#define CALLBACK __stdcall


Исходя из етого ты не сможешь сделать callback функции с переменным числом параметров и thiscall (функции — члены)
Почетный кавалер ордена Совка.
Re[4]: CALLBACK
От: Алексей Владимирович Миронов Россия  
Дата: 20.12.02 07:45
Оценка:
Здравствуйте, Patalog, Вы писали:

LF>>А есть ли ограничение на CALLBACK?

LF>>Т.е. все ли функции можно сделать callback или нет?
LF>>От чего это зависит?

P>

P>#define CALLBACK __stdcall


P>Исходя из етого ты не сможешь сделать callback функции с переменным числом параметров и thiscall (функции — члены)


Согласен с маленьким уточнением: функции обратного вызова, как это явствует из названия, вызываются "внешними силами", например операционной системой (или C-рантаймом). Поэтому имеет смысл делать CALLBACK только те функции, которые а) делают то, что от них ожидает система, б) принимают правильное количество аргументов правильных типов, в) возвращают результат правильного типа. Только так. Шаг вправо/влево карается. Пример: оконная процедура, не передающая управление DefWindowProc, скорее всего, "повесит" соответствующее окно.

Вообще, единственное, что имеет смысл менять в заголовке CALLBACK-функции, это имя. Все остальное — методом Copy/Paste.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.