我只能出这么多分了,大家来拿呀。。。。(300分)

  • 主题发起人 主题发起人 movax
  • 开始时间 开始时间
M

movax

Unregistered / Unconfirmed
GUEST, unregistred user!
unit Setlong;<br><br>interface<br><br>uses<br>&nbsp; SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,<br>&nbsp; Forms, Dialogs, Buttons, StdCtrls, ExtCtrls;<br>const<br>&nbsp; wTestMessage=WM_USER+200;<br><br>type<br>&nbsp; TInspecterform = class(TForm)<br>&nbsp; &nbsp; Panel1: TPanel;<br>&nbsp; &nbsp; Label1: TLabel;<br>&nbsp; &nbsp; edtn_Targetwindow: TEdit;<br>&nbsp; &nbsp; spb_Locate: TSpeedButton;<br>&nbsp; &nbsp; lbl_TargetHwnd: TLabel;<br>&nbsp; &nbsp; grb_Inspecter: TGroupBox;<br>&nbsp; &nbsp; Mmo_Inspecter: TMemo;<br>&nbsp; &nbsp; spb_Setproc: TSpeedButton;<br>&nbsp; &nbsp; spb_sendTestmessage: TSpeedButton;<br>&nbsp; &nbsp; spb_Unhook: TSpeedButton;<br>&nbsp; &nbsp; lbl_WndProcAddress: TLabel;<br>&nbsp; &nbsp; procedure spb_LocateClick(Sender: TObject);<br>&nbsp; &nbsp; procedure spb_SetprocClick(Sender: TObject);<br>&nbsp; &nbsp; procedure spb_sendTestmessageClick(Sender: TObject);<br>&nbsp; private<br>&nbsp; &nbsp; { Private declarations }<br>&nbsp; &nbsp; procedure Wndproc(var Msg :TMessage);override;<br>&nbsp; public<br>&nbsp; &nbsp; { Public declarations }<br>&nbsp; end;<br>var<br>&nbsp; Inspecterform: TInspecterform;<br>&nbsp; TargetHwnd :Integer;<br>&nbsp; TargetWindowproc :Pointer;<br>implementation<br>{$R *.DFM}<br><br>procedure TInspecterform.Wndproc(var Msg:TMessage);<br>begin<br>&nbsp; if Msg.Msg = wTestMessage then<br>&nbsp; ShowMessage('i got it');<br>&nbsp; inherited Wndproc(Msg);<br>end;<br><br>function InspecterWndProc(Handle:Hwnd;Msg,Wparam:Word;Lparam:LongInt):LongInt;<br>begin<br>{后来,这里我什么都不写,直接把消息传给被监控程序的wndproc,不过还是会报错}<br>Result := CallWindowproc(TargetWindowProc,TargetHwnd,Msg,Wparam,lparam);<br>end;<br><br>procedure TInspecterform.spb_LocateClick(Sender: TObject);<br>begin<br>{TargetHwnd是被监控程序的Hwnd}<br>TargetHwnd := FindWindow('TmainForm','mainform');<br>if TargetHwnd =0 then begin<br>&nbsp; ShowMessage('Can not Find the Target Window');<br>&nbsp; Exit;<br>end<br>else<br>&nbsp; lbl_TargetHwnd.Caption := 'TargetWindow Handle is : '+IntToHEX(TargetHwnd,4);<br>end;<br><br>procedure TInspecterform.spb_SetprocClick(Sender: TObject);<br>begin<br>TargetWindowproc := Pointer(SetWindowLong(TargetHwnd,GWL_WNDPROC,Longint(@InspecterWndProc)));<br>end;<br>procedure TInspecterform.spb_sendTestmessageClick(Sender: TObject);<br>begin<br>&nbsp; PostMessage(TargetHwnd,wTestMessage,0,0);<br>end;<br><br>end.<br>这段程序是在win31运行的,用来监控系统发给某个程序的所有消息的。<br>inspecterform是监控程序,mainform是被监控的。<br>用到了setwindowslong,和callwindowproc这两个api函数。<br><br>我能正确的得到mainform的wndproc的地址。但是如果maiform一响应消息,<br>win31就报genernal protect错误。<br><br><br>想了好久,还是解决不了。请大家帮忙。
 
是不是忘记输出窗口处理函数了? by the way 那个 delphi1.0 的问题是不是你问的?
 
不知道win3.1下有没有进程空间的概念,即每个进程在它自己的内存空间中运行,如果有的<br>话,那你子类化的新窗口过程与被监视程序各自的代码,只能在各自的空间中运行,这样会<br>引起内存访问冲突,必须把你的代码注入被监视进程的空间才行。另外,win3.1 下窗口过程<br>入口的指针是不是 16 位的?如果是那用 32 位的 Pointer 可能不行。
 
to mikedeakkins: delphi1.0那个问题是我问的,我已经解决了。但是我还不知道是什么原因。<br>“是不是忘记输出窗口处理函数了?” 怎么输出?在哪里输出?<br><br>bbxkxjy兄所言极是,你说的在win&gt;3.1的情况<br>win3.1的所有进程共享一个内存空间,这也是win3.1容易造成内存访问违规的原因。<br>入口指针的定义delphi1.0的帮组就是那样写的。<br><br><br><br>问题我现在还没解决那,大家帮忙呀。
 
回调函数必须输出。加上 export。
 
加了也没用哦。<br><br>我用softice跟踪了一下,发现问题在这里:<br>&nbsp;被监控的control,在没有修改它的wndproc的情况,<br>Handle &nbsp; &nbsp;Calss &nbsp; &nbsp; &nbsp;wndProc<br>53C8(2) &nbsp; TMemo &nbsp; &nbsp; 3637:03D4<br>&nbsp;修改它的wndproc以后的情况,<br>Handle &nbsp; &nbsp;Calss &nbsp; &nbsp; &nbsp;wndProc<br>53C8(2) &nbsp; TMemo &nbsp; &nbsp; 18F7:0816<br>U 18F7:0816 后,这里确实是我为被监控的control定义的新的winproc地址。<br>在修改它的wndproc后,我让它获得焦点。于是激活了softice我定义的断点,进入18F7:0816,于是我就用了F10命令n次,发现一直在里面打转。<br>然后在用F8,根本没有调用到3637:03D4地址。<br><br>问题就出在这里,<br>&nbsp;正常:本来新的wndproc在做完处理后,把message传给old wndproc处理,<br>&nbsp; 它再处理完后,控制权交回给win31。<br>&nbsp;我的错误:新的wndproc在做完处理后,没有把message传给old wndproc处理,但是我在程序里已经用callwndproc(原来的wndproc,xxx,xx,xx)。是不是callwndproc写错了呢?<br>我看了半天都每看出我写的callwndproc错在哪里?<br><br>哎。。。。高手帮忙呀。。。。。
 
我又调了一个晚上还是没办法。哎。。。
 
高手们都休假了吗?真的这么难?
 
试试把 InspecterWndProc 中改成:<br>&nbsp; Result := CallWindowproc(TargetWindowProc,Handle,Msg,Wparam,lparam);<br>也许你已试过了。看不出问题了 :(<br>
 
版主:amo, cAkk 请帮忙看看。。。。。。 :(...
 
http://www.delphibbs.com/delphibbs/rules.asp
 
后退
顶部