Форум: "WinAPI";
Текущий архив: 2008.04.06;
Скачать: [xml.tar.bz2];
ВнизПроблема с SetWindowsHookEx Найти похожие ветки
← →
APXi (2007-08-08 16:11) [0]Сначала прочитал несколько статей про хуки, сделал тестовый вариант, посмотрел несколько примеров и все с одним результатом, причем на 2 разных ПК. После установки мышиного хука, он посылает сообщения форме и все вроде бы номрально, но если запускать другие приложения в частности блокнот или explorer то пояляется ошибка, "Инструкция по адресу ХХХ обратилась к адресу ХХХ память не может быть read", причем ХХХ один и тотже адрес, как быть, уже 2 день бъюсь понять немогу. Помогите, пожалуйста.
const
MMFName: PChar = "MyMM11F"; // èìÿ îáúåêòà ôàéëîâîãî îòîáðàæåíèÿ
{ñòðóêòóðà, ïîëÿ êîòîðîé áóäóò îòîáðàæåíû â ôàéë ïîäêà÷êè}
type
PGlobalDLLData = ^TGlobalDLLData;
TGlobalDLLData = packed record
SysHook: HWND; // äåñêðèïòîð óñòàíîâëåííîé ëîâóøêè
HandleForm: HWND;
HookMessage: UINT;
end;
var
GlobalData: PGlobalDLLData;
MMFHandle: THandle;
function MyProcHook(Code: integer; wParam: word; lParam: Longint):LongInt; stdCall;
begin
if GlobalData <> nil
then begin
if code = HC_ACTION
then begin
SendMessage(GlobalData^.HandleForm, GlobalData^.HookMessage, wParam, lParam);
end;
result := CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam)//âûçûâàþ ñëåäóþùóþ ëîâóøêó
end
else result := 1;
end;
procedure SetHook(aHandle: HWND; aHookMessage: UINT);stdCall; Export;
begin
if GlobalData <> nil
then begin
GlobalData^.HandleForm := aHandle;
GlobalData^.HookMessage := aHookMessage;
GlobalData^.SysHook := SetWindowsHookEx(WH_MOUSE , @MyProcHook, hInstance, 0);//óñòàíàâëèâàþ õóê
end;
end;
← →
APXi (2007-08-08 16:14) [1]
procedure UnHook;stdCall;Export;
begin
if GlobalData <> nil
then UnhookWindowsHookEx(GlobalData^.SysHook);//ñíèìàþ õóê
end;
procedure OpenGlobalData();
begin
MMFHandle:= CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName);
if MMFHandle = 0
then MessageBox(0, "CreateFileMapping = 0", "Message from Exampel2/Process1", 0)
else GlobalData:= MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalDLLData));
if GlobalData = nil
then begin
CloseHandle(MMFHandle);
MessageBox(0, "Can""t make MapViewOfFile", "Message from Exampel2/Process1", 0);
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//ýêñïîðòèðóþ ôóíêöèè
SetHook,
Unhook;
begin
DLLProc:= @DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
← →
Lacmus © (2007-08-08 16:28) [2]
procedure DLLEntryPoint(dwReason: DWord);
stdcall нужно убрать, какая версия Delphi ?
← →
Сергей М. © (2007-08-08 16:37) [3]
> Сначала прочитал
Хво прочитал.
← →
APXi (2007-08-09 07:31) [4](2) 7 версия.
(3) Если такой умный, подскажи где ошибка
← →
Сергей М. © (2007-08-09 08:32) [5]
> подскажи где ошибка
Ну как где ?
По адресу ХХХ, очевидно)
Ты куда столько stdcall"ов понатыкал, по делу и без дела ?)
← →
APXi (2007-08-09 08:36) [6]Спасибо.
(5) Так было в примере.
← →
Сергей М. © (2007-08-09 08:59) [7]
> Так было в примере
А вот не надо слепо передирать примеры !)
Примеры даются прежде всего для внимательного изучения логики, а не для копирования один-в-один в надежде на "авось оно заработает".
1. Разбирайся с соглашениями о вызовах - какие, где, как, зачем и почему они должны или не должны быть указавны в каждом конкретном случае.
2. Код ошибки ХХХ может быть весьма информативен в плане поиска строки исх.текста, вызвавшего эту ошибку. Разбирайся с меню Search -> Find Error ..
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2008.04.06;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c