Re: global hcbt_active hook
От: quodum  
Дата: 17.09.08 10:05
Оценка: 3 (1)
Здравствуйте, fromrus, Вы писали:

1. Ключевые слова для поиска -- декорирование имён, экспорт, def-файл. Ещё есть замечательные утилиты depends и dumpbin из комплекта MSVC, которые показывают, что на самом деле экспортируется из DLLи.

2. Ещё нужно переменную HHOOK hook положить в разделяемую секцию.
Re[3]: global hcbt_active hook
От: Carc Россия http://www.amlpages.com/home.php
Дата: 17.09.08 20:53
Оценка: 3 (1)
"fromrus" <77202@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:3108051@news.rsdn.ru...
> Здравствуйте, quodum, Вы писали:
>
> Q>Здравствуйте, fromrus, Вы писали:
>
> Q>1. Ключевые слова для поиска -- декорирование имён, экспорт, def-файл. Ещё есть замечательные утилиты depends и dumpbin из комплекта MSVC, которые показывают, что на самом деле экспортируется из DLLи.
>
> Q>2. Ещё нужно переменную HHOOK hook положить в разделяемую секцию.
>
> 1.Как обойтись без экспорта деф-файла?Никак?
а кстати hookProc и не обязана экспортироваться, т.к. в SetWindowsHookEx передается адрес hookProc. Ей совершенно не обязательно быть экспортируемой.
Def-файл для экспорта не нах не нужен, проще и быстрее как и сделано через
extern "C" __declspec(dllexport)

Другой момент что судя по тому что ХУКПРОК ((С) пытается быть экспортируемой да хук глобальной она находится в DLL. Соответственно в момент вызова SetWindowsHookEx ее адрес неизвестен. Его и нужно получить из DLL
1) Используя вариант с экспортом функции + GetProcAddress
2) Засунув в DLL еще одну функцию, которая будет возвращать адрес hookProc
//DLL код
int CALLBACK HookProc(...) {
//сама хуковая процедура
}

extern "C"
void* __declspec(dllexport) GetHookProcAddress(void)
{
retuen HookProc
}

//Exe код
1.получаем адрес GetHookProcAddress
2. Вызываем по адресу из п.1 функцию GetHookProcAddress, она вовращает реальный адрес HookProc в DLL
3. Стави хук и передаем ему адрес HookProc полученный при вызове GetHookProcAddress в п.2


> 2.Что значит "HHOOK hook положить в разделяемую секцию"-что значит разделяемая секция?

>
>
>
Posted via RSDN NNTP Server 2.1 beta
Aml Pages Home
global hcbt_active hook
От: fromrus  
Дата: 16.09.08 17:25
Оценка: 2 (1)
здравствуйте!Написал хук,ток он не рабочий-почму?Прошу помощи у знатоков(хук блокирует активацию открытых окон)
длл сделана в ВС2008
HHOOK hook;
HINSTANCE hInstance;
extern "C" __declspec(dllexport) LRESULT CALLBACK HookProc(int code,WPARAM wParav,LPARAM lParam);
  
extern "C" __declspec(dllexport) LRESULT CALLBACK HookProc(int code,WPARAM wParam,LPARAM lParam){
if (code<0)
    return CallNextHookEx(hook,code,wParam,lParam);
if(code==HCBT_ACTIVATE)
return 1;
CallNextHookEx(hook,code,wParam,lParam);
}

далее в борланде в обработчике кнопки пишу:

static HINSTANCE hInst;
static HHOOK hook;
HOOKPROC hookProc;
.....
 void __fastcall TForm1::Button1Click(TObject *Sender)
{
         hInst=LoadLibraryA("HookDll.dll") ;
         if(hInst==NULL)
         {
        ShowMessage("Cannot load the library");
         }
      hookProc=(HOOKPROC)GetProcAddress(hInst,"HookProc");
      if(hookProc==NULL)
      {
      ShowMessage("Cannot load the function");
      }
      hook=SetWindowsHookEx(WH_CBT,(HOOKPROC)hookProc,hInst,0);
            Form1->Button1->Enabled=false;
     }

