Форум: "WinAPI";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];
ВнизХук в разных ОС Найти похожие ветки
← →
Spawn (2003-10-30 15:53) [0]Сделал хук дял перехвата запуска одной проги. В ХП все нормально работает. Если же попробовать запустить прогу в 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.
← →
Digitman (2003-10-31 08:52) [1]
> она завершается с критической ошибкой
с какой ? конкретно и дословно ?
← →
minegod (2003-10-31 10:22) [2]а могет надо DataSize=SizeOf(ДВОРД), а не DataSize=SizeOf(Integer)?
← →
Dima_dvp (2003-11-01 00:36) [3]minegod:
Дельный совет:)
← →
Spawn (2003-11-04 13:56) [4]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:
Содержимое стека:
← →
Владислав (2003-11-04 15:07) [5]"
hHook:=MapViewOfFile(hMapFile, File_Map_Write, 0, 0,
"
DataSize);
hHook проверяй на nil.
← →
Spawn (2003-11-05 13:12) [6]Все равно та же ошибка.
← →
Владислав (2003-11-05 15:28) [7]КАКАЯ, ТА ЖЕ?
← →
Spawn (2003-11-06 05:02) [8]Да, та же
← →
Владислав (2003-11-06 09:15) [9]Не вижу я в приведенном коде подобную ошибку.
А так... Вот здесь:
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.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.011 c