Форум: "Потрепаться";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
ВнизХуки, хуки, и ещё раз Хуки Найти похожие ветки
← →
MPS © (2004-04-15 12:28) [0]Приветствую! Кто разбирается в хуках и с++, какой-то баг немогу исправить. Дело обстоит так: есть библиотека, её исходник ниже. Устанавливаю хук WH_KEYBOARD. Проблема вся в том, что только в процедуре-фильтре строка szKillProcName показывает NULL хотя такого недолжно быть. В своей программе я вызываю вначале lib_init которая инициализирует необходимые мне данные. Вот код:
#include "stdafx.h"
#pragma data_seg(".hdata")
HINSTANCE hi = NULL;
#pragma data_seg()
#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif
EXPORT void lib_init(void);
char* szKillProcName[100];
HHOOK hKeyHook = NULL;
LRESULT CALLBACK KeyProc(int, WPARAM, LPARAM);
void lib_init(void)
{
hi = (HINSTANCE)hModule;
ReadAppConfs();
hKeyHook = SetWindowsHookEx (WH_KEYBOARD, &KeyProc, hi, 0);
}
void ReadAppConfs(void)
{
GetPrivateProfileString("general", "KillProcessName",
"ExecStat.exe", szKillProcName, 100, "c:\\1.ini");
}
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
if (ul_reason_for_call == DLL_PROCESS_DETACH)
UnhookWindowsHookEx(hKeyHook);
return TRUE;
}
LRESULT CALLBACK KeyProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode)
return CallNextHookEx (hKeyHook, nCode, wParam, lParam);
MessageBox(0, szKillProcName, "", 32); // собственно говоря - NULL. Почему?
return CallNextHookEx(hKeyHook, nCode, wParam, lParam);
}
← →
MPS © (2004-04-15 12:28) [0]Приветствую! Кто разбирается в хуках и с++, какой-то баг немогу исправить. Дело обстоит так: есть библиотека, её исходник ниже. Устанавливаю хук WH_KEYBOARD. Проблема вся в том, что только в процедуре-фильтре строка szKillProcName показывает NULL хотя такого недолжно быть. В своей программе я вызываю вначале lib_init которая инициализирует необходимые мне данные. Вот код:
#include "stdafx.h"
#pragma data_seg(".hdata")
HINSTANCE hi = NULL;
#pragma data_seg()
#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif
EXPORT void lib_init(void);
char* szKillProcName[100];
HHOOK hKeyHook = NULL;
LRESULT CALLBACK KeyProc(int, WPARAM, LPARAM);
void lib_init(void)
{
hi = (HINSTANCE)hModule;
ReadAppConfs();
hKeyHook = SetWindowsHookEx (WH_KEYBOARD, &KeyProc, hi, 0);
}
void ReadAppConfs(void)
{
GetPrivateProfileString("general", "KillProcessName",
"ExecStat.exe", szKillProcName, 100, "c:\\1.ini");
}
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
if (ul_reason_for_call == DLL_PROCESS_DETACH)
UnhookWindowsHookEx(hKeyHook);
return TRUE;
}
LRESULT CALLBACK KeyProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode)
return CallNextHookEx (hKeyHook, nCode, wParam, lParam);
MessageBox(0, szKillProcName, "", 32); // собственно говоря - NULL. Почему?
return CallNextHookEx(hKeyHook, nCode, wParam, lParam);
}
← →
MPS © (2004-04-15 12:38) [1]Пардон, вот код:
#include "stdafx.h"
#pragma data_seg(".hdata")
HINSTANCE hi = NULL;
#pragma data_seg()
#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif
EXPORT void lib_init(void);
char szKillProcName[100];
HHOOK hKeyHook = NULL;
LRESULT CALLBACK KeyProc(int, WPARAM, LPARAM);
void ReadAppConfs(void)
{
GetPrivateProfileString("general", "KillProcessName",
"ExecStat.exe", szKillProcName, 100, "c:\\1.ini");
}
void lib_init(void)
{
ReadAppConfs();
hKeyHook = SetWindowsHookEx (WH_KEYBOARD, &KeyProc, hi, 0);
}
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
if (!hi) hi = (HINSTANCE)hModule;
break;
case DLL_PROCESS_DETACH:h
UnhookWindowsHookEx(hKeyHook);
}
return TRUE;
}
LRESULT CALLBACK KeyProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode)
return CallNextHookEx (hKeyHook, nCode, wParam, lParam);
MessageBox(0, szKillProcName, "", 32); // собственно говоря - NULL. Почему?
return CallNextHookEx(hKeyHook, nCode, wParam, lParam);
}
← →
MPS © (2004-04-15 12:38) [1]Пардон, вот код:
#include "stdafx.h"
#pragma data_seg(".hdata")
HINSTANCE hi = NULL;
#pragma data_seg()
#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif
EXPORT void lib_init(void);
char szKillProcName[100];
HHOOK hKeyHook = NULL;
LRESULT CALLBACK KeyProc(int, WPARAM, LPARAM);
void ReadAppConfs(void)
{
GetPrivateProfileString("general", "KillProcessName",
"ExecStat.exe", szKillProcName, 100, "c:\\1.ini");
}
void lib_init(void)
{
ReadAppConfs();
hKeyHook = SetWindowsHookEx (WH_KEYBOARD, &KeyProc, hi, 0);
}
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
if (!hi) hi = (HINSTANCE)hModule;
break;
case DLL_PROCESS_DETACH:h
UnhookWindowsHookEx(hKeyHook);
}
return TRUE;
}
LRESULT CALLBACK KeyProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode)
return CallNextHookEx (hKeyHook, nCode, wParam, lParam);
MessageBox(0, szKillProcName, "", 32); // собственно говоря - NULL. Почему?
return CallNextHookEx(hKeyHook, nCode, wParam, lParam);
}
← →
Cobalt © (2004-04-15 12:44) [2]Товарисч, ну, если вы пришли на сайт по Дельфям, да ещё задаёте вопрос по хукам, что ж вы не прочитали статью???
В С это решается объявлением переменной в области разделяемых данных. Эта шняга, кажется, ещё в SDK Reference была в примере по хукам.
Стыдитесь, товарисч - не читать справку - это просто..... <нет слов>
P.S. А ещё с высшим образованием...
← →
Cobalt © (2004-04-15 12:44) [2]Товарисч, ну, если вы пришли на сайт по Дельфям, да ещё задаёте вопрос по хукам, что ж вы не прочитали статью???
В С это решается объявлением переменной в области разделяемых данных. Эта шняга, кажется, ещё в SDK Reference была в примере по хукам.
Стыдитесь, товарисч - не читать справку - это просто..... <нет слов>
P.S. А ещё с высшим образованием...
← →
MPS © (2004-04-15 12:50) [3]Cobalt © (15.04.04 12:44) [2]
Тык тык...
Во-первых: у меня нет sdk и msdn о чем я очень сожалею, пока немогу найти на прилавках нашей "деревни"
Во-вторых: если имеется ввиду то что обьявлять нужно в data_seg(.hdata) то я уже тысячу раз перепробовал, все бестолку!
В-третьих: Я ещё школьник
← →
MPS © (2004-04-15 12:50) [3]Cobalt © (15.04.04 12:44) [2]
Тык тык...
Во-первых: у меня нет sdk и msdn о чем я очень сожалею, пока немогу найти на прилавках нашей "деревни"
Во-вторых: если имеется ввиду то что обьявлять нужно в data_seg(.hdata) то я уже тысячу раз перепробовал, все бестолку!
В-третьих: Я ещё школьник
← →
wal © (2004-04-15 13:04) [4]Анкета
22.09.03 10:24
Login: MPS
Реальное имя: Максим
Пол: Мужской
Образование: высшее
Увлечения / хобби
Интересное о себе
А зачем тогда людей обманывать?
← →
wal © (2004-04-15 13:04) [4]Анкета
22.09.03 10:24
Login: MPS
Реальное имя: Максим
Пол: Мужской
Образование: высшее
Увлечения / хобби
Интересное о себе
А зачем тогда людей обманывать?
← →
MPS © (2004-04-15 13:23) [5]wal © (15.04.04 13:04) [4]
Там просто варианта небыло "скоро будет высшее" ;)
← →
MPS © (2004-04-15 13:23) [5]wal © (15.04.04 13:04) [4]
Там просто варианта небыло "скоро будет высшее" ;)
← →
wal © (2004-04-15 13:37) [6]
> Там просто варианта небыло "скоро будет высшее" ;)
Когда будет высшее, тогда и поменял бы
← →
wal © (2004-04-15 13:37) [6]
> Там просто варианта небыло "скоро будет высшее" ;)
Когда будет высшее, тогда и поменял бы
← →
MPS © (2004-04-15 13:41) [7]wal © (15.04.04 13:37) [6]
Разговор не об поменять высшее на никакое а по вопросу. Чего придрался к анкете этой
← →
MPS © (2004-04-15 13:41) [7]wal © (15.04.04 13:37) [6]
Разговор не об поменять высшее на никакое а по вопросу. Чего придрался к анкете этой
← →
wal © (2004-04-15 14:02) [8]
> P.S. А ещё с высшим образованием...
> В-третьих: Я ещё школьник
> Образование: высшее
Я не придрался, просто не люблю, когда меня обманывают.
> а по вопросу
А по вопросу. Когда ДЛЛ подгружается в адресное пространство процесса, то кодовый сегмент для всех процессов один, а сегмент данных для каждого процесса свой. Когда ты устанавливаешь хук, то тем самым неявно "подгружаешь" свою ДЛЛ ко всем процессам в системе (очень грубо и очень приближенно). Теперь подумай, каким должно быть значение szKillProcName, когда вызывается KeyProc из процесса, который никогда не вызывал lib_init?
← →
wal © (2004-04-15 14:02) [8]
> P.S. А ещё с высшим образованием...
> В-третьих: Я ещё школьник
> Образование: высшее
Я не придрался, просто не люблю, когда меня обманывают.
> а по вопросу
А по вопросу. Когда ДЛЛ подгружается в адресное пространство процесса, то кодовый сегмент для всех процессов один, а сегмент данных для каждого процесса свой. Когда ты устанавливаешь хук, то тем самым неявно "подгружаешь" свою ДЛЛ ко всем процессам в системе (очень грубо и очень приближенно). Теперь подумай, каким должно быть значение szKillProcName, когда вызывается KeyProc из процесса, который никогда не вызывал lib_init?
← →
wal © (2004-04-15 14:29) [9]Поправка:
Когда ты устанавливаешь глобальный хук (последний параметр при вызове функции SetWindowsHookEx равен нулю), то тем самым .... Далее по тексту.
← →
wal © (2004-04-15 14:29) [9]Поправка:
Когда ты устанавливаешь глобальный хук (последний параметр при вызове функции SetWindowsHookEx равен нулю), то тем самым .... Далее по тексту.
← →
Cobalt © (2004-04-15 15:16) [10]2 MPS
Ну, раз школьник, то будем снисходительны. НО, ты больше не ври! А то это уже будет рецидив (повтор)=> никакого снисхождения.
Кстати, там есть "образование - другое"
ХМ, в SDK нету указания насчёт разделяемых сегментов.
Зато есть вот: http://world.std.com/~lword/work/dllhint.html
http://awc.al-williams.com/share.htm
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_predir_data_seg.asp
Хорошая фраза:
I"ve never used it before though, so you"ll have to use the MSDN library or google or something like that to figure out what you need
И ещё - что у тебя хранится в этом сегменте? перечисли переменные:
← →
Cobalt © (2004-04-15 15:16) [10]2 MPS
Ну, раз школьник, то будем снисходительны. НО, ты больше не ври! А то это уже будет рецидив (повтор)=> никакого снисхождения.
Кстати, там есть "образование - другое"
ХМ, в SDK нету указания насчёт разделяемых сегментов.
Зато есть вот: http://world.std.com/~lword/work/dllhint.html
http://awc.al-williams.com/share.htm
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_predir_data_seg.asp
Хорошая фраза:
I"ve never used it before though, so you"ll have to use the MSDN library or google or something like that to figure out what you need
И ещё - что у тебя хранится в этом сегменте? перечисли переменные:
← →
Игорь Шевченко © (2004-04-15 15:19) [11]MPS © (15.04.04 12:38)
А где pragma для linker чтобы сделать сегмент разделяемым ?
← →
Игорь Шевченко © (2004-04-15 15:19) [11]MPS © (15.04.04 12:38)
А где pragma для linker чтобы сделать сегмент разделяемым ?
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.045 c