Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];

Вниз

Чего-то хук не ловит   Найти похожие ветки 

 
Solo   (2004-11-17 15:16) [0]

Здравствуйте, запарился что-то:
из имеющейся DLL пытаюсь поставить глобальный хук (проверял на wh_Shell, wh_Keyboard) ставлю как обычно hHook:= SetWindowsHookEx(wh_Shell, @Func, HInstance, 0). Функция Func естественно находится в этой же DLL. После вызова SetWindowsHookEx значение hHook - больше нуля, но почему-то DLL после установки хука не отображается на адресные пространства процессов, где происходят разные события, которые по идее должен отлавливать этот хук. Специально написал тестовый проектик, там все ОК. Какие могут быть препятствия для отображения DLL на адресные пространства процессов при вреде бы корректно установленном хуке.
И еще, так плохо дела обстоят под win98, под ХР тот же код прекрасно работает.


 
Digitman ©   (2004-11-17 15:37) [1]


> не отображается на адресные пространства


это есть инсинуации или реально подтверждено конкретными фактами ?


 
Solo   (2004-11-17 20:04) [2]


> > не отображается на адресные пространства>
>
> это есть инсинуации или реально подтверждено конкретными
> фактами ?


При загрузке в адресное пространство процесса должна вызываться прцедура входа/выхода со значением DLL_PROCESS_ATTACH. Она не вызывается. Это не сложно проверить, хотя бы просто Beep вставить. Повторюсь: под ХР тот же код прекрасно работает, процедура соответственно нормально вызывается.


 
Digitman ©   (2004-11-18 08:38) [3]

то что ты бип не услышал, вовсе не означает, что процедура иниц-ции не получила управление

Цитата из справки :

Windows 95:

The Beep function ignores the dwFreq and dwDuration parameters. On computers with a sound card, the function plays the default sound event. On computers without a sound card, the function plays the standard system beep.

Т.е. если саунд-карта установлена и корректно работает, система будет пытаться воспроизвести wav-файл, соответствующий звуковому событию Beep в текущей звуковой схеме. И здесь м.б. куча моментов :

- не установлена ни одна звук.схема
- звук.схема установлена, но beep-событию в этой схеме не назначен wav-файл
- звук.схема установлена, beep-событие в ней - тоже, но тек.установка параметров wav-канала микшера не дает возможности прослушивания воспроизводимого wav-файла
- и т.д. и т.п.

использовать Beep() для целей контроля и отладки - моветон и  весьма ненадежный способ.

воспользуйся хотя бы MessageBox() вместо Beep().


 
DVM ©   (2004-11-18 11:26) [4]


> воспользуйся хотя бы MessageBox()

c хуком WH_SHELL чревато появлением бесконечного числа окон


 
Solo   (2004-11-18 12:10) [5]

to Digitman: не буду с вами спорить по поводу Beep и адресных пространств процессов, хотя по адресным пространствам остаюсь при своем мнении т.к. не Beep-ом единым... :). Поставлю вопрос по другому:
в чем может быть причина, что под win98, при вроде бы корректно установленном wh_shell хуке функция ловушки никогда не вызывается. ПОД WIN ХР ЭТОТ ЖЕ КОД РАБОТАЕТ.

to DVM:

> c хуком WH_SHELL чревато появлением бесконечного числа окон

это верно, сделал сдуру один раз :)

И еще и в рабочем проекте, где проблемы, и в тестовом где функция ловушки нормально вызывается такая картина: после установки wh_shell хука не перерисовывается taskbar - не появляется новая кнопка при запуске нового приложения. Если хук установить до появления на экране главной формы, то не отрисовывается и кнопка самого приложения устанавливающего хук.


 
Digitman ©   (2004-11-18 12:12) [6]


> DVM ©   (18.11.04 11:26) [4]


ну это - да.
ну можно и лог-файл писать вместо MessageBox(), можно в конце-концов дебагер подключить для этого дела (что лучше всего и правильней всего)


 
Digitman ©   (2004-11-18 12:17) [7]


> > c хуком WH_SHELL чревато появлением бесконечного числа
> окон
>
> это верно, сделал сдуру один раз :)


ну да если даже так - вовсе нестрашно ... главное - удостовериться в факте загрузки хук-модуля


> Поставлю вопрос по другому:
> в чем может быть причина, что под win98, при вроде бы корректно
> установленном wh_shell хуке функция ловушки никогда не вызывается


так. стоп.
прежде чем рассуждать о вызове хук-колбэка, все-таки удостоверься в факте загрузки или незагрузки самого хук-модуля


 
DVM ©   (2004-11-18 12:22) [8]


> И еще и в рабочем проекте, где проблемы, и в тестовом где
> функция ловушки нормально вызывается такая картина: после
> установки wh_shell хука не перерисовывается taskbar - не
> появляется новая кнопка при запуске нового приложения. Если
> хук установить до появления на экране главной формы, то
> не отрисовывается и кнопка самого приложения устанавливающего
> хук.

