Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2010, 03:05   #1
RFbager
Пользователь
 
Регистрация: 30.10.2010
Сообщений: 14
По умолчанию Не работает KillTimer,VC++ 6.0

Пытался реализовать таймер в DLL,все бы было хорошо,если бы еще и работала функция KillTimer.Версия компилятора указа в заголовке.Вот собственно код:
Код:
#include "stdafx.h"
HWND                      hWnd;

void __stdcall someFunc (HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
   //обработка срабатывания таймера, у которого есть своя процедура
	MessageBoxA(0,"Test","Test",0);
}

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		{
			GetProcessExeName(GetCurrentProcessId());
			DWORD dwCurPID = GetCurrentProcessId();
			hWnd = FindWindowA("D3D Window","Имя окна");
                        SetTimer(hWnd,1,7000,someFunc);
                        KillTimer(hWnd,1);
		}
		break;
	}
	return TRUE;
}
Все варианты перечислять не стану,ибо наберется на небольшую книжку(
Вот что получилось из тестов:
1)Дескриптор окна находит правильно.
2)Попытка поместить функцию KillTimer внутрь someFunc результатов не принесла.
3)Попытка сделать второй идентификатор функций SetTimer и KillTimer
как глобальную проинициализированную переменную результатов не принесла.
4)Более того,если ставить KillTimer перед SetTimer,даже в этом случае напрочь отказывается работать((

Перечитал все темы ,которые только смог найти на этом форуме,долго и упорно гуглил,но увы безрезультатно((
RFbager вне форума Ответить с цитированием
Старый 04.12.2010, 11:30   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

как вы определили, что она не работает? что хотите-то сделать?
counter вне форума Ответить с цитированием
Старый 04.12.2010, 14:34   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а что вы хотели сделать?
вы создали таймер и сразу же его убили, смысл?
и кстати, при указании хендла окна не нужно указывать функцию обратного вызова для таймера, только чтото одно.
и если вам в ДЛЛ нужно подобие таймера то вам полюбому нужно создавать поток, и в нем можно в принципе через sleep таймерится.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.12.2010, 05:23   #4
RFbager
Пользователь
 
Регистрация: 30.10.2010
Сообщений: 14
По умолчанию

Как оказалось формально эта функция работает(последний код ошибки ,возвращенный GetLastError равен 2),но тем неменее конкретных действий не выполняет.На данный момент изучаю возможности внедрения соей DLL в чужой процесс.
По моей логике здесь при запуске процесса(и соответственно моей DLL) через 7 секунд должен был сработать таймер,вывести MessageBox один раз и выключиться.Но,на практике таймер не выключается,тоесть окошко MessageBox выводится стабильно каждые 7 секунд.Запись выключения таймера в саму функцию someFunc результатов так же не принесла.

Как реализовать таймер без функции я к сожалению не знаю,так как если я правильно понял WM_TIMER должен находиться в обработчике сообщений приложения,доступа к которому у меня нет по понятным причинам.

С потоками я пока ещё не общался,но спасибо за идею.Как только разберусь с реализацией таймера в отдельном потоке, сообщу о результатах.

Мой вариант таймера в отдельном процессе не работает,сильно не заморачивался.Решил не рвать гланды через жопу и сделать все на слипах)
Спасибо за идею ,Пепел Феникса.

Но если кто нибудь разберется почему не срабатывало,буду благодарен))

Последний раз редактировалось RFbager; 05.12.2010 в 07:53. Причина: Дополнение.
RFbager вне форума Ответить с цитированием
Старый 05.12.2010, 10:06   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

не выключается потому что срабатывает создание таймера с колбэком(somefunc).
а что написано в справке по этому поводу насчет параметра id?а?))

а вот что написано, что при создании таймера для callback функции, параметр id(второй) игнорируется, и в итоге нужно сохранять то что вернет SetTimer, это значение затем и идет в KillTimer.
Код:

void __stdcall someFunc (HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
	MessageBoxA(0,"Test","Test",0);
           KillTimer(0,idEvent)
}

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		{
                        SetTimer(0,0,7000,someFunc);
		}
		break;
	}
	return TRUE;
}
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ Builder KillTimer() coNsept C++ Builder 11 30.08.2010 23:05
TP7 чтение из файла, работает но не работает!? Qousio Помощь студентам 7 02.06.2009 09:37
Библиотека НЕ работает с 2008, но работает с 2000 SQL namenike Общие вопросы C/C++ 0 26.05.2009 11:04
SetTimer, KillTimer NeiL Win Api 5 05.03.2008 07:37