![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
проблема с dll и hook [D7, WinXP]
Альберт © (2007-01-08 00:05:00)Доброй ночи!
Написал 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-14 19:17:00) [1]спасибо всем Вам большое! очень помогли! все сделал. отлично работает) даже сам не ожидал. а с пивом ночью как-то все стало на свои места))
Альберт (2007-01-14 19:17:00) [2]спасибо всем Вам большое! очень помогли! все сделал. отлично работает) даже сам не ожидал. а с пивом ночью как-то все стало на свои места))
GrayFace (2007-01-12 03:18:00) [3]Дать каждой проге свою dll-ку либо в MMF'ках(или чем-то другом) держать список всех ипользующих этот хук dll'ек и в dll проходить по ним в цикле.
Альберт (2007-01-10 21:59:00) [4]
> А зачем вообще тебе IntToStr? Эта же функция уже реализована.
она же в sysutils кажется реализована. моя программа должна иметь маленький размер, поэтому не пользуюсь чем-то готовым а с нуля пишу.
> И зачем нужны одновременно два или более экземпляров программы,
> которая "просто устанавливает хук" и более ничего не делает
> ?
программа и dll работают окнами приложения mshta, расширяют функциональность html и скриптов. среди расширения функиональности - функция перетаскивания окошка за его компонент (описано выше). а так как я делаю комплекс прог, которые работают с globaldata, то у меня и получилась такая проблема.
> Когда ты устанавливаешь 2-й хук, то в GlobalData^.SysHook
> пишется новый дескриптор, таким образом для первого дескриптора
> CallNextHookEx не вызывается.
>
> ИМХО если нужно контролировать 2 или более окон нужно не
> ставить 2-й хук, а передавать dll-ке массив хендлов, и в
> SysMsgProc проверять их в цикле.
GlobalData^.SysHook - странно, что имеет один и тот же адрес.. что-то не то у меня..
trubin (2007-01-10 12:52:00) [5]Когда ты устанавливаешь 2-й хук, то в
GlobalData^.SysHookпишется новый дескриптор, таким образом для первого дескриптораCallNextHookExне вызывается.
ИМХО если нужно контролировать 2 или более окон нужно не ставить 2-й хук, а передавать dll-ке массив хендлов, и вSysMsgProcпроверять их в цикле.
Сергей М. (2007-01-10 12:15:00) [6]
> программа просто устанавливает хук
И зачем нужны одновременно два или более экземпляров программы, которая "просто устанавливает хук" и более ничего не делает ?
Sleepeer (2007-01-10 12:11:00) [7]А зачем вообще тебе IntToStr? Эта же функция уже реализована.
Альберт (2007-01-09 23:33:00) [8]да я и компилил dllки с разным именами без обработки inttostr. не выходит..(
Альберт (2007-01-09 23:21:00) [9]сослаться на globaldata?
MetalFan (2007-01-09 21:37:00) [10]
>
> function inttoPChar(int:integer):PChar;
> begin
> inttoPChar:=PChar(inttostr(int));
> end;
как-то не совсем корректный код, имхо.
с точки зрения выделения памяти...
запросто можете схватить AV.
кто память под PChar выделяет? никто.
по завершению процедуры указатель будет указывать в освобожденную память, мне кажется.
Альберт (2007-01-09 21:19:00) [11]программа просто устанавливает хук, окно принадлежит другому процессу.
Сергей М. (2007-01-09 09:34:00) [12]
> при запуске 2х экземпляров программы
Какой программы-то ? Которая устанавливает/снимает хук или той которая создает потенциально интересующее окно ?
Альберт (2007-01-08 19:05:00) [13]поставил mmfname типа 'mmf'+inttostr(random(10000)) вообще хуки перестали работать ((
kaZaNoVa (2007-01-08 01:09:00) [14]Альберт © (08.01.07 0:40) [3]
менять MMFName?
имхо да
Альберт (2007-01-08 00:42:00) [15]и вообще из-за чего проблема такая?
Альберт (2007-01-08 00:40:00) [16]а каким образом можно сделать несколько экземпляров? менять MMFName?
kaZaNoVa (2007-01-08 00:09:00) [17]запрети запуск второй копии
Альберт (2007-01-08 00:07:00) [18]setwnd устанавливает хэндл окна, события которого мы ловим
hook - ставим hook