Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.03.21;
Скачать: CL | DM;

Вниз

Как передать указатель на структуру из DLL   Найти похожие ветки 

 
Alexey Frolov ©   (2002-03-06 11:51) [0]

Я пишу глобальный HOOK на мышь. В главной программе надо отслеживать все ее перемешения.
Проблема в следующем: когда мышь находится над "cвоей" формой-все работает. Когда мышь выходит за пределы формы начинабтся проблемы.
Я попробовал 3 варианта передачи указателя на структуру tagMOUSEHOOKSTRUCT в сообщении.
1. tagMOUSEHOOKSTRUCT размещается вместе с глобальной информацией
В таком варианте комп отвисает

Type
PShareInf = ^TShareInf;
PMouseStruct = ^tagMOUSEHOOKSTRUCT;
TShareInf = Record
AppWndHandle: HWND;
KeyboardHookHandle: HHOOK;
MouseHookHandle: HHOOK;
hm:THandle;
KeyboardMsgId:integer;
MouseMsgId:integer;
pStruct:PMouseStruct;
cData:tagMOUSEHOOKSTRUCT;
End;

Function MouseHook(Code: Integer; ParamW: WPARAM; ParamL: LPARAM): LRESULT;stdcall;
Begin
If Code IN [HC_ACTION, HC_NOREMOVE] Then
Begin
/////////////////////////////////////////////////////////////////
ShareInf^.pStruct:=Pointer(ParamL);
ShareInf^.cData.pt.X:=ShareInf^.pStruct^.pt.X;
ShareInf^.cData.pt.Y:=ShareInf^.pStruct^.pt.Y;
/////////////////////////////////////////////////////////////////
SendMessage(ShareInf^.AppWndHandle,ShareInf^.MouseMsgId,integer(@ShareInf^.cData), Code);
End;
Result := CallNextHookEx(ShareInf^.KeyboardHookHandle, Code, ParamW, ParamL)
End;

2. Во 2 и 3 вариантах выдаются ошибки "Access violation"

Type
PShareInf = ^TShareInf;
PMouseStruct = ^tagMOUSEHOOKSTRUCT;
TShareInf = Record
AppWndHandle: HWND;
KeyboardHookHandle: HHOOK;
MouseHookHandle: HHOOK;
hm:THandle;
KeyboardMsgId:integer;
MouseMsgId:integer;
End;

Function MouseHook(Code: Integer; ParamW: WPARAM; ParamL: LPARAM): LRESULT;stdcall;
var
pStruct:PMouseStruct;
cData:tagMOUSEHOOKSTRUCT;
Begin
If Code IN [HC_ACTION, HC_NOREMOVE] Then
Begin
pStruct:=Pointer(ParamL);
cData.pt.X:=pStruct^.pt.X;
cData.pt.Y:=pStruct^.pt.Y;
SendMessage(ShareInf^.AppWndHandle, ShareInf^.MouseMsgId, integer(@cData), Code);
End;
Result := CallNextHookEx(ShareInf^.KeyboardHookHandle, Code, ParamW, ParamL)
End;

3.
Type
PShareInf = ^TShareInf;
PMouseStruct = ^tagMOUSEHOOKSTRUCT;
TShareInf = Record
AppWndHandle: HWND;
KeyboardHookHandle: HHOOK;
MouseHookHandle: HHOOK;
hm:THandle;
KeyboardMsgId:integer;
MouseMsgId:integer;
End;

Function MouseHook(Code: Integer; ParamW: WPARAM; ParamL: LPARAM): LRESULT;stdcall;
var
pStruct:PMouseStruct;
cData:tagMOUSEHOOKSTRUCT;
Begin
If Code IN [HC_ACTION, HC_NOREMOVE] Then
Begin
SendMessage(ShareInf^.AppWndHandle, ShareInf^.MouseMsgId, ParamL, Code);
End;
Result := CallNextHookEx(ShareInf^.KeyboardHookHandle, Code, ParamW, ParamL)
End;


Обработчик сообщения во всех случаях одинаков:
Procedure TMainForm.WM_MouseMessage(var Message: TMessage);
var
cData:tagMOUSEHOOKSTRUCT;
pStruct:PMouseStruct;
Begin
pStruct:=Pointer(Message.WParam);
cData.pt.X:=pStruct^.pt.X;
cData.pt.Y:=pStruct^.pt.Y;
Memo2.Lines.Clear();
Memo2.Lines.Add("Mouse Event");
Memo2.Lines.Add("X:="+IntToStr(cData.pt.X)+" Y:="+IntToStr(cData.pt.y));
End;


 
Виктор Щербаков ©   (2002-03-06 12:05) [1]

Я конечно весь постинг не прочитал (влом).
Но сразу замечание: указатели имеет смысл передавать, если передатчик (hook dll) и приемник (твоя программа) находятся в одном адресном пространстве. В случае глобального хука - это не верно (вернее верно только для 1-го процесса).

Вывод: передавать структуру целиком, например через FileMapping.


 
Alexey Frolov ©   (2002-03-06 12:15) [2]

Так и делалось в первом варианте.
ShareInf размещается через FileMapping:

Procedure DLLEntryPoint(dwReason: DWORD); stdcall;
Begin
Case dwReason Of
DLL_PROCESS_ATTACH:
Begin
MapHandle:=CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TShareInf), GlobMapID);
ShareInf:=MapViewOfFile(MapHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TShareInf));
End;
DLL_PROCESS_DETACH:
Begin
UnMapViewOfFile(ShareInf);
CloseHandle(MapHandle);
End
End;
End;


 
Виктор Щербаков ©   (2002-03-06 12:21) [3]


> Так и делалось в первом варианте.
> ShareInf размещается через FileMapping:


> Обработчик сообщения во всех случаях одинаков:

Вот в этом и проблема. Обработчик сообщения так же должен был работать с FileMapping.


 
Alexey Frolov ©   (2002-03-06 12:46) [4]

А как это сделать?


 
Fellomena   (2002-03-06 13:25) [5]

Делается это в твоём приложении точно так же как ты это в dll делал, главное и в dll и в главной проге использовать одно и то же имя для файлового отображения.
См. SDK по теме - всё просто.


 
Dimedrol ©   (2002-03-06 13:33) [6]

Я в своем большом проекте делаю так :

Беру указатель на мою структуру и

MF.PubIntMsg(M_REFRESHBONE,integer(MF.GetActiveBone));

Посылаю зарегистрированный MESSAGE с конвертнутым указателем,
потом принимаю его и вперед ! ;-)

Если заинтересовало, - спишемся по мылу, расскажу поподробнее...
могу код кинуть....


 
Alexey Frolov ©   (2002-03-06 13:45) [7]

Подсказка с FileMapping сработала. Большое всем спасибо. Тему можно считать закрытой.





Страницы: 1 вся ветка

Текущий архив: 2002.03.21;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.011 c
1-66871
evgen_2001
2002-03-05 16:53
2002.03.21
Передача файла по сокет-каналу.


6-66944
netter
2002-01-07 13:29
2002.03.21
Workgroup обычно


1-66922
sergey2
2002-03-06 13:41
2002.03.21
Hint, ComboBox


14-66974
Alibaba
2002-02-06 17:25
2002.03.21
Простая страничка


1-66879
Геральт
2002-03-05 19:41
2002.03.21
Как можно удалить папку?