Delphi制作关不掉的程序
来源:互联网 发布:淘宝宝贝代理 编辑:程序博客网 时间:2024/06/06 03:38
问题的提出
最近要编写一个考试系统,使得考生能自主地取得试卷并进入考试,考试期间系统自动计时并在考试结束后自动回卷到服务器。取卷、回卷功能都已实现,但在整个考试过程中能成功地准确计时,必须使得程序不在中途被关闭掉。退一步来说,即使程序中途被关闭,也要自动地重新起动,并以之前已保存的时间记录继续工作。
解决的思路
对于这种监控用的程序除了程序的交互界面要做得不能让用户退出外,更应该注意到用户使用诸如“任务管理器”等“暴力”的手段来终止程序。而对付这种终止程序的方法一般来说有以下两种方法:
第一种方法,把监控程序的进程伪装起来。例如把进程的名称改为与系统进程相仿的名字,让用户不敢终止或忽略这个进程,更甚者直接把进程的名称也隐藏起来。以上的方法已在很多计算机病毒中得到了实现。但现在要编写的是“考试系统”,不同于病毒启动的隐蔽性,用户是自主地进入程序(自主地取得试卷),因此用户很容易就知道进程的名字。从而也很容易就用任务管理器把相应的进程结束掉。
另外的一种方法是在加载程序产生工作进程后,这个工作进程又再加载另外一个程序产生另外一个进程(以下称“影子进程”),两个进程之间相互监控。如每隔200ms就探测一下对方存不存在,如果不存在就马上加载它。因为Windows自带的任务管理器是不能在同一时间终止两个进程的,因此,只要保证探测的时间间隔足够的短(比点击4、5次鼠标短就行了),就可以保证这个程序能及时的重生。
对于第二种方法,按一般的思路要写两个程序,一个用于产生工作进程,另一个用于产生影子进程。但这样的也存在一个漏洞:如果一旦工作原理被他人了解,很容易就被另一个假的影子程序所替代,使得这种方法失效。有鉴于此,让同一程序根据不同的启动方式(本例使用不同的命令行参数),分别产生工作进程及影子进程,然后再进行相互监控,这样就能有效地堵塞了以上漏洞。
程序的实现
示例程序用Delphi编码。在Delphi中新建一个Application,把它保存为ShadowTest.dpr。把工程默认的Unit保存为WorkerUnit.pas,接着多加一个Form到工程中,并保存为ShadowUnit.pas。把WorkerUnit中的Form改名为为frmWorker,同时也把ShadowUnit中的Form改名为frmShadow,并在两个Form中都各加入一个定时器Timer1,设置Interval值为 200。在两个Form的声明中加入
程序说明:
1. 程序中重载CreateParams过程,旨在是设定工作进程对应的WinClassName。这样就可以为影子进程中的FindWindow找到工作进程的句柄做好准备。
2. Timer1Timer的作用是定时以影子进程的WinClassName查找相应的进程句柄,若找不到就起动它。
3. btnStopMeClick的作用在于停止程序。当真的要停止进程时,通过进程间PostMessage机制,从工作进程中发一个终止运行的信息到影子进程,使得其退出,然后马上终止自身进程。
打开 ShadowUnit.pas,并加入以下代码
程序说明:
StopMe函数的作用在于响应工作进程发来的退出消息。其它部份与WorkerUnit.pas中的内容相仿。
接着打开ShadowTest.dpr,改写里面的内容
ShadowTest.dpr是整个程序的关键,它的运行步骤如下:
1. 通过命令行参数( -shadow)来识别应该处于工作进程还是影子进程模式。然后检测有没有与自身相同模式下已运行的进程,若有则退出。这是为了保证在同一时间只有一个工作进程和一个影子进程运行。
2. 按VCL框架要求调用Application.Initialize;进行初始化进程。
3. 通过AppID识别工作模式,然后初始化对应的主窗口。如果是在影子模式下,还应该把程序的主窗口通过ShowMainForm := False;语句隐藏起来,同时通过ShowWindow(Application.Handle, SW_HIDE); 把任务栏上的任务也隐藏起来。
- Delphi制作关不掉的程序
- delphi制作的托盘程序
- delphi制作的托盘程序
- Delphi 制作的画图程序!
- Delphi 程序制作要点
- Delphi 程序制作要点
- Delphi制作安装程序
- delphi NT服务程序制作
- GDI+ 在Delphi程序的应用 -- 制作水印效果图片
- GDI+ 在Delphi程序的应用 -- 制作水印效果图片
- 在Delphi中制作以浏览器为界面的程序
- delphi 类的写法 和 控制台程序的制作---深入Delphi编程
- delphi 类的写法 和 控制台程序的制作---深入Delphi编程
- delphi 类的写法 和 控制台程序的制作---深入Delphi编程 数据库
- 如何用Delphi制作录音程序
- InstallShield Express制作Delphi数据库安装程序
- 如何用Delphi制作录音程序
- delphi Inno Setup 制作安装程序
- 编译完成后复制文件
- 零散问题
- jquery使用一
- 去掉FlashGet3的广告的办法
- 第七章 鼠标part2
- Delphi制作关不掉的程序
- 代理IP刷网页源码
- (转)VS2005启动不了的原因
- sqlserver 期中考试题
- 关于C++中const & 返回类型的一些看法
- Delphi写内存补丁范例
- sql DATEPART函数使用
- ASP.NET - 使用数据源控件缓存数据
- Delphi写的一个函数的Hook类