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

Вниз

проблема с dll и hook   Найти похожие ветки 

 
Альберт ©   (2007-01-08 00:05) [0]

Доброй ночи!

Написал dllку, ставлю хуки. работаю с данными с помощью объекта файлового отображения. проблема в том, что при запуске 2х экземпляров программы hook перестает действовать..

привожу код, очень прошу помочь)))

library hook_dll2;

uses
 Windows,
 Messages;

const
 MMFName: PChar = "MyMMF2";

type
 PGlobalDLLData = ^TGlobalDLLData;
 TGlobalDLLData = packed record
   SysHook: HWND;
   detectwnd:HWND;
 end;

var
 GlobalData: PGlobalDLLData;
 MMFHandle: THandle;

function inttostr(int:integer):string;
var s:string;
begin
 str(int,s);
 inttostr:=s;
end;

function inttoPChar(int:integer):PChar;
begin
 inttoPChar:=PChar(inttostr(int));
end;

function getClassName(wnd:HWND):PChar;
var classname:array [0..127] of char;
begin
 windows.getclassname(wnd,classname,128);
 getClassName:=Pchar(String(classname));
end;

function getWindowName(wnd:HWND):PChar;
var windowname:array [0..127] of char;
begin
 windows.getwindowtext(wnd,windowname,128);
 getWindowName:=Pchar(String(windowname));
end;

function getClassNameStr(wnd:HWND):String;
var classname:array [0..127] of char;
begin
 windows.getclassname(wnd,classname,128);
 getClassNameStr:=(String(classname));
end;

procedure setwnd(wnd:HWND); export; stdcall;
begin
 GlobalData^.detectwnd:=wnd;
end;

function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
var Wnd,w: HWND;

begin
 if code = HC_ACTION then
 begin

 Wnd:=TMsg(Pointer(lParam)^).hwnd;

 if (WINDOWS.IsChild(GlobalData^.detectwnd, Wnd)) then
   begin

       if TMsg(Pointer(lParam)^).message = WM_RBUTTONDOWN then
         begin
               TMsg(Pointer(lParam)^).message := WM_NULL;
         end;

  if TMsg(Pointer(lParam)^).message =  WM_LBUTTONDOWN then
     begin
       ReleaseCapture;
       SendMessage(GlobalData^.detectwnd, WM_NCLBUTTONDOWN, htCaption, 0) ;
     end;

 end;

 end;

 Result:= CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
end;

procedure hook(switch : Boolean) export; stdcall;
begin
 if switch=true then
 begin
   GlobalData^.SysHook := SetWindowsHookEx(WH_GETMESSAGE {WH_MOUSE}, @SysMsgProc, HInstance, 0);
 end
 else
 begin

   UnhookWindowsHookEx(GlobalData^.SysHook)
 end;
end;

procedure OpenGlobalData();
begin

 MMFHandle:= CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName);

 GlobalData:= MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalDLLData));
 if GlobalData = nil then
   begin
     CloseHandle(MMFHandle);
   end;

end;

procedure CloseGlobalData();
begin
 UnmapViewOfFile(GlobalData);
 CloseHandle(MMFHandle);
end;

procedure DLLEntryPoint(dwReason: DWord); stdcall;
begin
 case dwReason of
   DLL_PROCESS_ATTACH: OpenGlobalData;
   DLL_PROCESS_DETACH: CloseGlobalData;
 end;
end;

exports hook, setwnd;

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


 
Альберт ©   (2007-01-08 00:07) [1]

setwnd устанавливает хэндл окна, события которого мы ловим
hook - ставим hook


 
kaZaNoVa ©   (2007-01-08 00:09) [2]

запрети запуск второй копии


 
Альберт ©   (2007-01-08 00:40) [3]

а каким образом можно сделать несколько экземпляров? менять MMFName?


 
Альберт ©   (2007-01-08 00:42) [4]

и вообще из-за чего проблема такая?


 
kaZaNoVa ©   (2007-01-08 01:09) [5]

Альберт ©   (08.01.07 0:40) [3]
менять MMFName?

имхо да


 
Альберт ©   (2007-01-08 19:05) [6]

