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

Вниз

проблема с 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.044 c
2-1169369909
Strate
2007-01-21 11:58
2007.02.04
Автосоздание объекта


2-1169158460
AlexeyT
2007-01-19 01:14
2007.02.04
Печать TImage/TBitmap?


2-1169198242
Extar
2007-01-19 12:17
2007.02.04
Не сворачивается главная форма.


15-1167243972
tesseract
2006-12-27 21:26
2007.02.04
ННМП


2-1168862299
Barma
2007-01-15 14:58
2007.02.04
DrawGrid





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