Таймеры и очередь таймеров в WinApi
Модераторы: Duncon, Hawk, Romeo, Eugie
Нашел в Рихтере потом посмотрел в МСДН как оказалось не все так просто, ни от туда ни от туда примеры не работают
//--- Кому теперь верить :twisted: ---//
CreateTimerQueueTimer(
// указатель на хендл таймера
&hTimerQTimer,
// хендл очереди таймеров
NULL,
// функция обратного вызова
MsgBoxTimeout,
// параметр для функции обратного вызова
NULL,
// время задержки перед первым вызовом в милисекундах
100,
// период в милисекундах
100,
// флаги
0
);
: error C2065: 'CreateTimerQueueTimer' : undeclared identifier
Думаю не я один столкнулся с такой проблемой
Помогите, очень надо, заранее благодарен всем откликнувшимся
//--- Кому теперь верить :twisted: ---//
CreateTimerQueueTimer(
// указатель на хендл таймера
&hTimerQTimer,
// хендл очереди таймеров
NULL,
// функция обратного вызова
MsgBoxTimeout,
// параметр для функции обратного вызова
NULL,
// время задержки перед первым вызовом в милисекундах
100,
// период в милисекундах
100,
// флаги
0
);
: error C2065: 'CreateTimerQueueTimer' : undeclared identifier
Думаю не я один столкнулся с такой проблемой
Помогите, очень надо, заранее благодарен всем откликнувшимся
Нужно свежее SDK, ктонить знает где его достать ? Для 6-ки ?
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Носферату, нужно было внимательнее читать MSDN:
Client: Included in Windows XP and Windows 2000 Professional.
Server: Included in Windows Server 2003 and Windows 2000 Server.
Header: Declared in Winbase.h; include Windows.h.
Library: Use Kernel32.lib.
Platform SDK Release: February 2003
Короче, если у тебя нету SDK от февраля прошлого года, то единственный выход - динамическая загрузка kernel32.dll с помощью LoadLibrary и получение адреса процедуры с помощью GetProcAddress.
P.S. Обязательно проверяй результат работы последней функции. Если система не Window 2000 или XP, то всё красиво упадёт :-)
Client: Included in Windows XP and Windows 2000 Professional.
Server: Included in Windows Server 2003 and Windows 2000 Server.
Header: Declared in Winbase.h; include Windows.h.
Library: Use Kernel32.lib.
Platform SDK Release: February 2003
Короче, если у тебя нету SDK от февраля прошлого года, то единственный выход - динамическая загрузка kernel32.dll с помощью LoadLibrary и получение адреса процедуры с помощью GetProcAddress.
P.S. Обязательно проверяй результат работы последней функции. Если система не Window 2000 или XP, то всё красиво упадёт :-)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Вот примерно так -
Код: Выделить всё
typedef BOOL (WINAPI *CreateTimerQueueTimerT)( PHANDLE phNewTimer , HANDLE TimerQueue , WAITORTIMERCALLBACKFUNC Callback , PVOID Parameter , DWORD DueTime , DWORD Period , ULONG Flags );
typedef HANDLE (*CreateTimerQueueT)(VOID);
VOID CALLBACK WaitOrTimerCallback(
PVOID lpParameter, // thread data
BOOLEAN TimerOrWaitFired // reason
)
{
return;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
HACCEL hAccelTable;
// Create a multishot 1 second timer that begins firing after 1 second.
HANDLE hTimerQ;
HANDLE hTimerQTimer;
HMODULE hMod = LoadLibrary("kernel32.dll");
CreateTimerQueueTimerT CreateTimerQueueTimer = (CreateTimerQueueTimerT)::GetProcAddress(hMod, "CreateTimerQueueTimer");
CreateTimerQueueT CreateTimerQueue = (CreateTimerQueueT)::GetProcAddress(hMod, "CreateTimerQueue");
FreeLibrary(hMod);
if (!CreateTimerQueueTimer || !CreateTimerQueue)
{
return 0;
}
hTimerQ = CreateTimerQueue();
BOOL bRes = CreateTimerQueueTimer(
// CreateTimerQueueTimer(
&hTimerQTimer,
hTimerQ,
WaitOrTimerCallback/*MsgBoxTimeout*/,
NULL,
100,
100,
WT_EXECUTEINIOTHREAD
);
return 0;
}
спасибо за помощь ...
Только меня вот что не радует, наколько это красиво, конечно вопрос риторический, но все-таки
Только меня вот что не радует, наколько это красиво, конечно вопрос риторический, но все-таки
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Это классический приём. О красоте в таких случаях распространяться не принято. Кстати, не забудь для LoadLibrary сделать потом FreeLibrary.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Да насчет FreeLiobrary a не совсем корректно написал, но работать будет нормльно т.к. kernel32.dll всегда подгружается к процесу. так, что лучше наверно заменить на такой вызов -
Тогда и FreeLibrary не понадобится
А насчет красивости - очень даже красиво
Код: Выделить всё
HMODULE hMod = GetModuleHandle("kernel32.dll");
CreateTimerQueueTimerT CreateTimerQueueTimer = (CreateTimerQueueTimerT)::GetProcAddress(hMod, "CreateTimerQueueTimer");
CreateTimerQueueT CreateTimerQueue = (CreateTimerQueueT)::GetProcAddress(hMod, "CreateTimerQueue");
if (!CreateTimerQueueTimer || !CreateTimerQueue)
{
return 0;
}
А насчет красивости - очень даже красиво
Спасибо большое ...
А кстати сегодня случайно не день программиста ?
А кстати сегодня случайно не день программиста ?
Насчет дня, на одном форуме нашел хорошую фразу -
Хм... а зачем?
Программеры итак в основном каждый день бухают -)