Форум: "Начинающим";
Текущий архив: 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.046 c