Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Хук в разных ОС [D7, Win95/98, WinME, NT4, Win2k, WinXP]


Spawn ©   (2003-10-30 15:53:00) 

Сделал хук дял перехвата запуска одной проги. В ХП все нормально работает. Если же попробовать запустить прогу в 98 или МЕ, то она завершается с критической ошибкой. Причем в Хуке я учел, что до Win 2000 нужно было его Хендл делать доступным для всех процессов, например через Memory Mapped Files.

Вот код, работающий в ХП:

library ArtHook;

uses UArtHook;

exports
GetID,
SetHook,
FreeHook;

begin
end.



unit UArtHook;

interface

uses
SysUtils,
Windows,
UVariables;
{Dialogs;}

const
DataSize=SizeOf(Integer);
HookHandleName="hHookHandleName";

var
hHook:PHandle;
hMapFile:THandle;
Hooked:Boolean=False;

function GetID:integer;stdcall;
function SetHook:Boolean; stdcall;
function FreeHook:Boolean; stdcall;

implementation

function CBTProc(Code:integer;wParam:Integer;lParam:Integer):longint; stdcall;
var
ClassName:array[0..255] of AnsiChar;
hFile:THandle;
wPrm:Integer;
begin
if code < 0 then
begin
Result:=CallNextHookEx(hHook^, Code, wParam, lParam);
Exit;
end;

case Code of
HCBT_CREATEWND:
begin
GetClassName(wParam, ClassName, 256);

if (AnsiCompareStr(ClassName, XXX_MAIN_CLASS)=0) then
begin
Result:=1;
CallNextHookEx(hHook^, Code, wParam, lParam);
Exit;
end;

if (AnsiCompareStr(ClassName, XXX_MAIN_CLASS)=0) then
begin
if (FindWindow(XXX_MAIN_CLASS, nil)=0) then
begin
try
hFile:=CreateFile(FileName, GENERIC_READ or GENERIC_WRITE,
0 ,nil,OPEN_EXISTING,0,0);
wPrm:=Integer(GetFileSize(hFile,nil)=XXX_FILE_SIZE);
SendMessage(FindWindow("какая - то прога",nil),WM_XXX_FS_INVALID, wPrm, 0);
finally
CloseHandle(hFile);
end;
end
else
begin
Result:=1;
CallNextHookEx(hHook^, Code, wParam, lParam);
Exit;
end;
end;

end;
end;

Result:=CallNextHookEx(hHook^, Code, wParam, lParam);
end;

function SetHook:Boolean; stdcall;
begin
hHook^:=SetWindowsHookEx(WH_CBT, @CBTProc, hInstance, 0);
Result:=hHook^<>0;
end;

function FreeHook:Boolean; stdcall;
begin
Result:=UnhookWindowsHookEx(hHook^);
end;

initialization
hMapFile:=CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE,
0, DataSize, HookHandleName);
if hMapFile=0 then
raise Exception.Create("Error MMF Handle");
hHook:=MapViewOfFile(hMapFile, File_Map_Write, 0, 0,
DataSize);

finalization
UnMapViewOfFile(hHook);
CloseHandle(hMapFile);

end.


Владислав   (2003-11-06 09:15:00) [1]

Не вижу я в приведенном коде подобную ошибку.

А так... Вот здесь:
try
hFile:=CreateFile(FileName, GENERIC_READ or GENERIC_WRITE,
0 ,nil,OPEN_EXISTING,0,0);
wPrm:=Integer(GetFileSize(hFile,nil)=XXX_FILE_SIZE);
SendMessage(FindWindow("какая - то прога",nil), WM_XXX_FS_INVALID, wPrm, 0);
finally
CloseHandle(hFile);
end;

замени на:
hFile:=CreateFile(FileName, GENERIC_READ or GENERIC_WRITE,
0 ,nil,OPEN_EXISTING,0,0);
try
wPrm:=Integer(GetFileSize(hFile,nil)=XXX_FILE_SIZE);
SendMessage(FindWindow("какая - то прога",nil), WM_XXX_FS_INVALID, wPrm, 0);
finally
CloseHandle(hFile);
end;

иначе ты можешь закрывать хендл неоткрытого файла (если здесь CreateFile произошла ошибка).
Ну и попробуй SendMessage заменить на PostMessage.


Spawn   (2003-11-06 05:02:00) [2]

Да, та же


Владислав   (2003-11-05 15:28:00) [3]

КАКАЯ, ТА ЖЕ?


Spawn   (2003-11-05 13:12:00) [4]

Все равно та же ошибка.


Владислав   (2003-11-04 15:07:00) [5]

" hHook:=MapViewOfFile(hMapFile, File_Map_Write, 0, 0,
DataSize);
"

hHook проверяй на nil.


Spawn   (2003-11-04 13:56:00) [6]

Digitman ©
Вот что пишет при возниконовении ошибки:
Программа AUTORIZATOR вызвала сбой при обращении к странице памяти
в модуле <нет данных> по адресу 0000:00000000.
Регистры:
EAX=00000000 CS=0000 EIP=00000000 EFLGS=00000000
EBX=00000000 SS=0000 ESP=00000000 EBP=00000000
ECX=00000000 DS=0000 ESI=00000000 FS=0000
EDX=00000000 ES=0000 EDI=00000000 GS=0000
Байты по адресу CS:EIP:

Содержимое стека:


Dima_dvp   (2003-11-01 00:36:00) [7]

minegod:
Дельный совет:)


minegod   (2003-10-31 10:22:00) [8]

а могет надо DataSize=SizeOf(ДВОРД), а не DataSize=SizeOf(Integer)?


Digitman   (2003-10-31 08:52:00) [9]


> она завершается с критической ошибкой


с какой ? конкретно и дословно ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо