Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Переменные и ловушка в DLL

Автор: inoplanetanin 9.11.2010 16:39

Помогите азобраться, не выводится переменная в DLL
Вот исходник DLLки которая не работает:

library hookDLL;
uses
Windows, Messages,Sysutils,Dialogs;
var
S:string;
SysHookMsg: HHOOK = 0 ;
H : THandle;
procedure fff;
begin
ShowMessage(S);
//Должно выводить чем стало 'S' в процедуре SendString
end;
procedure SendString(P:pchar); stdcall; export;
begin
S:=StrPas(P);
end;
function hook( Code: Integer; WParam: wParam; Msg: PCWPStruct): longint; stdcall;
var h:hwnd;
WindowName:array[0..MAX_PATH-1] of char;
begin
h:=0;
result := CallNextHookEx( h, Code, WParam, Longint( Msg ));
case Msg^.message of
WM_PAINT: begin
GetWindowText(Msg^.hwnd,@WindowName,MAX_PATH);
if WindowName='искомое окно' then fff;
end;
end;
End;
procedure SetKeyHook; stdcall; export;
begin
if h=0 then H:= SetWindowsHookEx(WH_CALLWNDPROC, @hook, hInstance, 0);
end;
procedure DelKeyHook; stdcall; export;
begin
if SysHookMsg <> 0 then UnhookWindowsHookEx(SysHookMsg);
end;
exports
SetKeyHook, DelKeyHook,SendString;
Begin
//
S:='Загрузли Dll'
end.


В програме пишу
...
{$R *.dfm}
procedure SetKeyHook;stdcall; external 'hookDLL.dll';
procedure DelKeyHook;stdcall; external 'hookDLL.dll';
procedure SendString(P:pchar); stdcall; external 'hookDLL.dll' name 'SendString';
procedure TForm1.FormCreate(Sender: TObject);
begin
SetKeyHook;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
DelKeyHook;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
S:string;
begin
S:='Эта строка должна появится когда откроется искомое окно';
SendString(pchar(S));
end;

...

Автор: volvo 9.11.2010 17:32

Почему именно хук WH_CALLWNDPROC используешь для отлова одного сообщения, а не WH_GETMESSAGE (насколько я помню, на social.msdn.microsoft.com было несколько тем с жалобами на то, что из WH_CALLWNDPROC сообщение перерисовки либо не ловится вообще, либо ловится крайне нестабильно)?

Автор: inoplanetanin 9.11.2010 20:07

Windows calls a WH_CALLWNDPROC hook procedure before passing the message to the receiving window procedure.
Какя понял отлавливает событие после отработки сообщения, а WH_GETMESSAGE до.

Автор: volvo 9.11.2010 22:06

Цитата
Какя понял отлавливает событие после отработки сообщения
Ну вот сам же написал, что
Цитата
Windows calls a WH_CALLWNDPROC hook procedure before passing the message to the receiving window procedure.
, а теперь говоришь, что после... Сначала сообщение приходит в хук, потом - в оконную процедуру. Именно поэтому с помощью WH_CALLWNDPROC можно отменить обработку сообщения. Если б было наоборот - то обработку отменить было бы невозможно.

Тебе чего надо вообще? Чтоб по КАЖДОМУ событию WM_PAINT выскакивал твой MessageBox?

Автор: inoplanetanin 10.11.2010 12:51

Цитата(volvo @ 9.11.2010 18:06) *

...
Тебе чего надо вообще? Чтоб по КАЖДОМУ событию WM_PAINT выскакивал твой MessageBox?

Мне нужно чтобы по событию в конкретном окне, выскакивал месадж показывающий переменную S значение которой было принято в процедуре SendString.

Автор: inoplanetanin 10.11.2010 13:11

Проблема в том что код у dll общий для всех процессов, а данные нет.
При наступлении события процедура fff невидит изменения проишедшие с переменной S в процедуре SendString, хотя видит те значения которые были при загрузки DLL

Автор: volvo 10.11.2010 15:41

