内存映射文件的问题(50分)

  • 主题发起人 主题发起人 coolbaby
  • 开始时间 开始时间
C

coolbaby

Unregistered / Unconfirmed
GUEST, unregistred user!
下面是调用hook时用到的一段代码,
里面这段代码主要是什么作用?

// In the entry point proc we create or destroy the file mapping in which we store the
// hook ID and the handle of our main window according to whether we're attaching or
// detaching
procedure EntryPointProc(Reason: Integer);
const
hMapObject: THandle = 0;

begin
case reason of
DLL_PROCESS_ATTACH:
begin
hMapObject := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(THookRec), '_CBT');
rHookRec := MapViewOfFile(hMapObject, FILE_MAP_WRITE, 0, 0, 0);
end;

DLL_PROCESS_DETACH:
begin
try
UnMapViewOfFile(rHookRec);
CloseHandle(hMapObject);
except
end;
end;
end;
end;

// we have to tell the DLL where our entry point proc is and call it as an attach
begin
DllProc := @EntryPointProc;
EntryPointProc(DLL_PROCESS_ATTACH);
end.

 
dll中用来保存全局变量的
如果不用内存镜像,那么每个进程调用这个dll,变量都会重新初始化
一些自己要保存的状态就不对了
 
在钩子函数所在的DLL文件中,需要使用共享内存,即,所有的记录存储在同一个
数据段中。为什么要这样做呢?这是因为Windows95的DLL调用方法与Windows3.X的
方法不同。每个进(线)程在登录某动态连接库时都会为该动态连接库传入一个新
的实例句柄(即DLL数据段的句柄)。这使得DLL各个实例之间互不干扰,但是这对
那些所有DLL实例共享一组变量带来一些困难。为了解决这个问题,我们在这儿通过
建立内存映射文件的方法来解决。即使用Windows的OpenFileMapping、
CreateFileMapping和MapViewOfFile三个函数来实现。
我以前做的一个鼠标钩子就是因为没有使用内存共享,只能捕获本窗体内的鼠标信息。
使用内存共享后,才可以捕获到所有的信息。
 
to pclb:
你的鼠标钩子程序能不能发给我一份?

在unit windows为什么有wh_mouse没有wh_mouse_ll,但是在msdn中setwindowshookex()帮助
中有wh_mouse and wh_mouse_ll,我想做个鼠标钩子程序,但是wh_mouse_ll在unit windows
里没有定义,怎么办?
 
ok,收衣服
有些概念还是看vc的资料更好理解
分少了点,不好意思
:)
 
后退
顶部