请教一个内存映像的问题

slmax1 2010-01-06 10:30:00

unit DLL;

interface

uses
Windows,Messages;

function StartHook:Boolean;stdcall;
function EndHook:Boolean;stdcall;
function MouseProc(nCode:Integer;wParam:WPARAM;lParam:LPARAM):LongInt;stdcall;

const
WM_MYMESSAGE=WM_USER+1024;

//type
// PShareMem=^TShareMem;
// TShareMem=record
// DATA:TMouseHookStruct;
//end;

var
hMap:THandle;
pVoid:Pointer;
hMouseHook:HHOOK;
DATA:TMouseHookStruct;
IsHooked:Boolean;
implementation
//------------------------------------------------------------------------------

function MouseProc(nCode:Integer;wParam:WPARAM;lParam:LPARAM):LongInt;stdcall;
begin
Result:=0;
DATA:=PMouseHookStruct(lParam)^;
if nCode < 0 then
Result:=CallNextHookEx(hMouseHook,nCode,wParam,lParam);

SendMessage(FindWindow(nil,'取词'),WM_MYMESSAGE,wParam,0);
end;
//------------------------------------------------------------------------------
function StartHook:Boolean;stdcall;
begin
if IsHooked=False then
begin
hMouseHook:=SetWindowsHookEx(WH_MOUSE,@MouseProc,HInstance,0);
if hMouseHook<> 0 then
begin
IsHooked:=True;
Result:=True;
end
else
Result:=False;
end;
end;
//------------------------------------------------------------------------------
function EndHook:Boolean;stdcall;
begin
if IsHooked=True then
begin
UnhookWindowsHookEx(hMouseHook);
IsHooked:=False;
Result:=True;
end
else
Result:=False;
end;
//------------------------------------------------------------------------------



initialization
hMap:=CreateFileMapping($FFFFFFFF,
nil,
PAGE_READWRITE,
0,
SizeOf(DATA),
PChar('mymap'));

pVoid:=MapViewOfFile(hMap,FILE_MAP_ALL_ACCESS,0,0,0);
DATA:=PMouseHookStruct(pVoid)^;
finalization
UnMapViewOfFile(pVoid); {取消映射视图}
CloseHandle(hMap); {关闭映射文件句柄}

end.

这种数据传送方式为什么传送不了,接受方显示数据为0

而改成就能成功传送

unit DLL;

interface

uses
Windows,Messages;

function StartHook:Boolean;stdcall;
function EndHook:Boolean;stdcall;
function MouseProc(nCode:Integer;wParam:WPARAM;lParam:LPARAM):LongInt;stdcall;

const
WM_MYMESSAGE=WM_USER+1024;

type
PShareMem=^TShareMem;
TShareMem=record
DATA:TMouseHookStruct;
end;

var
hMap:THandle;
pVoid:Pointer;
hMouseHook:HHOOK;
ShareMem:PShareMem;
IsHooked:Boolean;
implementation
//------------------------------------------------------------------------------

function MouseProc(nCode:Integer;wParam:WPARAM;lParam:LPARAM):LongInt;stdcall;
begin
Result:=0;
ShareMem^.DATA:=PMouseHookStruct(lParam)^;
if nCode < 0 then
Result:=CallNextHookEx(hMouseHook,nCode,wParam,lParam);

SendMessage(FindWindow(nil,'取词'),WM_MYMESSAGE,wParam,0);
end;
//------------------------------------------------------------------------------
function StartHook:Boolean;stdcall;
begin
if IsHooked=False then
begin
hMouseHook:=SetWindowsHookEx(WH_MOUSE,@MouseProc,HInstance,0);
if hMouseHook<> 0 then
begin
IsHooked:=True;
Result:=True;
end
else
Result:=False;
end;
end;
//------------------------------------------------------------------------------
function EndHook:Boolean;stdcall;
begin
if IsHooked=True then
begin
UnhookWindowsHookEx(hMouseHook);
IsHooked:=False;
Result:=True;
end
else
Result:=False;
end;
//------------------------------------------------------------------------------



initialization
hMap:=CreateFileMapping($FFFFFFFF,
nil,
PAGE_READWRITE,
0,
SizeOf(ShareMem),
PChar('mymap'));

pVoid:=MapViewOfFile(hMap,FILE_MAP_ALL_ACCESS,0,0,0);
ShareMem:=PShareMem(pVoid);
finalization
UnMapViewOfFile(pVoid); {取消映射视图}
CloseHandle(hMap); {关闭映射文件句柄}

