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

Вниз

Hook: что неправильно?   Найти похожие ветки 

 
Alx2 ©   (2002-02-13 11:58) [0]

Делаю hook из DLL:

Function SetHook: HHOOK; Stdcall;
Begin
If (AInstance = LongWord( - 1)) Then
AInstance := HInstance;
hhk := SetWindowsHookEx(WH_CBT,
@ShellProc,
HInstance,
0
);
Result := hhk;
End;


Вот ShellProc, которая не работает для других приложений, а для родного, вызывающего SetHook, работает:


Function ShellProc(nCode: Integer; WPARAM, LPARAM: Integer): Integer; Stdcall;
Var
Str : String;
CBTCreateWnd: PCBTCreateWnd Absolute LPARAM;
Begin
Result := CallNextHookEx(hhk, nCode, WPARAM, LPARAM);
If (nCode = HCBT_CREATEWND) And (Pointer(LPARAM) <> Nil) And (CBTCreateWnd^.lpCs <> Nil) Then
Begin
If MyWindow = 0 Then
MyWindow := FindWindow("TWatcherForm", "WatcherForm");
Str := CBTCreateWnd^.lpCs^.lpszClass;
SendMessage(MyWindow, WM_SETTEXT, 8101973, Integer(PChar(Str)));
End;
End;


А если исправить так:

Function ShellProc(nCode: Integer; WPARAM, LPARAM: Integer): Integer; Stdcall;
Var
Str : String;
CBTCreateWnd: PCBTCreateWnd Absolute LPARAM;
Begin
Result := CallNextHookEx(hhk, nCode, WPARAM, LPARAM);
If (nCode = HCBT_CREATEWND) And (Pointer(LPARAM) <> Nil) And (CBTCreateWnd^.lpCs <> Nil) Then
Begin
If MyWindow = 0 Then
MyWindow := FindWindow("TWatcherForm", "WatcherForm");
SendMessage(MyWindow, WM_SETTEXT, 8101973, Integer(CBTCreateWnd^.lpCs^.lpszClass));
End;
End;

- работает всегда.

Что делаю не так? Где грабли?
Что сделать, чтобы работал первый (именно нужный мне) вариант?


 
Виктор Щербаков ©   (2002-02-13 12:04) [1]

В первом варианте указатель на что ты передаешь?
В каком он адресном пространстве?
Используй WM_COPYDATA для передачи строки целиком.


 
Alx2 ©   (2002-02-13 12:08) [2]

>Виктор Щербаков © (13.02.02 12:04)

>Используй WM_COPYDATA для передачи строки целиком.
Спасибо, сейчас попробую...

>В первом варианте указатель на что ты передаешь?
Хорошо, а почему тогда всегда работает такой вот бред:

Function ShellProc(nCode: Integer; WPARAM, LPARAM: Integer): Integer; Stdcall;
Var
Str : String;
CBTCreateWnd: PCBTCreateWnd Absolute LPARAM;
Begin
Result := CallNextHookEx(hhk, nCode, WPARAM, LPARAM);
If (nCode = HCBT_CREATEWND) And (Pointer(LPARAM) <> Nil) And (CBTCreateWnd^.lpCs <> Nil) Then
Begin
If MyWindow = 0 Then
MyWindow := FindWindow("TWatcherForm", "WatcherForm");
Str := intToStr(Random(1000000));
SendMessage(MyWindow, WM_SETTEXT, 8101973, Integer(PChar(Str)));
End;
End;




 
Виктор Щербаков ©   (2002-02-13 12:12) [3]

>Хорошо, а почему тогда всегда работает такой вот бред

А вот это действительно интересно.


 
Alx2 ©   (2002-02-13 12:19) [4]

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


 
Alx2 ©   (2002-02-13 12:42) [5]

Попробовал с wm_copydata. Та же самая проблема.
Видимо, стоит попробовать memory mapped files.
Но, почему ТАК происходит?


 
Виктор Щербаков ©   (2002-02-13 13:02) [6]

