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

Вниз

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 вся ветка

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

Наверх





Память: 0.47 MB
Время: 0.005 c
1-57690
lipskiy
2002-04-07 15:34
2002.04.18
Как определить доступность каталога для записи?


1-57665
VID
2002-04-03 23:02
2002.04.18
Чтение значения переменной, созданной другой программой


14-57886
lipskiy
2002-03-10 00:54
2002.04.18
Реально ли собрать народ на рисковое мероприятие?


1-57705
al creator
2002-04-04 22:05
2002.04.18
ВОПРОС! НАДО при определённом событии активировать окно


1-57695
snoup
2002-04-07 21:49
2002.04.18
Как нарисовать что-нибудь на твоей форме?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский