Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Знающие люди API посмотрите

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Знающие люди API посмотрите
Имя
Сообщение << Старые топики   Новые топики >>
Знающие люди 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);
}
Post #: 1
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 – нуль.
Post #: 2
RE: Знающие люди API посмотрите - 2010-01-30 11:54:31.613333   
ZETER

Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
нет там просто указатель должен быть на адрес функции обработки сообщений
Post #: 3
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 исправил, слово не смог нормальное вспомнить.
Post #: 4
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. Исправил.
Post #: 5
RE: Знающие люди API посмотрите - 2010-01-30 16:42:23.243333   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Амперсант убери. В языке Си / С++ имя функции (без скобок) - это и есть её адрес.
Post #: 6
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)??
Post #: 7
RE: Знающие люди API посмотрите - 2010-02-01 05:50:13.560000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Ты вообще понял, что спросил? )
Post #: 8
RE: Знающие люди API посмотрите - 2010-02-01 06:09:45.963333   
ZETER

Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
неа дело не в амперсате а вчем то другом(((
Post #: 9
RE: Знающие люди API посмотрите - 2010-02-01 06:42:48.753333   
ZETER

Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000

quote:

ORIGINAL: _SaZ_

Ты вообще понял, что спросил? )

Да я понял))) извиняюсь за некорректный вопос))
Post #: 10
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 - читал?
Post #: 11
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;
}
Post #: 12
RE: Знающие люди API посмотрите - 2010-02-01 17:58:58.790000   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
quote:

ORIGINAL: ZETER
я програмку переделал чуток и убрал dll терь все в одном exe и проблемка исчезла )там надо было поставить перед именем функции (HOOKPROC) и все начало работать

Короче ты сделал то, что я предлагал с самого начала – явное приведение типа указателя ;)
Post #: 13
RE: Знающие люди API посмотрите - 2010-02-01 21:17:38.626666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
vcl.h гГгГ
Post #: 14
RE: Знающие люди API посмотрите - 2010-02-04 19:49:14.740000   
ZETER

Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
и что ето означает??
Post #: 15
RE: Знающие люди API посмотрите - 2010-02-04 19:50:21.253333   
ZETER

Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
все таки по какой причине не перехватывает сообщения винды???
Post #: 16
RE: Знающие люди API посмотрите - 2010-02-04 20:02:03.403333   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
Как ты это определил? Дебуггером надеюсь? То есть поставил бряк на свой хук, стартанул программу и бряк ни разу ни сработал?
Post #: 17
RE: Знающие люди API посмотрите - 2010-02-04 20:32:59.183333   
ZETER

Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
нееет))) раз 10 перезапустил комп:D:D:D
Post #: 18
RE: Знающие люди API посмотрите - 2010-02-04 20:35:18.960000   
ZETER

Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
я все елементы в проге проверял которые в лог записывают а как сам фильтр проверить кроме как на практике (комп сам перезапустить или завершить сеанс ) не знаю только вот после перезагрузки она ничего не записывала в файл
Post #: 19
RE: Знающие люди API посмотрите - 2010-02-04 21:39:55.290000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Тебе что, надо время логаута отловить?? Зачем тут хуки?
Post #: 20
RE: Знающие люди API посмотрите - 2010-02-05 10:34:31.276666   
ZETER

Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
А как можго по другому просто я не знаю другого способа(((
Post #: 21
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.
Post #: 22
RE: Знающие люди API посмотрите - 2010-02-05 14:39:13.563333   
ZETER

Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
а разница??
Post #: 23
RE: Знающие люди API посмотрите - 2010-02-05 15:00:19.546666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
А зачем тут хуки?
Post #: 24
RE: Знающие люди API посмотрите - 2010-02-05 19:22:30.266666   
ZETER

Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
а как без них сделать ???
Post #: 25
RE: Знающие люди API посмотрите - 2010-02-06 01:47:59.720000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Читай внимательно:
1. Создаёшь окно 0 на 0 пикселей.
2. Ловишь вышеуказанные сообщения.
Post #: 26
RE: Знающие люди API посмотрите - 2010-02-06 08:50:10.466666   
ZETER

Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
а как ловить то без хуков в таком случае???? мне сот ето не понятно ты уж извини что я такой дуб )) еще только учусь по API
Post #: 27
RE: Знающие люди API посмотрите - 2010-02-06 08:59:58.746666   
ZETER

Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
я нашел в книжке о том что ты говоришь )) вот еще вопрос раньше в окно приходит что WM_DESTROY или то что мне нужно словить???
Post #: 28
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 *)&amp;Date.wHour,f);
fputc(':',f);
fputs((char *)&amp;Date.wMinute,f);
fputc(':',f);
fputs((char *)&amp;Date.wSecond,f);
fputs("\n",f);
fputs("Пользователь:=> ",f);
fputs((char *)&amp;szUserName,f);
fputs("\n",f);
fclose(f);

вот в етих местах … Может кто мне может помоч как исправить??)))
Post #: 29
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" "Время входа в систему:=&gt; %hd:%hd:%hd\n" "Пользователь:=&gt; %s\n", Date.wHour, Date.wMinute, Date.wSecond, szUserName); Хотя быть того не может, чтоб в win32api не было бы какой-нибудь функции типа FormatTime.
Post #: 30
RE: Знающие люди API посмотрите - 2010-02-07 01:33:12.226666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
А в окно не приходит WM_ENDSESSION?
Post #: 31
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!))) но все равно попробую так как посоветовал))
Post #: 32
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.
Post #: 33
RE: Знающие люди API посмотрите - 2010-02-07 10:11:12.463333   
ZETER

Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
спасибо попробую скажу как получилось)) :):):):)
Post #: 34
RE: Знающие люди API посмотрите - 2010-02-07 14:36:29.860000   
ZETER

Сообщений: 127
Оценки: 0
Присоединился: 2010-01-18 21:11:03.490000
Все ок Работает)) VC rulezz Builder на свалку)) спасибо rgo зделал как ты советовал все получилось только где выводило имя пользователя у тебя стоит маленькая s у меня выводило только первую букву имени потом поставил большую и стало выводить норм а так все нормально)) наконец то домучал)) Спасибо еще раз всем огромное)) билдер конечно глюками обидел ((
Post #: 35
RE: Знающие люди API посмотрите - 2010-02-07 14:48:11.226666   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
quote:

ORIGINAL: ZETER
где выводило имя пользователя у тебя стоит маленькая s у меня выводило только первую букву имени потом поставил большую и стало выводить норм

Это вероятно потому, что имя в юникоде. wchar_t и все дела.
Post #: 36
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Знающие люди API посмотрите







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.