delphi2007 教程

delphi2007 教程

首页 新随笔 联系 聚合 管理
  1013 Posts :: 0 Stories :: 28 Comments :: 0 Trackbacks

#

高分求FP-tree算法用Delphi实现 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061208140243221.html
如题!
posted @ 2009-02-11 16:49 delphi2007 阅读(140) | 评论 (0)编辑 收藏

关于FileSize的小问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061208135104222.html
AssignFile(f,getPath+'\'+filename);  
      Reset(f);  
      size:=FileSize(f);  
  我想获得文件大小。  
  最后一句老报错[Error]   u_share.pas(452):   Incompatible   types:   'String'   and   'Text'  
  写在一个新的工程里就没有问题  
  不知道怎膜回事?

procedure   TForm1.Button1Click(Sender:   TObject);  
   
  var  
        f:   file   of   Byte;  
        size:   Longint;  
        S:   string;  
        y:   Integer;  
  begin  
      if   OpenDialog1.Execute   then  
      begin  
          AssignFile(f,   OpenDialog1.FileName);  
          Reset(f);  
          try  
              size   :=   FileSize(f);  
              S   :=   'File   size   in   bytes:   '   +   IntToStr(size);  
              y   :=   10;  
              Canvas.TextOut(5,   y,   S);  
              y   :=   y   +   Canvas.TextHeight(S)   +   5;  
              S   :=   'Seeking   halfway   into   file...';  
              Canvas.TextOut(5,   y,   S);  
   
              y   :=   y   +   Canvas.TextHeight(S)   +   5;  
              Seek(f,   size   div   2);  
              S   :=   'Position   is   now   '   +   IntToStr(FilePos(f));  
              Canvas.TextOut(5,   y,   S);  
          finally  
              CloseFile(f);  
          end;  
      end;  
  end;  
   
  看看列子吧   估计你f定义的有问题

楼上的专赚大分!!  
  fuck你PP

var   f:file   of   byte;  
          size:integer;  
  这是我的定义

你试着列子做做不就明白了?  
  关键要动手做啊

我写到一个新建的工程里就可以,加到我的工程里就报错

不知道有没有其他办法获取文件大小

posted @ 2009-02-11 16:49 delphi2007 阅读(217) | 评论 (0)编辑 收藏

各位大侠帮忙答下~~~~填空 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061208133825223.html
某程序中有如下的对窗口fmXX的操作  
          if   not   Assigned(fmXX)   then  
              fmXX:=TfmXX.Create(self)             //   作用是   _______________________   。  
          else  
              Exit;  
          fmXX.Show;  
                …………  
          __________________   ;                           //   释放fmXX占用的资源  
          fmXX:=nil;  
              本题第一行(即Assigned所在)的作用是   ________________________   。  
 

要是哪天我面试也这些题目就好了  
  支持一下

1:建立窗体  
  2:fmxx.free;  
  3:判断

呵呵,我是个初学者咯~~~~祝你好运呀!

恩   ,谢谢你啦  
 

鄙视   乌鸦

哎,同学~还是先读书吧  
   
   
  楼上的,有种来杭州单挑

PS:不包车费

posted @ 2009-02-11 16:49 delphi2007 阅读(86) | 评论 (0)编辑 收藏

排班算法跪求 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061208131750224.html
字段名 字段 数据类型       说明  
  序号 ID int         自增  
  医生编号 DocNo Char[8]         外键  
  轮值周期 ReturnType       int         0   周,1半月,2一个月;缺省   0  
  轮值序号 ReturnID         int         当ReturnType为0,取值为1-7;当ReturnType为1,取值为1-15;当ReturnType为2,取值为1-31(根据月份应不一样);  
   
  班次 ReturnSq int         1上午班、2下午班、3晚班、0整班  
  生效日期 ValideTime     Date  
  是否专家 IsPro Boolean         0   不是,1是  
  类别 ProType Char[6]  
   
   
  数据表形式如上,我该怎么实现说明中的所说~

10分少了点吧!   呵呵呵呵.

可是我只能写10不知道为什么??

帮我下吧~

10分少了点吧!   呵呵呵呵.  
  -------------------开玩笑的别在意  
  没有问题,   给你做一个.   如果你能等待的话.   晚上好吗?

好的.我自己想了个很白痴的方法.不是算法.都是在界面上实现的.选了"轮值周期"ReturnType之后,要录入"轮值序号   "使用mousedown事件来判断我选择的ReturnType,根据选择跳出不同的窗口,提示选择"轮值序号   ",这时是用combobox手动添加好""轮值序号   "供选择.比如我选了   ReturnType为0,那判断后跳出另一个FORM,上面的   combobox供选择已经设好了1-7.依次类推...很小儿科的做法~  
  老冯麻烦指点下比较"专业"的算法

posted @ 2009-02-11 16:49 delphi2007 阅读(224) | 评论 (0)编辑 收藏

Insufficient memory for this operation?? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061208122000225.html
 
  我把一个prepare好的qry执行open的时候,偶尔会报如下错误?  
  >15:55:30   BERR:   从数据库读单据   123456   明细信息时出错Insufficient   memory   for   this   operation.  
   
  哪位知道这是怎么回事呀?

Insufficient   memory   for   this   operation  
   
  ---------------------------------------  
   
  遇到过,   内存不够的异常信息.   与你的程序没有关系.   可能是你的机器启动的进程太多.

主要是这个错误偶尔会报一下错,也不是一直报错的,  
  所以就不知道哪里出问题了。  
   
  如果是机器内存不足的话,那加块内存试试看了

好变态的东东哟      
  没遇到过   你内存有多大?    
  好象DELPHI不需要多大的硬件支持吧    
  半年前到公司   我用奔3   500   内存128都在跑DELPHI

这个估计是BDE的设置问题。  
  打开BDE,  
  Configuration/System/INIT里面的MEMSIZE设成32,SHAREDMEMSIZE设成4096,试试看。  
 

posted @ 2009-02-11 16:49 delphi2007 阅读(817) | 评论 (0)编辑 收藏

初学delphi应该看什么书 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061208115526226.html
RT    
   
  有c的基础  
   
  谢谢大家

熟悉语法先..   Object   Pascal  
  其他书   ..   了解   vcl   ..  
 

《编码的奥秘》《WINDOWS核心编程》  
   
  大量的实践代码和对自己完成系统的重构。

《编码的奥秘》《WINDOWS核心编程》  
  和Delphi有直接关系吗?  
   
  《Delphi4,5,6开发人员指南》  
  已经绝版,但应该有电子书。

Object   Pascal精要--《宇宙中最强悍的Delphi资料专辑》  
  Delphi   5开发人员指南开发人员指南  
  delphi7从入门到精通  
  Delphi   5程序设计与控件参考  
  仅供参考,不过我就是这么看的。  
 

最有直接关系的就是OBJECT   PASCAL   精要,有PDF格式的书,很容易下.  
   
  学习盖楼和了解材料特性没有关系吗?

先看一本Pascal语言的语法书    
  然后自己多写点程序  
  写到一定的时候看面向对象编程思想  
  然后逐步深入

谢谢大家   我同学给我推荐了本台湾人写的入门的书<delphi   6   实务经典>     我觉得不错   正在看

posted @ 2009-02-11 16:49 delphi2007 阅读(156) | 评论 (0)编辑 收藏

DirectoryListBox目录选择问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061207225847227.html
我用DriveComboBox来控制DirectoryListBox的driver。  
  当选择了没有放光盘的光驱时,就会报IO   ERROR。  
  怎么避免这个问题啊?  
  我看见一些程序在选择驱动器的时候,选中没有光盘的光驱时会失效的,怎么实现呢?  
 

还有,如何把DirectoryListBox中当前选择的目录路径显示到一个编辑框里面啊?

顶一下

http://community.csdn.net/Expert/topic/5165/5165787.xml?temp=4.690188E-02

谢谢

posted @ 2009-02-11 16:49 delphi2007 阅读(366) | 评论 (0)编辑 收藏

图片打印丢失问题,大家请帮忙!(100分) Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061207224630228.html
我使用Printer打印一些图片,部分代码如下:  
   
        with   printer   do  
                begin  
                    begindoc;  
                    if   image1.picture.graphic<>nil   then   canvas.stretchdraw(strect1,   image1.picture.graphic);  
                    if   image2.picture.graphic<>nil   then   canvas.stretchdraw(strect2,   image2.picture.graphic);  
                    if   image3.picture.graphic<>nil   then   canvas.stretchdraw(strect3,   image3.picture.graphic);  
                    if   image4.picture.graphic<>nil   then   canvas.stretchdraw(strect4,   image4.picture.graphic);  
                    if   image5.picture.graphic<>nil   then   canvas.stretchdraw(strect5,   image5.picture.graphic);  
                    if   image6.picture.graphic<>nil   then   canvas.stretchdraw(strect6,   image6.picture.graphic);  
                    if   image7.picture.graphic<>nil   then   canvas.stretchdraw(strect7,   image7.picture.graphic);  
                    if   image8.picture.graphic<>nil   then   canvas.stretchdraw(strect8,   image8.picture.graphic);  
                    enddoc;  
                end;  
   
  一次打印8张图片,image1~image8都用OpenPictureDialog装入了图片,可是到打印输出的时候,有时候可以打印完8张图片,可有时候会少打印出1张或几张图片,且不一定总是一个位置的图片,可能是第8张图片,又可能是第6张图片,或者几张都打不出来,找不出问题所在,都装入了图片,就是打印不完整!  
   
   
  大家知道问题的请告诉我,等待中。。。

顶上,看下!

用加载图片会比较慢,建议你拷贝象素试试,方法是TCanvas.CopyRect,

把windows的虚拟内存值设置大一点试一下

强烈鄙视问题解决后不结贴的人!  
  强烈鄙视技术问题解决后把贴子转移到非技术区的人!  
  鄙视你们!  
   
  http://community.csdn.net/Expert/topic/5216/5216675.xml?temp=.9262659

posted @ 2009-02-11 16:49 delphi2007 阅读(192) | 评论 (0)编辑 收藏

delphi2005与delphi 7 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061207221950229.html
最近准备好好学delphi     学校学的是delphi7     但是我在图书馆借的是delphi   2005   从入门到精通     想问下大家这本书怎么样???     还有刚才知道2005与7相差比较大...  
  所以根据以后的发展和多方面的原因       2005和7到底该学谁呢?我本身学的信息工程

最新的功能全的东西不一定最好!  
  好用,够用就行!!  
   
  不然为什么这么多人用Delphi7。还有好多人用6和5!!  
   
  学什么都是一样,学会一个另一个自然就会了!!

^_^,感觉还是Delphi   7好!

完全不样

好多人用6和5!!

还是Delphi   7好,以后的和ms学的很失败

谢谢大家   我决定学delphi7

posted @ 2009-02-11 16:49 delphi2007 阅读(264) | 评论 (0)编辑 收藏

DBLookupComboBox Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061207213417230.html
请问大家该怎么把DBGIRD里的值赋给DBLookupComboBox1?

(,那个值?   DBLookupComboBox1.text   :=   adoquery.fieldbyname('hello').values;  
   
  这样行不?

posted @ 2009-02-11 16:49 delphi2007 阅读(267) | 评论 (0)编辑 收藏

我在DLL中建立了一个TImage,但调用时出现错误"Cannot assign a TFont to a TFont" Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061118180523201.html
DLL中的函数:  
  Function   InitImage(tar:TWinControl,fn);  
          oSelImg:=TImage.Create(nil);  
          oSelImg.AutoSize:=true;  
          oSelImg.Picture.LoadFromFile(fn);  
          oSelImg.Parent:=tar;        
          oSelImg.Show;  
   
  主程序调用时,   也能成功将图片显示在窗体上,但始终会弹出  
  "Cannot   assign   a   TFont   to   a   TFont"错误,   应如何解决呢?  
 

用Package代替DLL。

不想用Package

深度拷贝的问题,用包吧!

传说不用包也行,传个APPLICATION即可,但细节我不清楚

oSelImg.ParentFont   :=   False;   //   不触发Font.Assign()//   加上看看  
  oSelImg.Parent   :=   tar;

四星清洁工果然是第一牛人,向清洁工致敬!  
  不过由于TImage的ParentFont(派生于TControl)没有public   或   published,所以对TImage稍微做点工作。我的测试如下:  
   
  type  
      TMyImage   =   class(TImage)  
      private  
      protected  
      public  
      published  
          property   ParentFont;    
      end;  
   
  {$R   *.res}  
   
  procedure   InitImage(AParent:   TWinControl;   AFileName:   string);  
  var  
      oSelImg:   TMyImage;  
  begin  
      oSelImg:=TMyImage.Create(nil);  
      oSelImg.AutoSize:=true;  
      oSelImg.Picture.LoadFromFile(AFileName);  
      oSelImg.ParentFont   :=   False;  
      oSelImg.Parent   :=   AParent;  
      oSelImg.Show;  
  end;  
   
  exports  
      InitImage;  
  end.  
   
  ....测试  
   
  var  
      Form1:   TForm1;  
      procedure   InitImage(AParent:TWinControl;   AFileName:   string);   external   'Image.dll';  
   
  implementation  
   
  {$R   *.dfm}  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  begin  
      InitImage(Self,   'User.bmp');  
  end;  
   
  一切如愿。    
   
  PS:   我把这个问题的症结阐述转贴一下,希望对类似问题都有清晰的认识  
   
  The   DLL   will   not   use   the   same   classes   as   the   main   program   even   when   compiled   from   the   same   source.   Objects   will   look   the   same,   but   their   classes   will   not   compare   equal.   That's   why   assigning   a   TFont   value   from   the   DLL   to   a   TFont   property   in   the   main   program   (or   the   other   way   around)   doesn't   work:   the   Assign   procedure   is   looking   for   the   main   program's   TFont   class,   and   never   recognises   the   DLL's   TFont   object.    
   
  再次谢谢清洁工为我们指明道路。

让那些笨蛋都看看,这才是真正的高手!!!  
   
   
  zswang(伴水清清)(专家门诊清洁工)   ,sanmaotuo(老冯):  
  如果你们想业余时间接点私活的话,请留下联系方式.

楼主不厚道

没有所谓高手,也没有所谓笨蛋,人各有所长  
  这个问题是你自己的问题  
  大家花时间帮你想办法  
  无论解决与否,你都该心存感激  
  做人要厚道

谢谢你的提醒。  
  偶也是因为太厚道了,被人骗了几K

老冯,经常潜水看你的回帖,把你的MSN告诉我可以么?我的是zhiliposui8@hotmail.com

问最后一个问题,然后立刻结贴。  
   
  DLL中这里procedure   InitImage(AParent:   TWinControl;   AFileName:   string);  
  如果我将TWinControl换成HWND,如  
  procedure   InitImage(AParent:   HWND;   AFileName:   string);  
  应如何实现同样功能?  
  (CALLER也是HWND)

呵呵,老冯来了  
   
  通过  
   
  function   FindControl(Handle:   HWnd):   TWinControl;  
   
  没有问题吧。

注意function   FindControl(Handle:   HWnd):   TWinControl是需要修正的哈。否则......

aiirii走后,zswang(伴水清清)(专家门诊清洁工)   成为D版第一牛人了,能否帮在下解决一下http://community.csdn.net/Expert/topic/5133/5133079.xml?temp=.3957483中的问题?

to:老冯:  
  请问如何修正?

哈哈哈哈,等了你好几天了,鲨鱼终于浮面了。  
  我把整个Dll再贴一次,注意里面的_FindControl函数  
   
      TMyImage   =   class(TImage)  
      private  
      protected  
      public  
      published  
          property   ParentFont;  
      end;  
   
  var  
      ControlAtom:   TAtom;  
      ControlAtomString:   string;  
      RM_GetObjectInstance:   DWORD;//   registered   window   message  
   
  procedure   _InitControls;  
  begin  
      ControlAtomString   :=   Format('ControlOfs%.8X%.8X',   [GetModuleHandle(nil),   GetCurrentThreadID]);  
      ControlAtom   :=   GlobalAddAtom(PChar(ControlAtomString));  
      RM_GetObjectInstance   :=   RegisterWindowMessage(PChar(ControlAtomString));  
  end;  
   
  function   _FindControl(Handle:   HWnd):   TWinControl;  
  var  
      OwningProcess:   DWORD;  
  begin  
      Result   :=   nil;  
      if   (Handle   <>   0)   and  
            (GetWindowThreadProcessID(Handle,   OwningProcess)   <>   0)   and  
            (OwningProcess   =   GetCurrentProcessId)   then  
      begin  
          if   GlobalFindAtom(PChar(ControlAtomString))   =   ControlAtom   then  
              Result   :=   Pointer(GetProp(Handle,   MakeIntAtom(ControlAtom)))  
          else  
              Result   :=   Pointer(SendMessage(Handle,   RM_GetObjectInstance,   0,   0));  
      end;  
  end;  
   
  procedure   InitImage(AParent:   HWND;   AFileName:   string);  
  var  
      oSelImg:   TMyImage;  
  begin  
      oSelImg:=TMyImage.Create(nil);  
      oSelImg.AutoSize:=true;  
      oSelImg.Picture.LoadFromFile(AFileName);  
      oSelImg.ParentFont   :=   False;  
      oSelImg.Parent   :=   _FindControl(AParent);  
      oSelImg.Show;  
  end;  
   
  exports  
      InitImage;  
   
  {$R   *.res}  
   
  begin  
      _InitControls;  
  end.

至于为什么要修正原来的FindControl,里面可有学问了。

具体我不清楚为什么,  
  但看到似乎要为DLL专门建立一个消息以得到当前进程ID等信息为POINTER使用.  
   
  再次感谢你!  
  交个朋友:topduan@hotmail.com

不客气,通过解决问题和技术交流我也学到了不少东西。特别从四星清洁工这样的优秀程序员那里学到了书本上学不到的很多技巧和思路。

临时又遇到个问题,  
  为什么我在DLL中是返回PCHAR的,  
  但在主程序中得到的有时是乱码,有时又正常:  
   
  DLL中:  
  GetByField1(...):pchar;stdcall;  
  begin  
      s:=ado1.Fields[0].asstring;  
      result:=PChar(s);  
   
   
  主程序中:  
  var   tmp:pchar;  
   
      tmp:=GetByField1(-1,pchar('Type'));  
  showmessage(tmp);         //这里有时会得到乱码.    
   
  什么原因?如何解决  
 

呵呵。Type是系统保留字,你不能直接PChar('Type')。如果需要这个字符串,你这样做:  
  var  
  Str:   string;  
  Tmp:   PChar;  
  begin  
      _String   :=   'Type';  
      Tmp   :=   GetByField1(-1,PChar(Str));  
      ShowMessage(Tmp);    
      ......  
  end;  
   
  至于为什么会这样,你可以仔细看看DELPHIBasis教程(英国DELPHI学院出的)中关于指针以及内存存活的详细说明    
 

对不起,上面有误

我把Type改了另外一个名字,但仍然得到乱码有时...

这个可能要四星清洁工来解释了。

呼唤4星清洁工~~~~

mark!

(*   参考标准API写接口   *)  
  我们常用的api函数,如:GetClassName(),GetWindowText()...  
  var  
      vBuffer:   PChar;  
  begin  
      GetMem(vBuffer,   256);  
      GetClassName(Handle,   vBuffer,   256);  
      Caption   :=   vBuffer;  
      FreeMem(vBuffer,   256);  
  end;  
  (*   App和Dll使用内存有一个原则,就是:谁分配的资源由谁来释放   *)  
  在调用的时候你都必须先分配好资源  
  为什么系统Api函数要这样做?不直接返回一个PChar给你  
  因为:给你一个PChar,那这个PChar的内存资源由谁释放?  
  系统怎么知道你什么时候使用完毕?  
   
  (*   string的内存管理机制很复杂   *)  
  pascal里的string很好用,但是简单的背后是复杂的内存管理机制  
  var  
      S:   string;  
  begin  
      S   :=   '1234';  
      //   实际上这里编译器会释放S的内存空间,asm:   call   @LStrClr  
  end;  
   
  (*   函数调用完毕后,局部变量会被释放   *)  
  想也想得到:  
  成千上万的函数模块如果不是动态给局部变量分配内存资源  
  那么会有多大的内存浪费  
   
  简单来说:  
  〉GetByField1(...):pchar;stdcall;  
  〉begin  
  〉     s:=ado1.Fields[0].asstring;  
  〉     result:=PChar(s);  
  这里的s如果是局部变量,在调用完GetByField1后资源就被释放了  
   
  〉主程序中:  
  〉var   tmp:pchar;  
  〉     tmp:=GetByField1(-1,pchar('Type'));  
  〉     showmessage(tmp);         //这里有时会得到乱码.    
  tmp得到的实际上是一个已经被释放掉资源的垃圾空间,如果有被其他地方收回使用那么这段空间什么内容都可能有  
   
  最后:你就参考GetClassName这样的调用方式,改接口吧

既然专家在此,就再请教一下:  
  如何增强调用DLL的程序的稳固性?  
  目前所做的程序,调用的DLL中包含有个窗体,  
  有时此DLL出错,该错误反弹到主程序中,直接导致主程序崩溃.即使两者代码中都TRY...EXCEPT或FINALLY也无济于事.  
  应如何解决类似问题???

LZ的性欲不高啊

//LZ的性欲不高啊  
   
  呵呵呵呵,LZ是做批发的。多多益善。少花钱,多办事,符合国情。

一路看下来   LZ还真不厚道    
  不过爱学习到是值得赞扬的   没想到老冯的水平比我想象的还要高    
  清洁工的编程思路的确高   不愧是D版第一牛人啊   可敬   ~~    
 

没办法,我很穷,在CSDN还剩5分.  
  谁要,谁拿去吧

TO:老冯:  
  真是头大了!  
  主程序调用有数据库组件(无窗体)的DLL时,有时提示错误"Access   violation   at   address   0000000.   Read   of   address   0000000"有时又没有.  
  怎么都找不到原因,   到底怎么回事????  
   
  好人做到底吧...  
   
 

没关系,上面都是开玩笑的。老话说“给咖啡加点糖".呵呵呵呵  
  "Access   violation   at   address   0000000.   Read   of   address   0000000"  
  这个是内存违规的意外信息,原因有很多很多。但一般来说都是调用没有实例化的对象造成的。  
  如果你是有时的话,那你一般是销毁了某个实例而后又去调用它。反正很多原因,没有看代码确实不好诊断。  
 

我刚找到原因:  
  我在DLL中用到了  
  ado.RecordCount   =0  
  和  
  ado.RecNo:=1;  
  程序执行到这里,有时会出错!!!   为什么?!!!  
   
  这里:  
      ado:=TADODataSet.Create(nil);  
 

自己都觉得不好意思了,问那么多问题  
  但这个目前确实很头疼,在大富翁里也未找到答案,  
  再次真诚感谢,这部分问题解决立即给分

up  
  ...  
  ..

posted @ 2009-02-03 09:52 delphi2007 阅读(945) | 评论 (1)编辑 收藏

如何找到网页图片地址并下载到本地保存? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061118142631202.html
我想做个学flashget那样浮动窗口,然后,拉动图片到这个窗口,然后,下载这张图片,并将图片下载的本地的地址反馈给Edit1.text!!  
   
  有高手指教吗?

顶一下!

posted @ 2009-02-03 09:52 delphi2007 阅读(648) | 评论 (0)编辑 收藏

特殊功能,实现方法! Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061118141925203.html
 
        有没有一种简单的方法,可以监视一个exe文件是否运行或死掉,一但发现  
   
        立即重启此exe程序.改注册表能不能实现???  
   
   
        附上我自己写的一个按时间定时重启exe的源程序,大家研究一下;  
        http://www.sojibar.com/images/upfile/run2006-10-14.rar  
   
        顺便帮我想个更好的方法,谢谢!

采用进程监视方法,创建该EXE进程后,会得到一个关于这个进程信息的结构对象。然后调用GetExitCodeProcess,如果退出码为STILL_ACTIVE表示进程还在运行,反之则进程已经关闭

 
      woshihaoge   感谢!  
   
      是否有点复杂.

一般来说是用进程监视的方法!很多木马或流氓软件都是这么做的!

 
      <b>   能不能说具体一点   </b>

 
      woshihaoge   感谢!  
   
      按你的方法,我实现了,不知道碰到程序假死,会不会生效。还没有测试到。  
   
      代码:  
   
      public  
          {   Public   declarations   }  
          SI               :   TStartupInfo;  
          PI               :   TProcessInformation;  
   
      form.show   加入:  
   
      FillChar(SI,sizeof(SI),#0);  
      with   SI   do  
      begin  
          cb:=sizeof(SI);  
          dwFlags:=StartF_UsesTDHandles   or   STARTF_USESHOWWINDOW;  
          lptitle:=nil;//pchar('gxtvodserver');  
          wShowWindow:=SW_Show;  
      end;  
   
      //Application.ProcessMessages;  
      CreateProcess(PChar(exefile),nil,nil,nil,true,IDLE_PRIORITY_CLASS,nil,nil,SI,PI);  
      //MyHandle:=OpenProcess(PROCESS_TERMINATE,   true,   pi.dwProcessId);  
   
      //开始监控  
      Timer1.Enabled:=TRUE;  
   
  procedure   TForm1.Timer1Timer(Sender:   TObject);  
  var  
      ExitCode:DWORD;  
  begin  
   
      //Handle:=OpenProcess(PROCESS_TERMINATE,   true,   PI.dwProcessId);  
      GetExitCodeProcess(PI.hProcess,   ExitCode);  
      if   not(ExitCode=STILL_ACTIVE)   then               //STILL_ACTIVE  
      begin  
          //showmessage('进程已经关闭');  
          Timer1.Enabled   :=   FALSE   ;  
          if   chksetting()   then  
          begin  
              RestartSvr();//start   service  
          end;  
      end;  
   
   
 

不会是做木马吧

哈哈,你写的代码非常正确,给分拉。

其实最最笨的还有一个方法,就是在一个计时器控件事件中,不断用FindWindow函数检测你运行的程序是否存在,如果不存在了,可以用ShellExecute执行。

最后一抢!

 
      FindWindow   不准确,回勿杀进程!

posted @ 2009-02-03 09:52 delphi2007 阅读(210) | 评论 (0)编辑 收藏

帮帮我吗 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061118103215204.html
我的后台数据库为ACCESS,有两张表,如下  
  学生基本信息表:学生学号(主),学生姓名,性别,出生日期,班号,联系电话,入校日期,备注;  
  学生成绩表:考试编号(主),所在班号,学生学号,学生姓名,所学课程,考试分数;  
  我在窗体中,要求学生的基本信息录入,含所在的班级,所学课程,成绩等,并要求对学生信息进行修改,查询及添加,  
  我的问题是:我无法在一个窗体操作两个以上的表,我应该乍个办?  
 

帮顶...  
  唉,7个贴子也,140分  
 

怎么会无法操作两个表,100个表也能操作!

怎么会无法操作两个表,100个表也能操作!  
 

posted @ 2009-02-03 09:52 delphi2007 阅读(167) | 评论 (0)编辑 收藏

使用LoadLibrary()调用DLL,使用FreeLibrary()释放之后出现访问报错 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061117215431205.html
动态链接库代码如下:  
  library   DLLSplitString;  
   
  uses  
      SysUtils,  
      Classes;  
   
  {$R   *.res}  
   
   
  //     以下函数实现根据分隔符分隔字符,并将分隔出来的字符写进StringList中。  
  function   SplitString(Source,   Deli:   string   ):   TStringList;stdcall;  
  var  
      EndOfCurrentString:   byte;  
      StringList:   TStringList;  
  begin  
      StringList   :=   TStringList.Create;  
      while   Pos(Deli,   Source)>0   do  
      begin  
          EndOfCurrentString   :=   Pos(Deli,   Source);  
          StringList.add(Copy(Source,   1,   EndOfCurrentString   -   1));  
          Source   :=   Copy(Source,   EndOfCurrentString   +   length(Deli),   length(Source)   -   EndOfCurrentString);  
      end;  
      Result   :=   StringList;  
      StringList.Add(source);  
  end;  
  exports  
      SplitString;  
   
      begin  
  end.  
   
  程序中调用:  
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
      i:   integer;  
      OneHandle:   THandle;  
      SplitString:   function   (Source,   Deli:   string):   TStringList;   stdcall;  
      StringList:   TStringList;  
  begin  
      StringList   :=   TStringList.Create;  
      OneHandle   :=   LoadLibrary('DLLSplitString.dll');   //动态载入DLL,并返回其句柄  
      try  
          if   OneHandle   <>   0   then   //如果载入成功则获取SplitString函数的地址  
              @SplitString   :=   GetProcAddress(OneHandle,   'SplitString');  
          if   not   (@SplitString   =   nil)   then  
          begin  
              StringList   :=   SplitString('a;b;c;d',   ';');  
              for   i   :=   0   to   StringList.Count   -   1   do  
                  edit1.Text   :=   edit1.Text   +   StringList[i];  
          end  
          else  
              RaiseLastWin32Error;  
      finally  
          FreeLibrary(OneHandle);   //调用完毕收回DLL占用的资源  
      end;  
  end;  
   
  在执行   FreeLibrary(OneHandle);   之句的时候报错内存地址之类的错。在网上查了一下,可能是说在DLL中使用了全局变量。不知如何改进相关的代码以解决这个问题。

你的dll没有使用全局变量啊。  
   
  不过   建议你的函数返回值   不要用   TStringList    
   
  你可以返回一个数组   或者其他。

在dll和程序工程文件的uses里加上ShareMem。

在dll和程序工程文件的uses里加上ShareMem后还是报同样的错,问题并没有解决。

原来是要把ShareMem加到所有单元的最前边才可以。问题解决了。

现在又出现这样一个问题,在关闭程序的时候,报内存地址方面的错。

posted @ 2009-02-03 09:52 delphi2007 阅读(3046) | 评论 (0)编辑 收藏

有关动态调用DLL的问题,请教。 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061117201842206.html
DLL代码如下:  
   
  library   DLLSplitString;  
   
  uses  
      SysUtils,  
      Classes;  
   
  {$R   *.res}  
   
  //     以下函数实现根据分隔符分隔字符,并将分隔出来的字符写进StringList中。  
  function   SplitString(Source,   Deli:   string   ):   TStringList;stdcall;  
  var  
      EndOfCurrentString:   byte;  
      StringList:   TStringList;  
  begin  
      StringList   :=   TStringList.Create;  
      while   Pos(Deli,   Source)>0   do  
      begin  
          EndOfCurrentString   :=   Pos(Deli,   Source);  
          StringList.add(Copy(Source,   1,   EndOfCurrentString   -   1));  
          Source   :=   Copy(Source,   EndOfCurrentString   +   length(Deli),   length(Source)   -   EndOfCurrentString);  
      end;  
      Result   :=   StringList;  
      StringList.Add(source);  
  end;  
  exports  
      SplitString;  
   
      begin  
  end.  
   
  程序中的调用过程:  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
      OneHandle:   THandle;  
  begin  
      OneHandle   :=   LoadLibrary('DLLSplitString.dll');    
      try  
          if   OneHandle   <>   0   then    
            @SplitString   :=   GetProcAddress(OneHandle,   'SplitString');  
          if   not   (@SplitString   =   nil)   then  
              ...  
       else  
         RaiseLastWin32Error;  
      finally  
          FreeLibrary(OneHandle);    
      end;  
  end;  
  为何一直报错   Undeclared   identifier:   'SplitString'   如何处理呢?  
   
 

procedure   TForm1.Button1Click(Sender:   TObject);  
   
  type  
      SplitString   =function   SplitString(Source,   Deli:   string   ):   TStringList;stdcall;  
  var  
      OneHandle:   THandle;  
  begin  
      OneHandle   :=   LoadLibrary('DLLSplitString.dll');    
      try  
          if   OneHandle   <>   0   then    
            @SplitString   :=   GetProcAddress(OneHandle,   'SplitString');  
          if   not   (@SplitString   =   nil)   then  
              ...  
       else  
         RaiseLastWin32Error;  
      finally  
          FreeLibrary(OneHandle);    
      end;  
  end;  
 

SplitString标识符未定义。  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
      OneHandle:   THandle;  
      SplitString:   function   (Source,   Deli:   string):   TStringList;  
  begin  
      OneHandle   :=   LoadLibrary('DLLSplitString.dll');    
      try  
          if   OneHandle   <>   0   then    
          SplitString   :=   GetProcAddress(OneHandle,   'SplitString');  
          if   SplitString   <>   nil   then  
              ...  
       else  
         RaiseLastWin32Error;  
      finally  
          FreeLibrary(OneHandle);    
      end;  
  end;

posted @ 2009-02-03 09:52 delphi2007 阅读(291) | 评论 (0)编辑 收藏

如何用程序实现对IE中scripts的控制(禁止和允许) Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061117145848207.html
大家如果用过MAXTHON(MYIE)就知道在“选项”》“下载控制”中有个“允许scripts”的选项。我想知道自己如何用程序实现这样的功能,修改注册表也可以。谢谢大家。注意是控制IE而不是我自做的浏览器。

不顶就要沉了。高手们帮帮忙忙啊!

mark

DLCTL_NO_SCRIPTSand   DLCTL_NO_JAVA:   Scripts   and   Java   applets   will   not   be   executed.  
  http://www.bsalsa.com/ewb_propert.html  
  http://www.delphidabbler.com/articles?article=18&part=4

谢谢。全部英文,我找字典先。粗看应该是这个“DLCTL_NO_SCRIPTS”。我GOOGLE一下再来。

谢谢,我用修改注册表实现相同功能了。大家有相同问题的可以到我的BLOG看看。我把修改方法发表了。

posted @ 2009-02-03 09:52 delphi2007 阅读(241) | 评论 (0)编辑 收藏

这个就是我的主程序(问题在我今天发的第一个帖子中) Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061117132223208.html
Hook.dll代码在我今天发的第一个帖子中  
   
  unit   Unit1;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs,   StdCtrls;  
   
  type  
      TForm1   =   class(TForm)  
          Button1:   TButton;  
          Memo1:   TMemo;  
          Memo2:   TMemo;  
          procedure   Button1Click(Sender:   TObject);  
          procedure   WMCOPYDATA(Var   Msg:TMessage);message   WM_COPYDATA;  
      private  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
      end;  
   
  var  
      Form1:   TForm1;  
   
  implementation  
   
  {$R   *.dfm}  
      function   StartSpyMessage(AHSpyWnd,   AHRevWnd:   THandle):   Boolean;   stdcall;external   'hook.dll';  
      procedure   StopSpyMessage;stdcall;external   'hook.dll';  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
      MWnd:THandle;  
      CWnd:THandle;  
      EWnd:THandle;  
  begin  
      memo1.Lines.Clear;  
      MWnd:=FindWindow(nil,'BMML   Window:   COM1   Stack');     //获取窗口句柄  
      CWnd:=FindWindowEx(MWnd,0,'AfxMDIFrame40',nil);       //获取一级句柄  
      EWnd:=FindWindowEx(CWnd,0,'Edit',nil);                         //获取Edit控件句柄  
   
      If   EWnd=0   then  
          showmessage('程序没运行')  
      Else  
          memo1.Lines.Add(inttostr(EWnd));  
   
      if   StartSpyMessage(EWnd,form1.Handle)   then  
            showmessage('启动成功');  
  end;  
   
  procedure   TForm1.WMCOPYDATA(var   Msg:   TMessage);  
  Var  
      Data:CopyDataStruct;  
      S:String;  
  begin  
      Data:=PCopyDataStruct(Msg.LParam)^;  
      with   Data   do  
      Begin  
          S:='数据类别代码'+inttostr(cbData)+'       '+'消息实际数据'+PChar(lpData);  
      end;  
      Memo2.Lines.Add(s);  
  end;  
   
  end.

该程序的确可以拦截那个程序中Edit控件的消息,但显示的却为空的  
   
  里面主要是用到WM_COPYDATA消息来传递我要的消息,因为对消息操作不熟悉,所以不知道在怎么写了  
  Hook.dll中拦截到消息以后,通过WM_COPYDATA消息发送到我的主程序  
  在主程序中我写了一个消息过程,也的确是收到效果,可就是得到的是空的,麻烦高手们帮我看看问题出在那里了

posted @ 2009-02-03 09:52 delphi2007 阅读(243) | 评论 (0)编辑 收藏

拦截EDIT控件中的消息问题(上次提问过,我自己找了些资料,虽然拦截到消息,可得到的是空白字符) Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061117131358209.html
接上次的问题,这里我在简单说说  
  单位有一程序,其中有一个Edit控件  
  该控件是用来显示我们执行操作命令返回的消息  
  我的目的是拦截该控件中的消息,主要是为了获取该控件中显示的字符  
  消息为EM_RSPLACESEL  
  下面我给出我根据别人的人个代码写的Hook程序,和我写的主程序

Hook.dll文件一  
   
  library   hook;  
   
  {   Important   note   about   DLL   memory   management:   ShareMem   must   be   the  
      first   unit   in   your   library's   USES   clause   AND   your   project's   (select  
      Project-View   Source)   USES   clause   if   your   DLL   exports   any   procedures   or  
      functions   that   pass   strings   as   parameters   or   function   results.   This  
      applies   to   all   strings   passed   to   and   from   your   DLL--even   those   that  
      are   nested   in   records   and   classes.   ShareMem   is   the   interface   unit   to  
      the   BORLNDMM.DLL   shared   memory   manager,   which   must   be   deployed   along  
      with   your   DLL.   To   avoid   using   BORLNDMM.DLL,   pass   string   information  
      using   PChar   or   ShortString   parameters.   }  
   
  uses  
      SysUtils,  
      Classes,  
      wdSpyCommon   in   'wdSpyCommon.pas',  
      wdMsgSpy   in   'wdMsgSpy.pas';  
   
  {$R   *.res}  
   
  exports  
      StartSpyMessage,  
      StopSpyMessage;  
   
  begin  
  end.

Hook.dll文件二  
   
  unit   wdSpyCommon;  
  {*******************************************  
    *   brief:   消息Spy用到的数据结构等的声明文件  
    *   autor:   linzhenqun  
    *   date:   2005-9-25  
    *   email:   linzhengqun@163.com  
    *   blog:   http://blog.csdn.net/linzhengqun  
  ********************************************}  
  interface  
  uses  
      Windows,   Messages;  
  resourcestring  
    err_ProcInvalid   =   'the   Message   spy   procedure   are   invalid.';  
      err_ShareMem   =   'could   not   create   share   memory.';  
  const  
      Msg_Null_Value   =   0;  
      Msg_Type_Sent   =   1;  
      Msg_Type_Post   =   2;  
      Msg_Type_Return   =   3;  
  type  
      {   受监察的消息结构   }  
      PMsgInfo   =   ^TMsgInfo;  
      TMsgInfo   =   packed   record  
          hwnd:   HWND;  
          message:   UINT;  
          wParam:   WPARAM;  
          lParam:   LPARAM;  
          time:   DWORD;  
          pt:   TPoint;  
          lResult:   LRESULT;  
          MsgType:   UINT;  
      end;  
  implementation  
  end.

Hook.dll文件三 钩子就在这里设置的  
   
  unit   wdMsgSpy;  
  {*******************************************  
    *   brief:   消息Spy的SDK  
    *   autor:   linzhenqun  
    *   date:   2005-9-24  
    *   email:   linzhengqun@163.com  
    *   blog:   http://blog.csdn.net/linzhengqun  
  ********************************************}  
  interface  
  uses  
      Messages,   Windows,   Classes,   SysUtils,   wdSpyCommon;  
  const  
      MApingFile_Name   =   'MsgSpy_FC819A73-2718-47E2-BF78-6810562CDA65';  
  type  
      //共享内存  
      PShareMem   =   ^TShareMem;  
      TShareMem   =   record  
          HRevWnd:   THandle;   //存放接收消息的窗口句柄  
          HWndSpy:   THandle;   //被监察的窗口句柄  
      end;  
  {   开始监察消息,AHSpyWnd为受监察的窗口,AHRevWnd为接收监察到的消息的窗口   }  
  function   StartSpyMessage(AHSpyWnd,   AHRevWnd:   THandle):   Boolean;   stdcall;  
  {   停止监察消息   }  
  procedure   StopSpyMessage;   stdcall;  
  var  
      HMsgProc,   HWndProc,   HWndRetProc:   THandle;   //相应钩子的句柄  
      PSMem:   PShareMem;   //共享内存块  
      hMApFile:   THandle;   //内存映射文件的句柄。  
  implementation  
   
  //将截获的消息结构发送到目标窗口  
  procedure   SendData(AMsgInfo:   PMsgInfo);   stdcall;  
  var  
      pcds:   PCopyDataStruct;  
  begin  
      New(pcds);  
      pcds^.cbData   :=   SizeOf(TMsgInfo);  
      pcds^.lpData   :=   AMsgInfo;  
      SendMessage(PSMem^.HRevWnd,   WM_COPYDATA,   0,   LongInt(pcds));  
      Dispose(pcds);  
  end;  
  {   WH_GETMESSAGE的钩子过程   }  
  function   GetMsgProc(code:   Integer;   wP:   WPARAM;   lP:   LPARAM):   LRESULT;   stdcall;  
  var  
      LMsgInfo:   PMsgInfo;  
  begin  
  {只有截获的消息的窗口句柄等于被监察的窗口句柄,才进行下一步,  
  接着,当被监察的窗口不是接收消息的窗口时执行下一步操作;或者当被监察窗口  
  就是接收消息的窗口时,截获的消息不是WM_CopyData,执行下一步。  
  这么做是为了避免进入发送消息与截获消息的死循环}  
      if   code   =   HC_ACTION   then  
          if   (PMsg(lp)^.hwnd   =   PSMem^.HWndSpy)   then  
              if   ((PSMem^.HWndSpy   =   PSMem^.HRevWnd)   and   (PMsg(lp)^.message   <>   WM_COPYDATA))  
                  or   (PSMem^.HWndSpy   <>   PSMem^.HRevWnd)   then  
              begin  
                  New(LMsgInfo);  
                  LMsgInfo.hwnd   :=   PMsg(lp)^.hwnd;  
                  LMsgInfo.message   :=   PMsg(lp)^.message;  
                  LMsgInfo.wParam   :=   PMsg(lp)^.wParam;  
                  LMsgInfo.lParam   :=   PMsg(lp)^.lParam;  
                  LMsgInfo.pt   :=   PMsg(lp)^.pt;  
                  LMsgInfo.time   :=   PMsg(lp)^.time;  
                  LMsgInfo.lResult   :=   Msg_Null_Value;  
                  LMsgInfo.MsgType   :=   Msg_Type_Post;  
                  SendData(LMsgInfo);  
                  Dispose(LMsgInfo);  
              end;  
      Result   :=   CallNextHookEx(HMsgProc,   code,   wP,   lP);  
  end;  
   
  {   WH_CALLWNDPROC的钩子过程   }  
  function   CallWndProc(code:   Integer;   wP:   WPARAM;   lP:   LPARAM):   LRESULT;   stdcall;  
  var  
      LMsgInfo:   PMsgInfo;  
  begin  
      if   code   =   HC_ACTION   then  
          if   (PCWPStruct(lp)^.hwnd   =   PSMem^.HWndSpy)   then  
              if   ((PSMem^.HWndSpy   =   PSMem^.HRevWnd)   and   (PCWPStruct(lp)^.message   <>   WM_COPYDATA))  
                  or   (PSMem^.HWndSpy   <>   PSMem^.HRevWnd)   then  
              begin  
                  New(LMsgInfo);  
                  LMsgInfo^.hwnd   :=   PCWPStruct(lp)^.hwnd;  
                  LMsgInfo^.message   :=   PCWPStruct(lp)^.message;  
                  LMsgInfo^.wParam   :=   PCWPStruct(lp)^.wParam;  
                  LMsgInfo^.lParam   :=   PCWPStruct(lp)^.lParam;  
                  LMsgInfo^.pt   :=   Point(0,   0);  
                  LMsgInfo^.time   :=   Msg_Null_Value;  
                  LMsgInfo^.lResult   :=   Msg_Null_Value;  
                  LMsgInfo^.MsgType   :=   Msg_Type_Sent;  
                  SendData(LMsgInfo);  
                  Dispose(LMsgInfo);  
              end;  
      Result   :=   CallNextHookEx(HWndProc,   code,   wP,   lP);  
  end;  
   
  {   WH_CALLWNDPROCRET的钩子过程   }  
  function   CallWndRetProc(code:   Integer;   wP:   WPARAM;   lP:   LPARAM):   LRESULT;   stdcall;  
  var  
      LMsgInfo:   PMsgInfo;  
  begin  
      if   code   =   HC_ACTION   then  
              if   (PCWPRetStruct(lp)^.hwnd   =   PSMem^.HWndSpy)   then  
                  if   ((PSMem^.HWndSpy   =   PSMem^.HRevWnd)   and   (PCWPRetStruct(lp)^.message   <>   WM_COPYDATA))  
                      or   (PSMem^.HWndSpy   <>   PSMem^.HRevWnd)   then  
                  begin  
                      New(LMsgInfo);  
                      LMsgInfo^.hwnd   :=   PCWPRetStruct(lp)^.hwnd;  
                      LMsgInfo^.message   :=   PCWPRetStruct(lp)^.message;  
                      LMsgInfo^.wParam   :=   PCWPRetStruct(lp)^.wParam;  
                      LMsgInfo^.lParam   :=   PCWPRetStruct(lp)^.lParam;  
                      LMsgInfo^.pt   :=   Point(0,   0);  
                      LMsgInfo^.time   :=   Msg_Null_Value;  
                      LMsgInfo^.lResult   :=   PCWPRetStruct(lp)^.lResult;  
                      LMsgInfo^.MsgType   :=   Msg_Type_Return;  
                      SendData(LMsgInfo);  
                      Dispose(LMsgInfo);  
              end;  
      Result   :=   CallNextHookEx(HWndRetProc,   code,   wP,   lP);  
  end;  
   
  function   StartSpyMessage(AHSpyWnd,   AHRevWnd:   THandle):   Boolean;  
  begin  
      Result   :=   False;  
      try  
          if   (HMsgProc   <>   0)   or   (HWndProc   <>   0)   or   (HWndRetProc   <>   0)   then  
              Exit;  
          PSMem^.HWndSpy   :=   AHSpyWnd;  
          PSMem^.HRevWnd   :=   AHRevWnd;  
          HMsgProc   :=   SetWindowsHookEx(WH_GETMESSAGE,   @GetMsgProc,   HInstance,   0);  
          HWndProc   :=   SetWindowsHookEx(WH_CALLWNDPROC,   @CallWndProc,   HInstance,   0);  
          HWndRetProc   :=   SetWindowsHookEx(WH_CALLWNDPROCRET,   @CallWndRetProc,   HInstance,   0);  
          if   (HMsgProc   =   0)   or   (HWndProc   =   0)   or   (HWndRetProc   =   0)   then  
          begin  
              StopSpyMessage;  
              Exit;  
          end;  
      except  
          Exception.Create(err_ProcInvalid);  
      end;  
      Result   :=   True;  
  end;  
   
  procedure   StopSpyMessage;  
  begin  
      UnhookWindowsHookEx(HMsgProc);  
      UnhookWindowsHookEx(HWndProc);  
      UnhookWindowsHookEx(HWndRetProc);  
      HMsgProc   :=   0;  
      HWndProc   :=   0;  
      HWndRetProc   :=   0;  
  end;  
   
  initialization  
    //创建共享内存块  
      hMApFile   :=   OpenFileMApping(FILE_MAP_ALL_ACCESS,   False,   MApingFile_Name);  
      if   hMApFile   =   0   then  
          hMApFile   :=   CreateFileMApping($FFFFFFFF,   nil,   PAGE_READWRITE,   0,  
              SizeOf(TShareMem),   MApingFile_Name);  
      PSMem   :=     MApViewOfFile(hMApFile,   FILE_MAP_WRITE   or   FILE_MAP_READ,   0,   0,   0);  
      if   PSMem   =   nil   then  
      begin  
          CloseHandle(hMApFile);  
          Exception.Create(err_ShareMem);  
      end;  
   
  finalization  
    //释放共享内存块  
      UnMApViewOfFile(PSMem);  
      CloseHandle(hMApFile);  
  end.  
 

友情接分;;;;;;;;

问题解决了,其实在这个Hook.dll代码里修改一下即可了  
   
  因为拦截上的问题,所以,我在dll代码里修改了一下,拦截到消息以后,我直接用  
  SendMessage把消息发送到我的程序中即可  
   
  具体修改为  
   
  {   WH_CALLWNDPROCRET的钩子过程   }  
  function   CallWndRetProc(code:   Integer;   wP:   WPARAM;   lP:   LPARAM):   LRESULT;   stdcall;  
  var  
      LMsgInfo:   PMsgInfo;  
  begin  
     //if   code   =   HC_ACTION   then     这条也可以不要  
              if   (PCWPRetStruct(lp)^.hwnd   =   PSMem^.HWndSpy)   then  
                  if   ((PSMem^.HWndSpy   =   PSMem^.HRevWnd)   and   (PCWPRetStruct(lp)^.message   <>   WM_COPYDATA))  
                      or   (PSMem^.HWndSpy   <>   PSMem^.HRevWnd)   then  
                  begin  
                      New(LMsgInfo);  
                      LMsgInfo^.hwnd   :=   PCWPRetStruct(lp)^.hwnd;  
                      LMsgInfo^.message   :=   PCWPRetStruct(lp)^.message;  
                      LMsgInfo^.wParam   :=   PCWPRetStruct(lp)^.wParam;  
                      LMsgInfo^.lParam   :=   PCWPRetStruct(lp)^.lParam;  
                      LMsgInfo^.pt   :=   Point(0,   0);  
                      LMsgInfo^.time   :=   Msg_Null_Value;  
                      LMsgInfo^.lResult   :=   PCWPRetStruct(lp)^.lResult;  
                      LMsgInfo^.MsgType   :=   Msg_Type_Return;  
   
                      //SendData(LMsgInfo);     这条不要  
                      SendMessage(PSMem^.HRevWnd,PCWPRetStruct(lp)^.message,PCWPRetStruct(lp)^.wParam,PCWPRetStruct(lp)^.lParam)     //修改中添加了这条  
                      Dispose(LMsgInfo);  
              end;  
      Result   :=   CallNextHookEx(HWndRetProc,   code,   wP,   lP);  
  end;  
   
  然后,把其他的两个钩子函数都可以去掉,包括安装钩子,只留第三个钩子,  
  呵呵,现在,我在那个单位的程序里输入命令以后,返回的消息,包括字符  
  全部在我的程序中显示了,虽然我没弄明白这些参数的用途,不过也算解决了一个问题  
   
  在我的程序里还得在用消息机制拦截自己进程的消息并处理消息,  
  虽然复杂点,现在也只能这样了

呵呵,分还是我自己拿吧,等以后在有问题在问大家

不要啊,楼主,给偶一点也好嘛,呵呵~~

路过。

路过~~~

楼主不要这么小气嘛

呵呵,分还是我自己拿吧,等以后在有问题在问大家  
  ----------------------------------------------  
  把他性欲给降低!!!!!!!!!!!!!!!

posted @ 2009-02-03 09:52 delphi2007 阅读(520) | 评论 (0)编辑 收藏

怎么进入特殊的目录????????急,十分棘手啊! Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061117121732210.html
我在DOS下建立了名为   s.   的文件夹(注意目录名带点)  
  无法通过正常途径对其进行访问!!!  
  问,要怎样才可以进如此目录呢????或者要怎样才可以对其进行操作???

我电脑也有被黑客建立的垃圾目录,至少仍然不能删除.

s.   =   s  
  没有任何区别  
 

再在同级目录下建s目录,就可以访问了

posted @ 2009-02-03 09:52 delphi2007 阅读(226) | 评论 (0)编辑 收藏

怎么获取Windows服务程序的路径? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061117121414211.html
在EXE的应用程序中我们可以用Application.ExeName来获取应用程序自身的文件名,那么在Windows服务中怎么获取Windows服务程序的路径?

用GetModuleFileName可以获取Windows服务程序的路径。

用WMI和轻松获取SERVICE的全面信息(包括路径)  
   
  单获取路径语句如下:  
   
  select   PathName   From   Win32_Service   Where   DisplayName   =   'YourService’

posted @ 2009-02-03 09:50 delphi2007 阅读(1444) | 评论 (0)编辑 收藏

实现截屏区域选择框。。 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061117112055212.html
我想得到一个区域选择框,用来截屏区域选择的,中间使被挖空的,大小可以改变,研究了一下,感觉是在一个Form的基础上实现的,试了很久,就是不知道具体怎么搞的。大家帮帮忙。。。

啥功能?

截屏程序里,选择区域的区域框要怎么实现。  
  说明一下:这个区域框是可以拖动和改变大小的,而且是透明的,只有边框有颜色。。

我主要是想实现一个这样的窗体:  
  它只显示边框,里面是透明的,通过鼠标拖动边框可以移动和改变大小。

高手帮帮忙阿。。  
  我顶!!

posted @ 2009-02-03 09:50 delphi2007 阅读(220) | 评论 (0)编辑 收藏

如何得到所有可视化窗口的句柄? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061117103732213.html
我想得到已经运行的所有有窗口的应用程序的窗口句柄,不知道有什么好办法,大家帮帮忙。。

用FINDWINDOW。。。遍历查找。。

遍历窗口用EnumWindows,然后用IsWindowVisible判断窗口是否可视。

先谢谢大家了。  
  能给出几行代码看看吗?

posted @ 2009-02-03 09:50 delphi2007 阅读(632) | 评论 (2)编辑 收藏

请问如何获得这个键值? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061117005510214.html
我想在这个键下面通过程序设置Windows的自动更新,但不知道怎么取得“{C611B475-175A-4114-9ABD-F37B85A06F22}”这个值,好象这个值每个用户下都不一样  
  HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Group   Policy   Objects\{C611B475-175A-4114-9ABD-F37B85A06F22}Machine\Software\Policies\Microsoft\Windows\WindowsUpdate

用RegEnumKeyEx枚举HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Group   Policy   Objects\   下的所以键名,找到你要的键名再取键值。

但是对于一个新创建的用户来说不存在“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Group   Policy   Objects”这个键值,这个键值是当用gpedit.msc设置了组策略后才产生的。

枚举前先判断它键是否存在,参考一下TRegistry.KeyExists的实现方法。

老之把思路都已经说了,具体实现自然要进行一些流程上的判断。  
   
   
  顺便说一句:老之还在CSDN混呢

可能是我没有说清楚,我是想在“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Group   Policy   Objects\{C611B475-175A-4114-9ABD-F37B85A06F22}Machine\Software\Policies\Microsoft\Windows\WindowsUpdate”这个键下写些值,如果存在这个键的时候可以用“老之”的枚举方法,但如果这个键不存在时,我要自己创建这个键,但问题是不知道{C611B475-175A-4114-9ABD-F37B85A06F22}这个值是怎么产生的,而每个用户下这个值又是不同的。

如果是创建这个键,试下:  
  uses   ComObj,   ActiveX;  
   
  var   Guid   :   TGUID;  
          Key   :   string;  
   
    CoCreateGuid(Guid);  
    Key   :=   GUIDToString(Guid);

感谢各位的帮助,谢谢!

posted @ 2009-02-03 09:50 delphi2007 阅读(196) | 评论 (0)编辑 收藏

如何调用保存在 TMemoryStream 中的DLL? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061116221822215.html
不要保存到磁盘上。  
   
  解决送   300分。

没有必要自己写,直接写好程序后用pebundle加壳成一个应用程序即可,比你自己写的安全多了,网上的一个p2p流媒体软件就是这样做的(tvkoo),用它加壳出来的东西,绝对是你想要的!呵呵,不知道是否可以得到你那300分啊,呵呵是的话我就可以多一只猩猩了,挖卡卡!

我早知道   PEBundle,   因为我一直在使用   PECompact,可是那东西是收费的。  
  我希望有自己的实现方式。已经从网上找到从内存运行EXE程序的代码,却没有内存调用DLL的代码。  
 

http://www.delphibbs.com/delphibbs/dispq.asp?lid=2612942  
   
  来自:WindDriver,   时间:2004-6-22   9:08:45,   ID:2675646  
  在国外站点找到答案了   ;)  
   
  {  
      DLL   Loader   by   Aphex  
      http://www.iamaphex.cjb.net  
      unremote@knology.net  
   
      Based   on   code   from   gmm@ufacom.ru  
   
      function   xLoadLibrary(Src:   Pointer;   Imports:   array   of   TImportItem):   TLibInfo;  
      procedure   xFreeLibrary(hModule:   TLibInfo);  
  }  
   
  unit   DLLUnit;  
   
  interface  
   
  uses  
      Windows;  
   
  type  
      TImportItem   =   record  
          Name:   string;  
          PProcVar:   ^Pointer;  
      end;  
   
      TwordArr   =   array   [0..0]   of   word;  
      PwordArr   =   ^TwordArr;  
      TdwordArr   =   array   [0..0]   of   dword;  
      PdwordArr   =   ^TdwordArr;  
   
      PImageImportDescriptor   =   ^TImageImportDescriptor;  
      TImageImportDescriptor   =   packed   record  
          OriginalFirstThunk:   dword;  
          TimeDateStamp:   dword;  
          ForwarderChain:   dword;  
          Name:   dword;  
          FirstThunk:   dword;  
      end;  
   
      PImageBaseRelocation=   ^TImageBaseRelocation;  
      TImageBaseRelocation   =   packed   record  
          VirtualAddress:   cardinal;  
          SizeOfBlock:   cardinal;  
      end;  
   
      TDllEntryProc   =   function(hinstDLL:   HMODULE;   dwReason:   dword;   lpvReserved:   Pointer):   Boolean;   stdcall;  
   
      TStringArray   =   array   of   string;  
   
      TLibInfo   =   record  
          ImageBase:   Pointer;  
          DllProc:   TDllEntryProc;  
          LibsUsed:   TStringArray;  
      end;  
   
      PLibInfo   =   ^TLibInfo;  
      PPointer   =   ^Pointer;  
   
      TSections   =   array   [0..100000]   of   TImageSectionHeader;  
   
  const  
      IMPORTED_NAME_OFFSET   =   $00000002;  
      IMAGE_ORDINAL_FLAG32   =   $80000000;  
      IMAGE_ORDINAL_MASK32   =   $0000FFFF;  
   
  function   xLoadLibrary(Src:   Pointer;   Imports:   array   of   TImportItem):   TLibInfo;  
  function   xFreeLibrary(LoadedLib:   TLibInfo):   boolean;  
   
  implementation

implementation  
   
  function   xFreeLibrary(LoadedLib:   TLibInfo):   boolean;  
  var  
      ObjectLoop:   integer;  
  begin  
      Result   :=   False;  
      with   LoadedLib   do  
      begin  
          if   @DllProc   <>   nil   then  
          begin  
                DllProc(HModule(LoadedLib.ImageBase),   DLL_PROCESS_DETACH,   nil);  
          end;  
          for   ObjectLoop   :=   0   to   Length(LibsUsed)   -   1   do  
          begin  
              if   ObjectLoop   >=   Length(LibsUsed)   then   Exit;  
              FreeLibrary(GetModuleHandle(pchar(LibsUsed[ObjectLoop])));  
          end;  
          SetLength(LibsUsed,   0);  
      end;  
      VirtualFree(LoadedLib.ImageBase,   0,   MEM_RELEASE);  
      Result   :=   True;  
  end;  
   
  function   xLoadLibrary(Src:   Pointer;   Imports:   array   of   TImportItem):   TLibInfo;  
  var  
      ImageBase:   pointer;  
      ImageBaseDelta:   integer;  
      ImageNtHeaders:   PImageNtHeaders;  
      PSections:   ^TSections;  
      SectionLoop:   integer;  
      SectionBase:   pointer;  
      VirtualSectionSize,   RawSectionSize:   cardinal;  
      OldProtect:   cardinal;  
      NewLibInfo:   TLibInfo;  
   
      function   StrToInt(S:   string):   integer;  
      begin  
        Val(S,   Result,   Result);  
      end;  
   
      procedure   Add(Strings:   TStringArray;   Text:   string);  
      begin  
          SetLength(Strings,   Length(Strings)   +   1);  
          Strings[Length(Strings)-1]   :=   Text;  
      end;  
   
      function   Find(Strings:   array   of   string;   Text:   string;   var   Index:   integer):   boolean;  
      var  
          StringLoop:   integer;  
      begin  
          Result   :=   False;  
          for   StringLoop   :=   0   to   Length(Strings)   -   1   do  
          begin  
              if   lstrcmpi(pchar(Strings[StringLoop]),   pchar(Text))   =   0   then  
              begin  
                  Index   :=   StringLoop;  
                  Result   :=   True;  
              end;  
          end;  
      end;  
   
      function   GetSectionProtection(ImageScn:   cardinal):   cardinal;  
      begin  
          Result   :=   0;  
          if   (ImageScn   and   IMAGE_SCN_MEM_NOT_CACHED)   <>   0   then  
          begin  
          Result   :=   Result   or   PAGE_NOCACHE;  
          end;  
          if   (ImageScn   and   IMAGE_SCN_MEM_EXECUTE)   <>   0   then  
          begin  
              if   (ImageScn   and   IMAGE_SCN_MEM_READ)<>   0   then  
              begin  
                  if   (ImageScn   and   IMAGE_SCN_MEM_WRITE)<>   0   then  
                  begin  
                      Result   :=   Result   or   PAGE_EXECUTE_READWRITE  
                  end  
                  else  
                  begin  
                      Result   :=   Result   or   PAGE_EXECUTE_READ  
                  end;  
              end  
              else   if   (ImageScn   and   IMAGE_SCN_MEM_WRITE)   <>   0   then  
              begin  
                  Result   :=   Result   or   PAGE_EXECUTE_WRITECOPY  
              end  
              else  
              begin  
                  Result   :=   Result   or   PAGE_EXECUTE  
              end;  
          end  
          else   if   (ImageScn   and   IMAGE_SCN_MEM_READ)<>   0   then  
          begin  
              if   (ImageScn   and   IMAGE_SCN_MEM_WRITE)   <>   0   then  
              begin  
                  Result   :=   Result   or   PAGE_READWRITE  
              end  
              else  
              begin  
                  Result   :=   Result   or   PAGE_READONLY  
              end  
          end  
          else   if   (ImageScn   and   IMAGE_SCN_MEM_WRITE)   <>   0   then  
          begin  
              Result   :=   Result   or   PAGE_WRITECOPY  
          end  
          else  
          begin  
              Result   :=   Result   or   PAGE_NOACCESS;  
          end;  
      end;  
   
      procedure   ProcessExports(PExports:   PImageExportDirectory;   BlockSize:   cardinal);  
      var  
          ExportLoop:   byte;  
          ImportedFn:   cardinal;  
          PFnName:   pchar;  
          FnIndex:   dword;  
   
          function   IsForwarderString(Data:   pchar):   boolean;  
          begin  
              Result   :=   Data   >   PExports;  
              if   Result   then   Result   :=   cardinal(Data   -   PExports)   <   BlockSize;  
          end;  
   
          function   GetForwardedSymbol(ForwarderString:   pchar):pointer;  
          var  
              sForwarderString,   DllName:   string;  
              ForwarderLoop:   integer;  
              LibHandle:   HModule;  
          begin  
              sForwarderString   :=   ForwarderString;  
              while   ForwarderString^   <>   '.'   do  
              begin  
                  Inc(ForwarderString);  
              end;  
              DllName   :=   Copy(sForwarderString,   1,   pos('.',   sForwarderString)   -   1);  
              if   not   Find(NewLibInfo.LibsUsed,   DllName,   ForwarderLoop)   then  
              begin  
                  LibHandle   :=   LoadLibrary(pchar(DllName));  
                  Add(NewLibInfo.LibsUsed,   DllName);  
              end  
              else  
              begin  
                  LibHandle   :=   cardinal(NewLibInfo.LibsUsed[ForwarderLoop]);  
              end;  
              if   ForwarderString^   =   '#'   then   ForwarderString   :=   pointer(StrToInt((ForwarderString   +   1)));  
              Result   :=   GetProcAddress(LibHandle,   ForwarderString);  
          end;  
   
      begin  
          for   ExportLoop   :=   0   to   PExports.NumberOfNames   -   1   do  
          begin  
              PFnName   :=   pchar(PdwordArr(cardinal(PExports.AddressOfNames)   +   cardinal(ImageBase))^[ExportLoop]   +   cardinal(ImageBase));  
              for   ImportedFn   :=   low(Imports)   to   high(Imports)   do  
              begin  
                  if   Imports[ImportedFn].Name   =   PFnName   then  
                  begin  
                      FnIndex   :=   PwordArr(cardinal(PExports.AddressOfNameOrdinals)   +   cardinal(ImageBase))^[ExportLoop];  
                      Imports[ImportedFn].PProcVar^   :=   pointer(PdwordArr(cardinal(PExports.AddressOfFunctions)   +   cardinal(ImageBase))^[FnIndex]   +   cardinal(ImageBase));  
                      if   IsForwarderString(Imports[ImportedFn].PProcVar^)then  
                      begin  
                          Imports[ImportedFn].PProcVar^   :=   GetForwardedSymbol(Imports[ImportedFn].PProcVar^);  
                      end;  
                  end;  
              end;  
          end;  
      end;  
   
      procedure   ProcessRelocs(PRelocs:PImageBaseRelocation);  
      var  
          PReloc:   PImageBaseRelocation;  
          RelocsSize:   cardinal;  
          Reloc:   PWord;  
          ModCount:   cardinal;  
          RelocLoop:   cardinal;  
      begin  
          PReloc   :=   PRelocs;  
          RelocsSize   :=   ImageNtHeaders.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size;  
          while   cardinal(PReloc)   -   cardinal(PRelocs)   <   RelocsSize   do  
          begin  
              ModCount   :=   (PReloc.SizeOfBlock-Sizeof(PReloc^))   div   2;  
              Reloc   :=   pointer(cardinal(PReloc)+sizeof(PReloc^));  
              for   RelocLoop   :=   0   to   ModCount   -   1   do  
              begin  
                  if   Reloc^   and   $f000   <>   0   then   Inc(pdword(cardinal(ImageBase)   +   PReloc.VirtualAddress   +   (Reloc^   and   $0fff))^,   ImageBaseDelta);  
                  Inc(Reloc);  
              end;  
              PReloc   :=   pointer(Reloc);  
          end;  
      end;  
   
      procedure   ProcessImports(PImports:   PImageImportDescriptor);  
      var  
          PImport:   PImageImportDescriptor;  
          Import:   LPDword;  
          PImportedName:   pchar;  
          LibHandle:   HModule;  
          ProcAddress:   pointer;  
          PLibName:   pchar;  
          ImportLoop:   integer;  
   
          function   IsImportByOrdinal(ImportDescriptor:   dword;   HLib:   THandle):   boolean;  
          begin  
              Result   :=   (ImportDescriptor   and   IMAGE_ORDINAL_FLAG32)   <>   0;  
          end;  
   
      begin  
          PImport   :=   PImports;  
          while   PImport.Name<>0   do  
          begin  
              PLibName   :=   pchar(cardinal(PImport.Name)   +   cardinal(ImageBase));  
              if   not   Find(NewLibInfo.LibsUsed,   PLibName,   ImportLoop)   then  
              begin  
                  LibHandle   :=   LoadLibrary(PLibName);  
                  Add(NewLibInfo.LibsUsed,   PLibName);  
              end  
              else  
              begin  
                  LibHandle   :=   cardinal(NewLibInfo.LibsUsed[ImportLoop]);  
              end;  
              if   PImport.TimeDateStamp   =   0   then  
              begin  
                  Import   :=   LPDword(pImport.FirstThunk+cardinal(ImageBase))  
              end  
              else  
              begin  
                  Import   :=   LPDword(pImport.OriginalFirstThunk   +   cardinal(ImageBase));  
              end;  
              while   Import^   <>   0   do  
              begin  
                  if   IsImportByOrdinal(Import^,   LibHandle)   then  
                  begin  
                      ProcAddress   :=   GetProcAddress(LibHandle,   pchar(Import^   and   $ffff))  
                  end  
                  else  
                  begin  
                      PImportedName   :=   pchar(Import^   +   cardinal(ImageBase)   +   IMPORTED_NAME_OFFSET);  
                      ProcAddress   :=   GetProcAddress(LibHandle,   PImportedName);  
                  end;  
                  PPointer(Import)^   :=   ProcAddress;  
                  Inc(Import);  
              end;  
              Inc(PImport);  
          end;  
      end;  
 

begin  
      ImageNtHeaders   :=   pointer(int64(cardinal(Src))   +   PImageDosHeader(Src)._lfanew);  
      ImageBase   :=   VirtualAlloc(nil,   ImageNtHeaders.OptionalHeader.SizeOfImage,   MEM_RESERVE,   PAGE_NOACCESS);  
      ImageBaseDelta   :=   cardinal(ImageBase)   -   ImageNtHeaders.OptionalHeader.ImageBase;  
      SectionBase   :=   VirtualAlloc(ImageBase,   ImageNtHeaders.OptionalHeader.SizeOfHeaders,   MEM_COMMIT,   PAGE_READWRITE);  
      Move(Src^,   SectionBase^,   ImageNtHeaders.OptionalHeader.SizeOfHeaders);  
      VirtualProtect(SectionBase,   ImageNtHeaders.OptionalHeader.SizeOfHeaders,   PAGE_READONLY,   OldProtect);  
      PSections   :=   pointer(pchar(@(ImageNtHeaders.OptionalHeader))   +   ImageNtHeaders.FileHeader.SizeOfOptionalHeader);  
      for   SectionLoop   :=   0   to   ImageNtHeaders.FileHeader.NumberOfSections   -   1   do  
      begin  
          VirtualSectionSize   :=   PSections[SectionLoop].Misc.VirtualSize;  
          RawSectionSize   :=   PSections[SectionLoop].SizeOfRawData;  
          if   VirtualSectionSize   <   RawSectionSize   then  
          begin  
              VirtualSectionSize   :=   VirtualSectionSize   xor   RawSectionSize;  
              RawSectionSize   :=   VirtualSectionSize   xor   RawSectionSize;  
              VirtualSectionSize   :=   VirtualSectionSize   xor   RawSectionSize;  
          end;  
          SectionBase   :=   VirtualAlloc(PSections[SectionLoop].VirtualAddress   +   pchar(ImageBase),   VirtualSectionSize,   MEM_COMMIT,   PAGE_READWRITE);  
          FillChar(SectionBase^,   VirtualSectionSize,   0);  
          Move((pchar(src)   +   PSections[SectionLoop].PointerToRawData)^,   SectionBase^,   RawSectionSize);  
      end;  
      NewLibInfo.DllProc   :=   TDllEntryProc(ImageNtHeaders.OptionalHeader.AddressOfEntryPoint   +   cardinal(ImageBase));  
      NewLibInfo.ImageBase   :=   ImageBase;  
      SetLength(NewLibInfo.LibsUsed,   0);  
      if   ImageNtHeaders.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress   <>   0   then   ProcessRelocs(pointer(ImageNtHeaders.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress   +   cardinal(ImageBase)));  
      if   ImageNtHeaders.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress   <>   0   then   ProcessImports(pointer(ImageNtHeaders.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress   +   cardinal(ImageBase)));  
      for   SectionLoop   :=   0   to   ImageNtHeaders.FileHeader.NumberOfSections   -   1   do  
      begin  
          VirtualProtect(PSections[SectionLoop].VirtualAddress   +   pchar(ImageBase),   PSections[SectionLoop].Misc.VirtualSize,   GetSectionProtection(PSections[SectionLoop].Characteristics),   OldProtect);  
      end;  
      if   @NewLibInfo.DllProc   <>   nil   then  
      begin  
          if   not   NewLibInfo.DllProc(cardinal(ImageBase),   DLL_PROCESS_ATTACH,   nil)   then  
          begin  
              NewLibInfo.DllProc   :=   nil;  
              xFreeLibrary(Result);  
          end;  
      end;  
      if   ImageNtHeaders.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress   <>   0   then   ProcessExports(pointer(ImageNtHeaders.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress   +   cardinal(ImageBase)),   ImageNtHeaders.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size);  
      Result   :=   NewLibInfo;  
  end;  
   
  end.  
   
  ==========================================================  
   
   
  program   test;  
   
  {$R   'RSRC.res'   'RSRC.RC'}  
   
  Uses  
      Windows,   DLLUnit;  
   
  var  
      ResourceLocation:   HRSRC;  
      ResourceSize:   LongWord;  
      ResourceHandle:   THandle;  
      ResourcePointer:   Pointer;  
   
      TestFunction:   procedure;  
      MyImports:   array   [0..0]   of   TImportItem   =(  
        (Name:   'TestFunction';   PProcVar:   @@TestFunction)  
      );  
      MyLibrary:   TLibInfo;  
   
  begin  
      ResourceLocation   :=   FindResource(HInstance,   pchar('a01'),   RT_RCDATA);  
      if   ResourceLocation   <>   0   then  
      begin  
          ResourceSize   :=   SizeofResource(HInstance,   ResourceLocation);  
          if   ResourceSize   <>   0   then  
          begin  
              ResourceHandle   :=   LoadResource(HInstance,   ResourceLocation);  
              if   ResourceHandle   <>   0   then  
              begin  
                  ResourcePointer   :=   LockResource(ResourceHandle);  
                  if   ResourcePointer   <>   nil   then  
                  begin  
                      MyLibrary   :=   xLoadLibrary(ResourcePointer,   MyImports);  
                      TestFunction;  
                  end;  
              end;  
          end;  
      end;  
      xFreeLibrary(MyLibrary);  
  end.

不错,记录一下。

收藏...

//我是这样测试的  
   
  function   SysPath:   string;   //   返回系统所在的路径  
  var  
      vBuffer:   array[0..MAX_PATH]   of   Char;  
  begin  
      GetSystemDirectory(vBuffer,   MAX_PATH);  
      Result   :=   IncludeTrailingPathDelimiter(vBuffer);  
  end;   {   SysPath   }  
   
  var  
      vAnsiUpper:   function   (lpsz:   LPSTR):   LPSTR;   stdcall;  
      vImports:   array   [0..0]   of   TImportItem   =(  
        (Name:   'CharUpperA';   PProcVar:   @@vAnsiUpper)  
      );  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
      vBuffer:   PChar;  
      vMemoryStream:   TMemoryStream;  
      vLibInfo:   TLibInfo;  
  begin  
      vMemoryStream   :=   TMemoryStream.Create;  
      vMemoryStream.LoadFromFile(SysPath   +   'user32.dll');  
      vLibInfo   :=   xLoadLibrary(vMemoryStream.Memory,   vImports);  
      GetMem(vBuffer,   2);  
      vBuffer[0]   :=   'a';  
      vBuffer[1]   :=   #0;  
      vAnsiUpper(vBuffer);  
      Caption   :=   vBuffer;  
      //xFreeLibrary(vLibInfo);   //就是释放dll有问题//需要再分析  
      vMemoryStream.Free;  
  end;

收藏~~~

谢谢,收到。待我测试后开贴送分。

收藏~~

收藏~~  
 

测试通过。

zswang(伴水清清)请接分  
  http://community.csdn.net/Expert/TopicView3.asp?id=5206299  
  http://community.csdn.net/Expert/TopicView3.asp?id=5206298

jf

怪不得Delphi顽强存在呢,原来有如此之强人强贴。

这个小小帖子的有着极其巨大的价值。

还是有一些局限性,比如注入Explorer.exe,如果使用xLoadLibaray会导致Explorer异常结束。

VirtualAlloc   ->   VirtualAllocEx  
  你需要申请的是IE的内存空间而不是自己进程的内存空间

嘿嘿,悄悄收藏之

posted @ 2009-02-03 09:50 delphi2007 阅读(298) | 评论 (0)编辑 收藏

请教大家:如何把.DCU文件反编译回源代码?谢谢。 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061116174815216.html
如题。扣谢。  
  一定结贴。

我也想知道有没办法`~~顶一顶~~`

.DCU没有办法反编译成源代码的。

是不可能的,要不然,delphi的好多控件和程序解密就太简单啦  
  一个DEDE就搞定!

找Borland吧。

不知道。

还以为能看到解决办法呢。

幫頂~!

不大可能

Borland也没有办法,因为每个人实现的方法都不一样,但是最终的结果可能一样。  
  如果你能看懂汇编就可以,没问题。有个DCU2PAS,只能看到程序框架,内部实现全是汇编。

不行!

....寻觅牛人

根据编译时间,找到编译的人,根据编译的人,找到代码作者,可以采用金钱,美女,暴力等手段得到源代码。  
   
   
   
  不过前提是作者的记忆力过关。

posted @ 2009-02-03 09:50 delphi2007 阅读(1011) | 评论 (0)编辑 收藏

如何另存WORD里的图片到本地为GIF格式? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061116170428217.html
目的是想用于电子签名,把图片里的信息取出来。  
 

把图片COPY到图片处理软件,再另存

我是说用程序实现:WORD中选中图片,实现另存为

posted @ 2009-02-03 09:50 delphi2007 阅读(340) | 评论 (0)编辑 收藏

亲爱的大家:哪里有关于D7调用WINDOWS视频API的资料?谢谢 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061116150753218.html
如题。

windows   api   本身就没有视频的吧

但是,我看了别人的例程,调用的是     'AVICAP32.dll';  
    'MSVFW32.DLL';   'AVIFIL32.DLL';  
  好像是系统提供的啊,  
  我是菜鸟,请指正。

posted @ 2009-02-03 09:50 delphi2007 阅读(172) | 评论 (0)编辑 收藏

getwindowrect不能正确使用,请指教 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061116121147219.html
ha:hwnd;  
      i:integer;  
      begin  
  ha:=findwindow(nil,pchar(excelapplication1.caption));  
  showmessage(inttostr(ha));  
  getwindowrect(ha,posi);  
  showmessage(inttostr(posi.TopLeft.X));  
  为何   posi.left,posi.topleft.x   的值均为零,不能正确返回excel窗口的正确位置,  
  不知道代码错在那里?  
   
 

procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
      Rect:TRect;  
  begin  
      GetWindowRect(Handle,Rect);  
      ShowMessage(inttostr(Rect.Left));  
  end;  
   
  我这个代码是可以的,有可能是你的posi没有定义成TRect;

posted @ 2009-02-03 09:50 delphi2007 阅读(767) | 评论 (0)编辑 收藏

如何结束另一个程序的进程? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061116114828220.html
请问如何用Delphi程序结束另一个程序的进程?(请注意:是结束进程,而不仅仅是关闭程序)

SEND一个WM_CLOSE或WM_DESTROY消息到此进程去  
  或者用TerminateProcess结束进程

有具体的函数调用形式吗?或者请给一个实例,谢谢!

TerminateProcess(ProcessID,ExitCode);  
  ProcessID是进程ID,ExitCode是退出码;

TerminateProcess  
   
  返回值    
  Long,非零表示成功,零表示失败。    
   
  参数表    
  参数   类型及说明    
  hProcess   Long,指定要中断的一个进程的句柄(相当于进程的PID)  
  uExitCode   Long,进程的一个退出代码    
 

用TerminateProcess就可以了.

uses   Tlhelp32;  
   
  Function   KillProcess(List:Array   Of   String):Boolean;   Stdcall;  
  Var  
      s:String;  
      I,   Fs,   hKill:Integer;  
      FP:TProcessEntry32;  
  Begin  
      Result   :=   False;  
      Fs   :=   CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,   0);  
      FP.DwSize   :=   SizeOf(FP);  
      If   Process32First(Fs,   FP)   Then  
          Repeat  
              s   :=   UpperCase(Trim(FP.szExeFile));  
              For   I   :=   Low(List)To   High(List)   Do  
                  If   s=UpperCase(Trim(List[I]))   Then   Begin  
                      hKill   :=   OpenProcess(PROCESS_TERMINATE,   False,   FP.th32ProcessID);  
                      TerminateProcess(hKill,   0);//强制关闭进程  
                      CloseHandle(hKill);  
                      Result   :=   True;  
                  End;  
          Until   Not(Process32Next(Fs,   FP));  
  End;  
   
  KillProcess(['aaa.exe','bbb.exe']);  
 

posted @ 2009-02-03 09:50 delphi2007 阅读(370) | 评论 (0)编辑 收藏

仅列出标题
共34页: First 11 12 13 14 15 16 17 18 19 Last