Покажи код dll - в нем точно ошибка есть.


 
solo   (2004-11-18 12:47) [9]

Вот на порку тестовое :)

library ShellHook;

uses
 Windows,
 SysUtils,
 Classes;

var
 ShellHandle: PHandle;
 MapShellHandle: THandle;

{$R *.RES}

function ShellFunc(Code: Integer; wParam, lParam: Longint):Longint; stdcall;
var
 i: Integer;
begin
 if Code < 0 then
 begin
   Result:=CallNextHookEx(ShellHandle^, Code, wParam, lParam);
 else
   Result:= 0;
end;

function OpenSharedShellData: Boolean;
var
  Size: Integer;
begin
 Result:= True;
 try
   Size := SizeOf(THandle);
   MapShellHandle := CreateFileMapping(DWord(-1), nil, PAGE_READWRITE, 0, Size, "qwertyuiop");
   if MapShellHandle = 0 then
     RaiseLastWin32Error;
   ShellHandle := MapViewOfFile(MapShellHandle, FILE_MAP_ALL_ACCESS, 0, 0, Size);
   if ShellHandle = nil then
   begin
     CloseHandle(MapShellHandle);
     RaiseLastWin32Error;
   end;
 except
   Result:= False;
   ShowMessage("Cannot open shared data");
 end;
end;

procedure CloseSharedShellData;
begin
 UnmapViewOfFile(ShellHandle^);
 CloseHandle(MapShellHandle);
end;

procedure SetShellHook;StdCall;
begin
 ShellHandle^:=SetWindowsHookEx(wh_shell, @ShellFunc, HInstance, 0);
 if ShellHandle^ = 0 then
   ShowMessage("Failure with hook");
end;

procedure UnsetShellHook;StdCall;
begin
 UnhookWindowsHookEx(ShellHandle^);
end;

procedure DLLEntryPoint(dwReason: Integer);
begin
 case dwReason of
   DLL_PROCESS_ATTACH: OpenSharedShellData;
   DLL_PROCESS_DETACH: CloseSharedShellData;
 end;
end;

exports
 SetShellHook,
 UnsetShellHook;

begin
 DLLProc:= @DLLEntryPoint;
 DLLEntryPoint(DLL_PROCESS_ATTACH);
end.


 
Digitman ©   (2004-11-18 13:24) [10]

так.
т.е. ты утверждаешь, что в случае с win9x

procedure DLLEntryPoint(dwReason: Integer);
begin
messagebox(0, "", "", mb_ok); //это диал.окно не появляется
case dwReason of
  DLL_PROCESS_ATTACH: OpenSharedShellData;
  DLL_PROCESS_DETACH: CloseSharedShellData;
end;
end;

?


 
solo   (2004-11-18 14:11) [11]

To: Digitman: это код тестового проекта, там с отображением на адресные пространства все ОК (как я указывал раньше). Причина появления здесь этого кода:

> > И еще и в рабочем проекте, где проблемы, и в тестовом
> где
> > функция ловушки нормально вызывается такая картина: после
>
> > установки wh_shell хука не перерисовывается taskbar -
> не
> > появляется новая кнопка при запуске нового приложения.
> Если
> > хук установить до появления на экране главной формы, то
>
> > не отрисовывается и кнопка самого приложения устанавливающего
>
> > хук.
>
> Покажи код dll - в нем точно ошибка есть.


Я извиняюсь за некоторую путаницу.

В рабочем же проекте это окошко действительно не появляется, ну только раз, когда само разрабатываемое приложение DLL грузит. Вот процедура установки хука из рабочего проекта

procedure SetShellHook;
begin
{если хук еще не установлен, то ставим}
 if ShellHookCount = 0 then
 begin
   WaitForSingleObject(hSharedDataMutex, Infinite);
   try
     gSharedData.ShellHookHandle:=SetWindowsHookEx(wh_Shell, @ShellFunc, HInstance, 0);
     if gSharedData.ShellHookHandle = 0 then
       RaiseLastWin32Error;
   finally
     ReleaseMutex(hSharedDataMutex);
   end;
 end;
{Если хук стоит, просто увеличиваем счетчик его использования}
 Inc(ShellHookCount);
end;


Значение gSharedData.ShellHookHandle после вызова SetWindowsHookEx больше нуля, но процедура ловушки никогда не вызывается.

ПОД WIN ХР ЭТОТ ЖЕ КОД РАБОТАЕТ. - вот что интересно.

Вынужден откланятся до 00 часов на работу пора :)


 
Digitman ©   (2004-11-18 15:03) [12]


> окошко действительно не появляется, ну только раз, когда
> само разрабатываемое приложение DLL грузит


и при этом ты на все сто уверен, кроме твоего хост-приложения, грузящего хук-ДЛЛ, на этот момент в системе есть еще как минимум один работающий GUI-процесс ?


