Знающие люди API посмотрите
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Знающие люди API посмотрите - 2010-01-30 11:37:07.993333
|
|
|
ZETER
Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
|
вот код dllки выдает в последней функции ошибку [C++ Error] Admin.cpp(74): E2034 Cannot convert 'long (__stdcall *)(int,unsigned int,long)' to 'int (__stdcall *)()' и вот такую [C++ Error] Admin.cpp(74): E2342 Type mismatch in parameter 'lpfn' (wanted 'int (__stdcall *)()', got 'long (__stdcall *)(int,unsigned int,long)') не знаю что все вроде норм написано(( #include <vcl.h> #include <windows.h> #include <winuser.h> #include <stdio.h> #pragma hdrstop #include <Admin.h> #pragma argsused HHOOK SysHook; HWND Wnd; HINSTANCE hInst; FILE *f; TDateTime *date1; TCHAR szUserName[21]; DWORD dwSize = sizeof( szUserName ); BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD ul_reason_for_call, LPVOID lpvReserved) { hInst=(HINSTANCE)hinstDLL; return true; } LRESULT CALLBACK SysMsgProc(int code,WPARAM wParam,LPARAM lParam) { if (code == HC_ACTION) { if (((tagMSG*)lParam)->message == WM_QUERYENDSESSION||((tagMSG*)lParam)->message == WM_ENDSESSION){ AnsiString day=GetTickCount()/1000/60/60/24; AnsiString h=GetTickCount()/1000/60/60; AnsiString m=GetTickCount()/1000/60-60; double d=((GetTickCount()/1000/60/60)*3600)+((GetTickCount()/1000/60-60)*60); AnsiString s=GetTickCount()/1000-d; GetUserName( szUserName, &dwSize ); f=fopen("c:\\logfile.log","a"); AnsiString ff=date1->DateTimeString()=Now(); fputs("Âðåìÿ ðàáîòû â ñèñòåìå=> ",f); fputs(" Äíè: ",f); fputs(day.c_str(),f); fputs(" ×àñû: ",f); fputs(h.c_str(),f); fputs(" Ìèíóòû: ",f); fputs(m.c_str(),f); fputs(" Ñåêóíäû: ",f); fputs(s.c_str(),f); fputs("\n",f); fputs("Âðåìÿ âûõîäà èç ñèñòåìû=> ",f); fputs(ff.c_str(),f); fputs("\n",f); fclose(f); CallNextHookEx(SysHook, code, wParam, lParam); } } else CallNextHookEx(SysHook, code, wParam, lParam); return 0; } /////////////////////////////////////////////////////////////////// void RunStopHook(bool State, HINSTANCE hInstance) { if (State) SysHook = SetWindowsHookEx(WH_GETMESSAGE,&SysMsgProc,hInst, 0); else UnhookWindowsHookEx(SysHook); }
|
|
|
RE: Знающие люди API посмотрите - 2010-01-30 11:47:44
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
строка 74 – это:SysHook = SetWindowsHookEx(WH_GETMESSAGE,&SysMsgProc,hInst, 0); Я ведь угадал? У тебя тип функции SysMsgProc не совпадает с тем, что надо для SetWindowsHookEx. Быть может, проблему надо решать приведением типа:SysHook = SetWindowsHookEx(WH_GETMESSAGE,(int (*)())&SysMsgProc,hInst, 0); А может и нет, я в win32api – нуль.
|
|
|
RE: Знающие люди API посмотрите - 2010-01-30 11:54:31.613333
|
|
|
ZETER
Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
|
нет там просто указатель должен быть на адрес функции обработки сообщений
|
|
|
RE: Знающие люди API посмотрите - 2010-01-30 12:21:49.450000
|
|
|
Ltonid
Сообщений: 4970
Оценки: 740
Присоединился: 2008-12-29 13:21:56.166666
|
http://msdn.microsoft.com/en-us/library/ms644992(VS.85).aspx http://msdn.microsoft.com/en-us/library/ms644990(VS.85).aspx Если вчитаться в эти ссылки, все упирается в тот самый указатель. Написано правильно, но видимо функция SysMsgProc возращает какую то фигню и почему С выдает ошибку типа не понятно, возможно возвращаемое значение слишком большое и когда оно пытается его превратить в long компилятор его посылает. Попробуй помудрить с фильтром как написано в ссылках. UPD исправил, слово не смог нормальное вспомнить.
|
|
|
RE: Знающие люди API посмотрите - 2010-01-30 13:09:34.643333
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
Какая ошибка размерностей, вы о чём? Ошибка этапа компиляции, SysMsgProc ещё ничего не возвратила ни разу, её ещё даже не вызвали. Читаем внимательно: Type mismatch in parameter 'lpfn' (wanted 'int (__stdcall *)()', got 'long (__stdcall *)(int,unsigned int,long)') Перевести? "Несовпадение типа параметра lpfn (хотелось бы видеть `int (__stdcall *)()', а вы суёте 'long (__stdcall *)(int,unsigned int,long)'" Судя по всему HOOKPROC равноценно `long (__stdcall *)(int,unsigned int,long)', SetWindowHookEx, согласно документации, хочет именно HOOKPROC, почему не работает – непонятно. Попробуй насильно привести тип указателя к тому, что просит компилятор, как я показал. Просто эксперимента ради. Хотя стоп, я там ошибся, возвращаемый тип поставл void. Исправил.
|
|
|
RE: Знающие люди API посмотрите - 2010-01-30 16:42:23.243333
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Амперсант убери. В языке Си / С++ имя функции (без скобок) - это и есть её адрес.
|
|
|
RE: Знающие люди API посмотрите - 2010-02-01 04:24:57.610000
|
|
|
ZETER
Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
|
спасибо) я уже все по другому сделал) у меня другой вопрос а вот когда ставим функцию перехвата SetWindowsHookEx там задаем функцию которая обрабатывает сообщения у етой функции могут быть входные параметры только такие (int code,WPARAM wParam,LPARAM lParam) ?? или можно вот так (HWND hwnd,UINT uMsg,WPARAM wParam, LPARAM lParam)??
|
|
|
RE: Знающие люди API посмотрите - 2010-02-01 05:50:13.560000
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Ты вообще понял, что спросил? )
|
|
|
RE: Знающие люди API посмотрите - 2010-02-01 06:09:45.963333
|
|
|
ZETER
Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
|
неа дело не в амперсате а вчем то другом(((
|
|
|
RE: Знающие люди API посмотрите - 2010-02-01 06:42:48.753333
|
|
|
ZETER
Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
|
quote:
ORIGINAL: _SaZ_ Ты вообще понял, что спросил? ) Да я понял))) извиняюсь за некорректный вопос))
|
|
|
RE: Знающие люди API посмотрите - 2010-02-01 14:35:22.676666
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
http://msdn.microsoft.com/en-us/library/ms644960(VS.85).aspx - читал?
|
|
|
RE: Знающие люди API посмотрите - 2010-02-01 17:17:15.643333
|
|
|
ZETER
Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
|
я програмку переделал чуток и убрал dll терь все в одном exe и проблемка исчезла )там надо было поставить перед именем функции (HOOKPROC) и все начало работать только вот почему то не обрабытывает сообщения от винды((( вот код проги посмотрите может где я че накасячил #include <vcl.h> #include <winuser.h> #include <stdio.h> #include <windows.h> #include <condefs.h> #include <winbase.h> #pragma hdrstop //————————————————————————— #pragma argsused MSG msg; HHOOK SysHook; BOOL bRet; FILE *f; TDateTime *date1; TCHAR szUserName[21]; DWORD dwSize = sizeof( szUserName ); LRESULT CALLBACK GetMsgProc(int code,WPARAM wParam,LPARAM lParam) { if(((tagMSG*)lParam)->message == WM_QUERYENDSESSION){ AnsiString day=GetTickCount()/1000/60/60/24; AnsiString h=GetTickCount()/1000/60/60; AnsiString m=GetTickCount()/1000/60-60; double d=((GetTickCount()/1000/60/60)*3600)+((GetTickCount()/1000/60-60)*60); AnsiString s=GetTickCount()/1000-d; GetUserName( szUserName, &dwSize ); f=fopen("c:\\logfile.log","a"); AnsiString ff=date1->DateTimeString()=Now(); fputs("Время работы в системе=> ",f); fputs(" Дни: ",f); fputs(day.c_str(),f); fputs(" Часы: ",f); fputs(h.c_str(),f); fputs(" Минуты: ",f); fputs(m.c_str(),f); fputs(" Секунды: ",f); fputs(s.c_str(),f); fputs("\n",f); fputs("Время выхода из системы=> ",f); fputs(ff.c_str(),f); fputs("\n",f); fclose(f); CallNextHookEx(SysHook, code, wParam, lParam); } else CallNextHookEx(SysHook, code, wParam, lParam); return 0; } WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { GetUserName( szUserName, &dwSize ); f=fopen("c:\\logfile.log","a"); AnsiString ff; ff =Time(); fputs("————————\n",f); fputs("————————\n",f); fputs("Время входа в систему:=> ",f); fputs(ff.c_str(),f); fputs("\n",f); fputs("Пользователь:=> ",f); fputs(szUserName,f); fputs("\n",f); fclose(f); SysHook = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)GetMsgProc,0,0); while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0) { if (bRet == -1) { } else { TranslateMessage(&msg); DispatchMessage(&msg); } } UnhookWindowsHookEx(SysHook); return 0; }
|
|
|
RE: Знающие люди API посмотрите - 2010-02-01 17:58:58.790000
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
quote:
ORIGINAL: ZETER я програмку переделал чуток и убрал dll терь все в одном exe и проблемка исчезла )там надо было поставить перед именем функции (HOOKPROC) и все начало работать Короче ты сделал то, что я предлагал с самого начала – явное приведение типа указателя ;)
|
|
|
RE: Знающие люди API посмотрите - 2010-02-01 21:17:38.626666
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
vcl.h гГгГ
|
|
|
RE: Знающие люди API посмотрите - 2010-02-04 19:49:14.740000
|
|
|
ZETER
Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
|
и что ето означает??
|
|
|
RE: Знающие люди API посмотрите - 2010-02-04 19:50:21.253333
|
|
|
ZETER
Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
|
все таки по какой причине не перехватывает сообщения винды???
|
|
|
RE: Знающие люди API посмотрите - 2010-02-04 20:02:03.403333
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
Как ты это определил? Дебуггером надеюсь? То есть поставил бряк на свой хук, стартанул программу и бряк ни разу ни сработал?
|
|
|
RE: Знающие люди API посмотрите - 2010-02-04 20:32:59.183333
|
|
|
ZETER
Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
|
нееет))) раз 10 перезапустил комп:D:D:D
|
|
|
RE: Знающие люди API посмотрите - 2010-02-04 20:35:18.960000
|
|
|
ZETER
Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
|
я все елементы в проге проверял которые в лог записывают а как сам фильтр проверить кроме как на практике (комп сам перезапустить или завершить сеанс ) не знаю только вот после перезагрузки она ничего не записывала в файл
|
|
|
RE: Знающие люди API посмотрите - 2010-02-04 21:39:55.290000
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Тебе что, надо время логаута отловить?? Зачем тут хуки?
|
|
|
RE: Знающие люди API посмотрите - 2010-02-05 10:34:31.276666
|
|
|
ZETER
Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
|
А как можго по другому просто я не знаю другого способа(((
|
|
|
RE: Знающие люди API посмотрите - 2010-02-05 13:32:31.746666
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Проще всего сделать окно 0 на 0 пикселей и ловить WM_QUERYENDSESSION или WM_ENDSESSION.
|
|
|
RE: Знающие люди API посмотрите - 2010-02-05 14:39:13.563333
|
|
|
ZETER
Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
|
а разница??
|
|
|
RE: Знающие люди API посмотрите - 2010-02-05 15:00:19.546666
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
А зачем тут хуки?
|
|
|
RE: Знающие люди API посмотрите - 2010-02-05 19:22:30.266666
|
|
|
ZETER
Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
|
а как без них сделать ???
|
|
|
RE: Знающие люди API посмотрите - 2010-02-06 01:47:59.720000
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Читай внимательно: 1. Создаёшь окно 0 на 0 пикселей. 2. Ловишь вышеуказанные сообщения.
|
|
|
RE: Знающие люди API посмотрите - 2010-02-06 08:50:10.466666
|
|
|
ZETER
Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
|
а как ловить то без хуков в таком случае???? мне сот ето не понятно ты уж извини что я такой дуб )) еще только учусь по API
|
|
|
RE: Знающие люди API посмотрите - 2010-02-06 08:59:58.746666
|
|
|
ZETER
Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
|
я нашел в книжке о том что ты говоришь )) вот еще вопрос раньше в окно приходит что WM_DESTROY или то что мне нужно словить???
|
|
|
RE: Знающие люди API посмотрите - 2010-02-06 20:21:07.903333
|
|
|
ZETER
Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
|
прогу сделал все работает только вот на builderе она не хочет компилироваться когда отключаю библиотеки для того что бы автономно работала ((((((((((((((( переделал ее на vc++ там другая фигня прога работает только не корректно выводит инфу GetLocalTime(&Date); GetUserName( szUserName, &dwSize ); f=fopen("c:\\logfile.html","a"); fputs("————————\n",f); fputs("————————\n",f); fputs("Время входа в систему:=> ",f); fputs((char *)&Date.wHour,f); fputc(':',f); fputs((char *)&Date.wMinute,f); fputc(':',f); fputs((char *)&Date.wSecond,f); fputs("\n",f); fputs("Пользователь:=> ",f); fputs((char *)&szUserName,f); fputs("\n",f); fclose(f); вот в етих местах … Может кто мне может помоч как исправить??)))
|
|
|
RE: Знающие люди API посмотрите - 2010-02-06 22:52:45.976666
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
А какого типа Date.wHour? Глядя на w перед hour, я почти уверяюсь в том, что short int. Если я прав, то вместо всех этих fputs, пиши: fprintf (f, "------------------------\n"
"------------------------\n"
"Время входа в систему:=> %hd:%hd:%hd\n"
"Пользователь:=> %s\n",
Date.wHour, Date.wMinute, Date.wSecond, szUserName); Хотя быть того не может, чтоб в win32api не было бы какой-нибудь функции типа FormatTime.
|
|
|
RE: Знающие люди API посмотрите - 2010-02-07 01:33:12.226666
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
А в окно не приходит WM_ENDSESSION?
|
|
|
RE: Знающие люди API посмотрите - 2010-02-07 08:57:08.316666
|
|
|
ZETER
Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
|
Нет все проходит и работает спасибо за подсказку _SaZ_ ))) только у меня builder чтоб его не хочет нормально компилировать его((( после отключения run-time библиотек я переделал на vc++ а там чтото не хочет корректно выводить а тип данных там у етих переменных WORD! а не short int!))) но все равно попробую так как посоветовал))
|
|
|
RE: Знающие люди API посмотрите - 2010-02-07 09:30:04.480000
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
quote:
ORIGINAL: ZETER тип данных там у етих переменных WORD! а не short int!))) WORD – это целое размером с два байта. short int – это тоже целое размером с два байта. Короче это один и тот же тип. Единственное сомнение – WORD может быть беззнаковым, но если это так, и если это будет мешать, но просто %hd надо будет сменить на %hu. Хотя можно тупо написать %d и явно привести тип при передаче параметра, вместо Date.wHour писать (int)Date.wHour.
|
|
|
RE: Знающие люди API посмотрите - 2010-02-07 10:11:12.463333
|
|
|
ZETER
Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
|
спасибо попробую скажу как получилось)) :):):):)
|
|
|
RE: Знающие люди API посмотрите - 2010-02-07 14:36:29.860000
|
|
|
ZETER
Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
|
Все ок Работает)) VC rulezz Builder на свалку)) спасибо rgo зделал как ты советовал все получилось только где выводило имя пользователя у тебя стоит маленькая s у меня выводило только первую букву имени потом поставил большую и стало выводить норм а так все нормально)) наконец то домучал)) Спасибо еще раз всем огромное)) билдер конечно глюками обидел ((
|
|
|
RE: Знающие люди API посмотрите - 2010-02-07 14:48:11.226666
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
quote:
ORIGINAL: ZETER где выводило имя пользователя у тебя стоит маленькая s у меня выводило только первую букву имени потом поставил большую и стало выводить норм Это вероятно потому, что имя в юникоде. wchar_t и все дела.
|
|
|
|
|