delphi2007 教程

delphi2007 教程

首页 新随笔 联系 聚合 管理
  1013 Posts :: 0 Stories :: 28 Comments :: 0 Trackbacks
钩子报内存错误。。急。。。 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061124122024177.html
我在DLL里定义一个鼠标钩子,可是在鼠标点击某些窗口后,会报内存异常,通常是点了某个窗口之后的时候,就报错误,显示“指定内存引用0xxxxxx   ,该内存不能written”我的系统是xp,用的是delphi2006。大家指点一下,到底是什么原因,急死我了。。。。    
  先谢谢大家了。  
 

应该钩子代码那里有问题,把代码贴出来看看...

2006   LS的就用了一段时间~   异常看你参数正确不正确   还有你的异常执行到哪   光说错误别人无法解决你的问题啊

我的代码是这样的:  
  unit   unithook;  
   
  interface  
  uses   windows,Messages,Udllconst,SysUtils,Graphics,Classes,Dialogs;  
   
  var  
  h:   HHook;  
  hMappingFile:   THandle;  
  PShMem:   PShareMem;  
   
  function   StartHook(sender:   HWND;messageID:   LongInt):boolean;stdcall;  
  function   StopHook:boolean;stdcall;  
   
  implementation  
   
  function   hookproc(nCode:   Integer;wParam:   WPARAM;lParam:   LPARAM):LRESULT;stdcall;  
  var  
      aRect,R   :TRect;//reRect:   TRect;  
      dc:   hdc;  
      Mycan:   TCanvas;  
      Mybmp:   TBitmap;  
  begin  
      Result   :=   0;  
      if   nCode   <   0   then  
          Result   :=   CallNextHookEx(h,nCode,wparam,lparam);  
      case   wparam   of  
          WM_LBUTTONDOWN,WM_NCLBUTTONDOWN   :  
              begin  
                  if   pShMem^.data1[1]   =   pMOUSEHOOKSTRUCT(lparam)^.hwnd   then  
                              exit;  
                  if   not   pShMem^.SeCapBMP   then  
                      begin  
                           
                          if   (pMOUSEHOOKSTRUCT(lparam)^.pt.X   >   pShMem^.SeRect.Left)     and  
                                (pMOUSEHOOKSTRUCT(lparam)^.pt.X   <   pShMem^.SeRect.Right)   and  
                                (pMOUSEHOOKSTRUCT(lparam)^.pt.Y   >   pShMem^.SeRect.Top)       and  
                                (pMOUSEHOOKSTRUCT(lparam)^.pt.Y   <   pShMem^.SeRect.Bottom)   then  
                              begin  
                                  //Showmessage('222');  
                                  pShMem^.data2:=pMOUSEHOOKSTRUCT(lparam)^;  
                                  aRect   :=   Rect(pShMem^.SeRect.Left+3,pShMem^.SeRect.Top+3,pShMem^.SeRect.Right-2,pShMem^.SeRect.Bottom-2);  
                                  Mybmp   :=   Tbitmap.Create;  
                                  if   (pShMem^.MyHandle   =0)or(pShMem^.MyHandle   <>   pShMem^.data2.hwnd)   then  
                                      begin  
                                          //reRect   :=   Rect(aRect.Left-3,aRect.Top-3,aRect.Right+3,arect.Bottom+3);  
                                          //ShowMessage('111');  
                                          Mycan   :=   TCanvas.Create;  
                                          dc   :=   GetWindowDC(0);  
                                          try  
                                              Mycan.Handle   :=   dc;  
                                              Mybmp.Width   :=   aRect.Right   -   aRect.Left;  
                                              Mybmp.Height   :=   aRect.Bottom   -   aRect.Top;  
                                              R   :=   Rect(0,0,Mybmp.width,Mybmp.Height);  
                                              Mybmp.Canvas.CopyRect(R,   Mycan,aRect);  
                                          finally  
                                              releaseDC(0,   DC);  
                                          end;  
                                          Mycan.Handle   :=   0;  
                                          Mycan.Free;  
                                          Inc(pShMem^.BMPIndex);  
                                          pShMem^.MyHandle   :=   pShMem^.data2.hwnd;  
                                      end  
                                  else  
                                      Mybmp.LoadFromFile('D:\program\DemoCreator截屏预研\output\copy'+IntToStr(pShMem^.BMPIndex)+'.BMP');  
                                  Mybmp.Canvas.Pen.Color   :=   clBlue;  
                                  Mybmp.Canvas.Brush.Style   :=   BsClear;  
                                  Mybmp.Canvas.Rectangle(Rect(pShMem^.data2.pt.X-aRect.Left-3,pShMem^.data2.pt.Y-aRect.Top-3,pShMem^.data2.pt.X-aRect.Left+28,pShMem^.data2.pt.Y-aRect.Top+15));  
                                  Mybmp.Canvas.TextOut(pShMem^.data2.pt.X-aRect.Left,pShMem^.data2.pt.Y-aRect.Top,'Click');  
                                  Mybmp.SaveToFile('D:\program\DemoCreator截屏预研\output\copy'+IntToStr(pShMem^.BMPIndex)+'.BMP');  
                                  Mybmp.Free;  
                              end;  
                      end;  
      end;  
  end;  
   
  function   StartHook(sender:   HWND;messageID:   LongInt):boolean;stdcall;  
  begin  
  Result   :=   false;  
  if   h   =   0   then  
      begin  
          pShMem^.data1[1]:=sender;  
          pShMem^.data1[2]:=messageid;  
          h   :=   SetWindowsHookEx(WH_MOUSE,@hookProc,Hinstance,0);  
          Result   :=   true;  
      end;  
  end;  
   
  function   StopHook:boolean;stdcall;  
  begin  
  Result   :=   false;  
  if   h   <>   0   then  
      begin  
          UnHookWindowsHookEx(h);  
          h   :=   0;  
          Result   :=   true;  
      end;  
  end;  
   
  Initialization  
      hMappingFile   :=   OpenFileMapping(FILE_MAP_WRITE,False,MappingFileName);  
      if   hMappingFile=0   then  
          hMappingFile   :=   CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,0,SizeOf(TShareMem),MappingFileName);  
      if   hMappingFile=0   then   Exception.Create('不能建立共享内存!');  
          pShMem   :=     MapViewOfFile(hMappingFile,FILE_MAP_WRITE   or   FILE_MAP_READ,0,0,0);  
      if   pShMem   =   nil   then  
          begin  
              CloseHandle(hMappingFile);  
              Exception.Create('不能映射共享内存!');  
          end;  
      h   :=   0;  
      pShMem^.MyHandle   :=   0;  
      pShMem^.BMPIndex   :=   0;  
   
  finalization  
      try  
          UnMapViewOfFile(pShMem);  
          //pShMem   :=   nil;  
          CloseHandle(hMappingFile);  
          //hMappingFile   :=   0;  
      except  
          ShowMessage('problem!');  
      end;  
  end.

请大家指点一下,为什么会报内存错误呢?  
  运行也能达到我要的效果,就是操作一下之后,再点击一些窗口就会出现内存错误。。。

已经解决。。

posted on 2008-11-27 21:12 delphi2007 阅读(460) 评论(0)  编辑 收藏 引用
只有注册用户登录后才能发表评论。