> Значение gSharedData.ShellHookHandle после вызова SetWindowsHookEx больше нуля, но процедура ловушки никогда не вызывается


нет, подожди.
до вызова ф-ции-ловушки еще как до китая раком ..

сначала нужно понять причину, по которой хук-модуль якобы автоматически не грузится в АП хотя бы одного из активных GUI-процессов (кроме, разумеется, твоего собственного. который устанавливает ловушку), хотя этот факт обязан иметь место при условии что в системе на этот момент есть хотя бы один целевой GUI-процесс


 
DVM ©   (2004-11-18 15:09) [13]


> solo   (18.11.04 12:47) [9]

По поводу неперерисовки таскбара надо посмотреть в сторону SPI_GETMINIMIZEDMETRICS и SystemParametersInfo
А в dll ошибки про которую я подумал нет.

Note that custom shell applications do not receive WH_SHELL messages. Therefore, any application that registers itself as the default shell must call the SystemParametersInfo function with SPI_SETMINIMIZEDMETRICS before it (or any other application) can receive WH_SHELL messages.


 
Solo   (2004-11-19 11:47) [14]


> и при этом ты на все сто уверен, кроме твоего хост-приложения,
> грузящего хук-ДЛЛ, на этот момент в системе есть еще как
> минимум один работающий GUI-процесс ?


При чем тут сам момент установки хука? Система проецирует ДЛЛ на адресное пространство процесса, когда в этом процессе происходит первое из событий, которое этот хук должен перехватывать. Например для wh_Shell это, наверно, создание главного окна программы, впрочем не суть важно какое именно это событие.
Я ставлю wh_Shell хук, затем запускаю скажем notepad (при этом происходит и создание окна верхнего уровня, и его активация, и...), и... ничего, никакого Beep или messagebox я не вижу и не слышу.
Тут мне видится 2 момента:
- хук не устанавливается, но возвращаемое значение SetWindowsHookEx больше нуля, и в пределах хост-процесса хук работает;
- система почему-то не проецирует мою ДЛЛ на другие процессы, вот почему это происходит, я и горю желанием выяснить. Что может мешать?

2 DVM: спасибо, посмотрю.


 
Digitman ©   (2004-11-19 13:08) [15]


> Я ставлю wh_Shell хук, затем запускаю скажем notepad


и после этого ты некими сторонними утилитами убедился, что в АП процесса блокнота действительно нет образа хук-ДЛЛ ?


 
Solo   (2004-11-19 14:22) [16]


> и после этого ты некими сторонними утилитами убедился, что
> в АП процесса блокнота действительно нет образа хук-ДЛЛ
> ?


Да убедился Рихтеровская processInfo всегда под руками :)


 
Solo   (2004-11-19 14:23) [17]

Нашел причину:
виноват был сам (как всегда). Дело в том, что моя ДЛЛ неявно импортировала из хост-файла некоторые функции, отсюда при отображении ДЛЛ на процесс, надо было отображать и экзешник, а система его не видела, добавил в autoexec.bat путь к эксешнику, и все стало ОК. Хотя отображать экзешник на другие процессы мне не надо (те функции там не нужны). Переделаю.

Касаемо перерисовки таскбара, сейчас разбираюсь, если кому надо скажите, когда разберусь сообющу.


 
Digitman ©   (2004-11-19 14:36) [18]


> моя ДЛЛ неявно импортировала из хост-файла некоторые функции


это как это - "неявно" ?

поясни в коде ...


 
DVM ©   (2004-11-19 15:10) [19]


> Касаемо перерисовки таскбара, сейчас разбираюсь, если кому
> надо скажите, когда разберусь сообющу.

Да что тут разбираться, вот код, кот. тебе поможет наверняка:

var
mm: MINIMIZEDMETRICS;
begin
mm.cbSize:=sizeof(MINIMIZEDMETRICS);
mm.iArrange:=ARW_HIDE;
SystemParametersInfo(SPI_SETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), @mm, 0);


 
DVM ©   (2004-11-19 15:11) [20]

P.S. Перед постановкой хука его надо


 
Solo   (2004-11-20 10:51) [21]


> это как это - "неявно" ?
> поясни в коде ...


Ну это я по методу загрузки модуля экзэшника обозвал, правильней наверно было сказать статически:

function SomeFunc;StdCall; external ExeFile name "SomeFunc";



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

Форум: "WinAPI";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.036 c
14-1103203292
Игорь Шевченко
2004-12-16 16:21
2005.01.09
Министр обороны призвал "прекратить дебилизацию" россиян


3-1102596992
galexis
2004-12-09 15:56
2005.01.09
Сколько записей в DBGrid?


1-1103596570
saNat
2004-12-21 05:36
2005.01.09
Справка в моей форме


1-1103487729
redlord
2004-12-19 23:22
2005.01.09
tstringgrid смена ячейки для ввода


1-1103722862
Cosinus
2004-12-22 16:41
2005.01.09
Как в TreeView.SomeNode добавить LongWord?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский