![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблемы с CreateFileMapping и MapViewOfFile [D7, Win95/98, Win2k, WinXP]
pmm © (2005-01-24 08:34:00)Ставлю хук в длл. Прога на всех платформах выдает ошибку типа "память не может быть рид" и проч. Сначала, правда работает 1-2 минуты. Делал по примеру из инета, пример также глючит. Почему так? А нельзя ли другой способ сделать - обратится к общей ячеи памяти разными экземплярами дллек.
И глучит на 98 на 2000 на ХП.
Eraser (2005-01-24 13:36:00) [21]Всё вроде верно, но мне кажется всё дело в передаче данных в приложение, попробуй упростить это всё и используй, например, сообщения.
И вообще бездействие пользователя ослеживается по-другому, не помню как, но недавно пример видел, там точно такого не было...
pmm (2005-01-24 13:25:00) [22]мне нужно отследить бездействие пользователя на компе. Здесь, в длл, при каждом событии мыши пытаюсь положить в память количество "системных" тиков в милисекундах.
В основной программе таймером каждую минуту считываю эту ячею и сравниваю с текщим положением дел, ну и прочее...
DLL:
library hookdll;
uses
Windows, Messages, SysUtils, Classes;
{$R *.res}
type
PGlobalDLLData = ^TGlobalDLLData;
TGlobalDLLData = packed record
Znach: DWord;
end;
const
MMFName: PChar = 'KeyMMFDrozd';
var
GlobalData: PGlobalDLLData;
MMFHandle: THandle;
Hm : THandle;
function hookm(c0de, wParam, lParam : integer): Lresult; stdcall;
begin
If c0de >= 0 Then
Begin
GlobalData^.Znach := GetTickCount();
End;
result := CallNextHookEx(Hm, c0de, wParam, lParam);
end;
function ShowMeTick:DWord; export; stdcall;
begin
result := GlobalData^.Znach;
end;
procedure sethook;export; stdcall;
begin
Hm:= SetWindowsHookEx(WH_MOUSE, @hookm, hInstance, 0);
if Hm = 0 then
messagebox(0,'Ошибка','ERROR',mb_iconhand);
end;
procedure removehook;export; stdcall;
begin
UnhookWindowsHookEx(Hm);
end;
//-----------------------------------------------------------------------------
procedure OpenGlobalData();
begin
MMFHandle:= CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(PGlobalDLLData), MMFName);
if MMFHandle = 0 then
begin
MessageBox(0, 'Can''t create FileMapping', 'from dll', 0);
Exit;
end;
GlobalData:= MapViewOfFile(MMFHandle, FILE_MAP_WRITE {FILE_MAP_ALL_ACCESS}, 0, 0, SizeOf(PGlobalDLLData));
if GlobalData = nil then
begin
CloseHandle(MMFHandle);
MessageBox(0, 'Can''t make MapViewOfFile', 'from dll', 0);
Exit;
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 name 'myhookset', //
removehook name 'myhookrem', //
ShowMeTick name 'showmetick'; //
//////////////////////////////////////////
begin
DLLProc:= @DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
GlobalData^.Znach := GetTickCount();
end.
Основная программа, например, такая:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, DateUtils, ComCtrls;
procedure SetHook; External 'hookdll.dll' name 'myhookset';
procedure UnSetHook; External 'hookdll.dll' name 'myhookrem';
function ShowMeTick:DWord; External 'hookdll.dll' name 'showmetick';
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Timer1: TTimer;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
SetHook;
Timer1.Interval := 1000;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
UnSetHook;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
Per: DWord;
begin
Per := (GetTickCount() - ShowMeTick);
Edit1.Text := IntToStr(Per);
end;
end.
Как кажется, все просто до безобразия, но что-то не работает :-(
Eraser (2005-01-24 12:28:00) [23]pmm
Скорее всего или ошибка с "общей" памятью (в хуках такое у новичков часто случается), или неправильная обработка кодов хука.
Короче приводи код вместе с глобальными переменными.
Digitman (2005-01-24 12:06:00) [24]
> pmm © (24.01.05 10:56) [2]
ты СВОЙ РЕАЛЬНЫЙ код приводи ! а не тот что брал за основу ..
pmm (2005-01-24 10:56:00) [25]какие же ошибки там? брал здесь
http://www.delphirus.net.ru/printout65.html
Digitman (2005-01-24 09:58:00) [26]
> Почему так?
потому что ошибки в алгоритме.
> А нельзя ли другой способ сделать - обратится к общей ячеи
> памяти разными экземплярами дллек
для этого как раз механизм MMF и предназначен