выяснилось что ХУКПРОК=нулу...почму не наю...


17.09.08 13:38: Перенесено модератором из 'C/C++' — Кодт
Re: global hcbt_active hook
От: x64 Россия  
Дата: 17.09.08 10:00
Оценка:
F>выяснилось что ХУКПРОК=нулу...почму не наю...

Делай экспорты через .def-файл и не знай проблем.
Re[2]: global hcbt_active hook
От: fromrus  
Дата: 17.09.08 19:34
Оценка:
Здравствуйте, quodum, Вы писали:

Q>Здравствуйте, fromrus, Вы писали:


Q>1. Ключевые слова для поиска -- декорирование имён, экспорт, def-файл. Ещё есть замечательные утилиты depends и dumpbin из комплекта MSVC, которые показывают, что на самом деле экспортируется из DLLи.


Q>2. Ещё нужно переменную HHOOK hook положить в разделяемую секцию.


1.Как обойтись без экспорта деф-файла?Никак?
2.Что значит "HHOOK hook положить в разделяемую секцию"-что значит разделяемая секция?
Re[3]: global hcbt_active hook
От: quodum  
Дата: 18.09.08 08:40
Оценка:
Здравствуйте, fromrus, Вы писали:

F>1.Как обойтись без экспорта деф-файла?Никак?


Можно и без def-файла. Сейчас у тебя проблема в том, что функция экспортируется под декорированным именем. Соответственно, путей решения два:
а) добавить def-файл и указать в нём желаемое имя экспорта
б) посмотреть чем-нибудь (например, dumpbin или depends) декорированное имя и импортировать функцию по этому имени.
Этот вопрос всплывает тут с завидной регулярностью, вот хотя бы на прошлой неделе был. <old-grumbler-rant>До чего люди ленивые пошли, им даже ключевые слова для поиска дают, а всё равно, пока не разжуёшь и в рот не положишь, не пошевелятся!.. </old-grumbler-rant>

Кстати, часто поступают примерно как написал
Автор: Carc
Дата: 18.09.08
выше Carc. А именно, добавляют в интерфейс DLLи функции для установки и снятия хука, а саму процедуру хука не экспортируют. Это удобно в том смысле, что сама DLL знает, какая инициализация нужна для установки хука и какой клинап после снятия.

F>2.Что значит "HHOOK hook положить в разделяемую секцию"-что значит разделяемая секция?


Грррр. Почитай хотя-бы это
Автор(ы): Dr. Joseph M. Newcomer
Дата: 25.04.2001
Статья посвящена реализации глобальных хуков. В ней рассматриваются типичные проблемы, связанные
с различием виртуальных адресов перехватывающей DLL в адресных пространствах различных процессов, описывается
способ создания разделяемого сегмента данных, приводится пример DLL, реализующей глобальный хук.
, что-ли.
Re[4]: global hcbt_active hook
От: Carc Россия http://www.amlpages.com/home.php
Дата: 18.09.08 12:37
Оценка:
> Кстати, часто поступают примерно как написал
Автор: Carc
Дата: 18.09.08
выше Carc. А именно, добавляют в интерфейс DLLи функции для установки и снятия хука, а саму процедуру хука не экспортируют. Это удобно в том смысле, что сама DLL знает, какая инициализация нужна для установки хука и какой клинап после снятия.

Именно так! Нехай ДЛЛ сама все рулит. Кто девушку платит, тот девушку и танцует. Внутри DLL явно больше информации: как ставить и как снимать хук: флаги там какие-либо, проверки на повторную установку хука и в таком же духе.
Опять таки ну не обязательно что hookProc была экспортируемая, т.к. SetWindowsHookEx нужен только ее адрес, который можно получить как писал выше. Опять же когда хуковоя процедура экспортируемая, какая-нибудь добрая душа рано или поздно ее импортнет и вызовет... И тут начнется "позови меня с собой"
Posted via RSDN NNTP Server 2.1 beta
Aml Pages Home
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.