Цитата
Проблема в том что код у dll общий для всех процессов, а данные нет.
Поэтому придумали Shared Memory ( пример - здесь: http://forum.pascal.net.ru/index.php?s=&showtopic=26398&view=findpost&p=147691 )

Автор: inoplanetanin 13.11.2010 0:23

Цитата(volvo @ 10.11.2010 11:41) *

Поэтому придумали Shared Memory ( пример - здесь: http://forum.pascal.net.ru/index.php?s=&showtopic=26398&view=findpost&p=147691 )

Если не трудно можешь дополнить код моей dll? Там же как я понимаю немного кода.

Автор: volvo 13.11.2010 0:42

Я сейчас не под Windows, как будет возможность - сделаю и покажу (очень не хочется выкладывать неработающее решение; такие вещи, как хуки, нужно проверять)

Автор: inoplanetanin 13.11.2010 4:51

Цитата(volvo @ 12.11.2010 20:42) *

Я сейчас не под Windows, как будет возможность - сделаю и покажу (очень не хочется выкладывать неработающее решение; такие вещи, как хуки, нужно проверять)

Отлично, буду ждать.

Автор: volvo 13.11.2010 6:39

Нет, вот как раз ждать ничего не надо. Ты для начала все-же задачу уточни.

Есть у меня приложение, которое устанавливает ловушку. Это ясно. Есть второе приложение (создающее окно с определенным заголовком), которое будет запущено после установки ловушки. Это тоже понятно. А вот дальше все НЕпонятно. Запустил я второе приложение. И что должно произойти? В какой момент? Только вот не надо говорить "чтобы по событию в конкретном окне выскакивал мессадж". Ты представляешь, сколько событий получает окно? Смотри: ловишь ты WM_PAINT, например, куда же проще, казалось бы. Ага. Щаззз. Поймал WM_PAINT -> должно вылететь сообщение в виде окошка с текстом. Но это ж пошлет очередной WM_PAINT твоему окну (прямо в момент обработки хука, заметь), а тут и до зависания системы - рукой подать. Вылетит у тебя эксплорер раз 15, потом начнешь думать над постановкой задачи? Или ты надеешься, что я за тебя буду ловить глюки, а ты будешь ждать, пока отлаженное приложение появится здесь? Не будет этого.

Уточняй, В КАКОЙ МОМЕНТ должно ловиться окно, и почему это твое приложение должно посылать строку в DLL, а не может просто напросто запомнить строку прямо в себе, при открытии нужного тебе окна хук тихо-мирно высылает установившему его приложению заранее обговоренное сообщение (см. выше по ссылке), а уж твое приложение, когда получает это сообщение, вообще что хочет то и делает.

Думай, уточняй... Ну, или лови перезагрузки эксплорера сам, я не мазохист, чтоб делать себе же проблемы. Задачу "в лоб/напролом" в том виде как ты ее поставил, я решать не буду. Твоя задача решается совершенно по другому, без необходимости во всех этих наворотах. Возможно, у тебя есть какая-то другая задача, но тогда тебе сюда нужно: http://www.gunsmoker.ru/2008/10/x-y-z.html

Автор: inoplanetanin 18.11.2010 1:03

Цитата(volvo @ 13.11.2010 2:39) *
...Уточняй, В КАКОЙ МОМЕНТ должно ловиться окно, и почему это твое приложение должно посылать строку в DLL, а не может просто напросто запомнить строку прямо в себе, при открытии нужного тебе окна хук тихо-мирно высылает установившему его приложению заранее обговоренное сообщение (см. выше по ссылке), а уж твое приложение, когда получает это сообщение, вообще что хочет то и делает. ...

Так и сделал но пришлось работать с файлами, а это значительно замедлило всю работу.(при отправке сообщения из программы сохраняю переменную в файле, затем по событию работаю с этим файлом в dll-ке, а после отправлю обратно в программу запрос на повторную операцию). С переменной было бы гораздо проще.
Спасибо за интересную статью о http://www.gunsmoker.ru/2008/10/x-y-z.html