end.



是怎么回事,分不多,还望大家帮帮忙
...全文
127 13 打赏 收藏 举报
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
slmax1 2010-01-10
  • 打赏
  • 举报
回复
主要就是一点,内存映像过程中必须有一个拷贝数据的动作?我原来的是只是使用指针去指向,而没有拷贝数据进去。
slmax1 2010-01-10
  • 打赏
  • 举报
回复
已经测试完成,感谢Hexpate的指点。结贴
slmax1 2010-01-09
  • 打赏
  • 举报
回复
前面没有说清楚,不好意思
slmax1 2010-01-09
  • 打赏
  • 举报
回复
第一段,
//type
// PShareMem=^TShareMem;
// TShareMem=record
// DATA:TMouseHookStruct;
//end;
是注释了的,也就是说直接用DATA:TMouseHookStruct;传送数据,传递失败,主程序显示坐标值为0


第二段
type
PShareMem=^TShareMem;
TShareMem=record
DATA:TMouseHookStruct;
end;
没注释,也就是说用ShareMem:PShareMem;来传送数据,传递成功,主程序显示坐标值正常


使用的是内存映像来传送,
接收主程序我就没有放出来了,
反正定义和当前DLL中定义的是一样的,
还有一些细节的改动,
如第一段的DATA:=PMouseHookStruct(pVoid)^;
和第二段的ShareMem:=PShareMem(pVoid);
当然主程序也得跟着相应的改动。

slmax1 2010-01-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 hexpate 的回复:]
首先 DATA:TMouseHookStruct 这样的定义就是告诉delphi这个是一个结构体,对于结构体赋值都是采用拷贝的形式, 你好好看看你写的代码 ,以下2处
第一段中 DATA:=PMouseHookStruct(pVoid)^; 实际这句话代表了你申请的内存被你访问了一下, Data这个数据只是拷贝了你申请的内存里的值, 他并不是指向到这块内存区域. 再看你的mouseproc这句话
DATA:=PMouseHookStruct(lParam)^; 看到了吗, 你这次将lParam指向的内存的值拷贝到Data里了, 而不是你申请的那块内存的区域里, 这里你如果改成 PMouseHookStruct(Pvoid)^ = PMouseHookStruct(lParam)^;  那就ok了, 不然根本就不会写入到你申请的内存区域里
[/Quote]


非常感谢您的回复,等我星期一到单位的时候再去测试一下。家里没有拷贝程序。
Hexpate 2010-01-09
  • 打赏
  • 举报
回复
首先 DATA:TMouseHookStruct 这样的定义就是告诉delphi这个是一个结构体,对于结构体赋值都是采用拷贝的形式, 你好好看看你写的代码 ,以下2处
第一段中 DATA:=PMouseHookStruct(pVoid)^; 实际这句话代表了你申请的内存被你访问了一下, Data这个数据只是拷贝了你申请的内存里的值, 他并不是指向到这块内存区域. 再看你的mouseproc这句话
DATA:=PMouseHookStruct(lParam)^; 看到了吗, 你这次将lParam指向的内存的值拷贝到Data里了, 而不是你申请的那块内存的区域里, 这里你如果改成 PMouseHookStruct(Pvoid)^ = PMouseHookStruct(lParam)^; 那就ok了, 不然根本就不会写入到你申请的内存区域里
slmax1 2010-01-08
  • 打赏
  • 举报
回复
每日一顶
dd_zhouqian 2010-01-08
  • 打赏
  • 举报
回复
up
haitao 2010-01-08
  • 打赏
  • 举报
回复
最好能直接贴出2段代码的差别:
15,25,33,75,79行
hjkto 2010-01-07
  • 打赏
  • 举报
回复
up
slmax1 2010-01-07
  • 打赏
  • 举报
回复
每日一顶,希望有人来帮帮忙
slmax1 2010-01-07
  • 打赏
  • 举报
回复
是不是指传送数据的变量一定要是一个自定义数据结构,而不能是单独的一个变量?
slmax1 2010-01-06
  • 打赏
  • 举报
回复
是代码本身就出了问题吗?
相关推荐
发帖
Windows SDK/API

1177

社区成员

Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
帖子事件
创建了帖子
2010-01-06 10:30
社区公告
暂无公告