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

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

Проблемы с CreateFileMapping и MapViewOfFile [D7, Win95/98, Win2k, WinXP]


Страницы:   1 2

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 и предназначен


Страницы:   1 2

Наверх

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