поставил mmfname типа "mmf"+inttostr(random(10000)) вообще хуки перестали работать ((


 
Сергей М. ©   (2007-01-09 09:34) [7]


> при запуске 2х экземпляров программы


Какой программы-то ? Которая устанавливает/снимает хук или той которая создает потенциально интересующее окно ?


 
Альберт ©   (2007-01-09 21:19) [8]

программа просто устанавливает хук, окно принадлежит другому процессу.


 
MetalFan ©   (2007-01-09 21:37) [9]


>
> function inttoPChar(int:integer):PChar;
> begin
>  inttoPChar:=PChar(inttostr(int));
> end;


как-то не совсем корректный код, имхо.
с точки зрения выделения памяти...
запросто можете схватить AV.
кто память под PChar выделяет? никто.
по завершению процедуры указатель будет указывать в освобожденную память, мне кажется.


 
Альберт ©   (2007-01-09 23:21) [10]

сослаться на globaldata?


 
Альберт ©   (2007-01-09 23:33) [11]

да я и компилил dllки с разным именами без обработки inttostr. не выходит..(


 
Sleepeer   (2007-01-10 12:11) [12]

А зачем вообще тебе IntToStr? Эта же функция уже реализована.


 
Сергей М. ©   (2007-01-10 12:15) [13]


> программа просто устанавливает хук


И зачем нужны одновременно два или более экземпляров программы, которая "просто устанавливает хук" и более ничего не делает ?


 
trubin ©   (2007-01-10 12:52) [14]

Когда ты устанавливаешь 2-й хук, то в GlobalData^.SysHook пишется новый дескриптор, таким образом для первого дескриптора CallNextHookEx не вызывается.

ИМХО если нужно контролировать 2 или более окон нужно не ставить 2-й хук, а передавать dll-ке массив хендлов, и в SysMsgProc проверять их в цикле.


 
Альберт ©   (2007-01-10 21:59) [15]


> А зачем вообще тебе IntToStr? Эта же функция уже реализована.

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


> И зачем нужны одновременно два или более экземпляров программы,
>  которая "просто устанавливает хук" и более ничего не делает
> ?

программа и dll работают окнами приложения mshta, расширяют функциональность html и скриптов. среди расширения функиональности - функция перетаскивания окошка за его компонент (описано выше). а так как я делаю комплекс прог, которые работают с globaldata, то у меня и получилась такая проблема.


> Когда ты устанавливаешь 2-й хук, то в GlobalData^.SysHook
> пишется новый дескриптор, таким образом для первого дескриптора
> CallNextHookEx не вызывается.
>
> ИМХО если нужно контролировать 2 или более окон нужно не
> ставить 2-й хук, а передавать dll-ке массив хендлов, и в
> SysMsgProc проверять их в цикле.


GlobalData^.SysHook  - странно, что имеет один и тот же адрес.. что-то не то у меня..


 
GrayFace ©   (2007-01-12 03:18) [16]

Дать каждой проге свою dll-ку либо в MMF"ках(или чем-то другом) держать список всех ипользующих этот хук dll"ек и в dll проходить по ним в цикле.


 
Альберт ©   (2007-01-14 19:17) [17]

спасибо всем Вам большое! очень помогли! все сделал. отлично работает) даже сам не ожидал. а с пивом ночью как-то все стало на свои места))


 
Альберт ©   (2007-01-14 19:17) [18]

спасибо всем Вам большое! очень помогли! все сделал. отлично работает) даже сам не ожидал. а с пивом ночью как-то все стало на свои места))



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

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

Наверх




Память: 0.51 MB
Время: 0.048 c
2-1167199008
Sw
2006-12-27 08:56
2007.02.04
Индексы


15-1168801350
vasIzmax
2007-01-14 22:02
2007.02.04
Просто интересно


2-1169028099
vigo_
2007-01-17 13:01
2007.02.04
Выбор шрифта пользователем


2-1169206286
Ольчик
2007-01-19 14:31
2007.02.04
почему не работает exit


15-1168891620
DemonP
2007-01-15 23:07
2007.02.04
Инсталляция BDE