Форум: "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