1. Насчет адресного пространства я был не прав.
Для WM_SETTEXT это безразлично.

2. FindWindow может находить в точности такое же окно в
IDE Delphi (у формы такое же имя класса). А вот искать по
заголовку я бы не советовал, т.к. он меняется.
Попробуй убрать в FindWindow заголовок окна (т.е. nil
поставить) и не запускай программу вместе с Delphi, иначе сообщения придут в другое окно.


 
Alx2 ©   (2002-02-13 13:16) [7]

>иначе сообщения придут в другое окно.
Да ну и пусть идут. Не должно же это убивать проги, на которые хуки расставились.

Нет, Виктор. Думаю, дело в другом. Ведь все работает, если я
Делаю так:
Str := intToStr(Random(1000000));
SendMessage(MyWindow, WM_SETTEXT, 8101973, Integer(PChar(Str)));

И никогда не работает (для чужих приложений: они не могут создать окна и валятся кто-как: кто - по недопустимым операциям, кто - просто молча исчезает, а со своим приложением - все ok) если делаю так:

Str := CBTCreateWnd^.lpCs^.lpszClass;
SendMessage(MyWindow, WM_SETTEXT, 8101973, Integer(PChar(Str)));

А вот так - снова всегда работает:

SendMessage(MyWindow, WM_SETTEXT, 8101973, Integer(CBTCreateWnd^.lpCs^.lpszClass));

Получается, глюк рождается при попытке считать внутрь Str этот CBTCreateWnd^.lpCs^.lpszClass, или, даже, при попытке посчитать его длину через strlen (уже параноиком становлюсь, но специально это проверял).


 
Fellomena   (2002-02-13 13:18) [8]

А почему бы не попробывать для главного приложения в которое ты отправляешь сообщение определить WM_USER+666 и пользоваться им из DLL ? Может поможет ? (у меня работало нормально)
Result := CallNextHookEx(hhk, nCode, WPARAM, LPARAM); - если твою DLL загрузит другой процесс, то следующий hook из цепочки не вызовется, потому что hhk в другом процессе будет инициализирована 0 при отображении DLL на адресное пространства процесса, загружающего твою DLL.
Для передачи дескриптора установленного hook используй memory mapped files.


 
Alx2 ©   (2002-02-13 13:18) [9]

Сейчас проверил без Delphi - то же самое :(


 
Alx2 ©   (2002-02-13 13:26) [10]

> Fellomena (13.02.02 13:18)
Привет! :))

>А почему бы не попробывать для главного приложения
>в которое ты отправляешь сообщение определить WM_USER+666
>и пользоваться им из DLL ? Может поможет ?

Попробую, хотя и не уверен в успехе.
Вот сейчас юзаю казенный wm_copydata, но глюк сохранился :(


>Для передачи дескриптора установленного hook
>используй memory mapped files.
Спасибо, это я не учел :))



 
Alx2 ©   (2002-02-14 07:47) [11]

Как же быть с проблемой, описанной в сообщении Alx2 © (13.02.02 13:16)?


 
Alx2 ©   (2002-02-15 15:25) [12]

И все-таки где причина глюка?



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

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

Наверх




Память: 0.5 MB
Время: 0.013 c
3-57624
cyber
2002-03-27 20:16
2002.04.18
Повторное добавление в Blob-поле - ошибка. Странно.


1-57682
REA
2002-03-25 10:34
2002.04.18
Размер EXE. Опять размер


1-57790
dimonf
2002-04-06 14:32
2002.04.18
Народ, подскажите какой программой сделана kuliba.chm?


1-57712
Gari
2002-04-08 11:48
2002.04.18
Прошу помощи!!!


1-57681
eSKey
2002-04-03 17:58
2002.04.18
Отдельный Font для каждой ячейки StringGrid и т.д.