Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

Хуки, хуки, и ещё раз Хуки   Найти похожие ветки 

 
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);
}


 
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) то я уже тысячу раз перепробовал, все бестолку!
В-третьих: Я ещё школьник


 
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]

Там просто варианта небыло "скоро будет высшее" ;)


 
wal ©   (2004-04-15 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: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

И ещё - что у тебя хранится в этом сегменте? перечисли переменные:


 
Игорь Шевченко ©   (2004-04-15 15:19) [11]

MPS ©   (15.04.04 12:38)

А где pragma для linker чтобы сделать сегмент разделяемым ?



Страницы: 1 вся ветка

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.047 c
1-1079957412
Vadim S_
2004-03-22 15:10
2004.04.11
.NET FAQ Delphi 7.0/8.0


8-1076409176
_none_
2004-02-10 13:32
2004.04.11
GDI+ и win2003server


3-1081691505
Крутыш
2004-04-11 17:51
2004.04.11
Где найти нормальный компонент.


1-1082399221
Kemik
2004-04-19 22:27
2004.04.11
Создание нового компонента.


7-1079636270
Константин
2004-03-18 21:57
2004.04.11
Автозапуск