资源描述:
《delphi程序启动技术概要》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Delphi程序启动技术概要赵晋楠zhaojinnan@p3china.com上海普华科技发展有限公司2005-11-14目录1检测应用程序的多重实例21.1概述21.2实现目标21.3实现过程21.3.1查找多重实例21.3.2把最初的实例呈现给用户32程序启动画面的实现62.1概述62.2实现目标62.3实现过程62.3.1准备材料62.3.2设计Splash窗体62.3.3添加工程代码72.4程序启动画面的Flash实现82.4.1准备材料92.4.2设计Splash窗体92.4.3添加工程代码92.4.4不足101检测应用程序的多重实例1.1概述在Windows中允许多个
2、相同的应用程序实例运行,但我们有时不希望这种多重实例同时运行,特别是当数据源不支持同时多个写入操作时,因为这样有可能会使我们的程序崩溃。1.2实现目标关于检测应用程序多重实例的示例也非常多,因此,本文将达到以下目的:1)只允许运行一个程序的实例2)当检测到第二个实例时,原实例自动呈现到所有窗体的最前面以提醒用户,即使当前程序是最小化的。1.3实现过程该实现过程全部以代码实现,没有可视化编辑的内容。您可以在新建一个工程后,打开Project
3、ViewSource查看DelphiIDE自动生成的工程源代码。programProject1;usesForms,Unit1in'Unit1
4、.pas'{Form1};{$R*.res}beginApplication.Initialize;Application.CreateForm(TForm1,Form1);Application.Run;end.1.3.1查找多重实例首先,当程序启动时,我们要确认当前运行的进程中是否还有一个实例运行,以进行下一步的动作。第一种方法:使用API函数FindWindow,当查找到一个指定的窗体时,会返回这个窗体的句柄(句柄可通俗地理解为一个窗体的标识、编号);否则,如果没有找到,变量hWnd等于0(注意在uses部分加Windows单元,以可以使用该函数)。varhWnd:THan
5、dle;beginhWnd:=FindWindow('TForm1',nil);FindVCLWindow()ifhWnd=0thenbeginApplication.Initialize;Application.CreateForm(TForm1,Form1);Application.Run;endelsebeginSetForegroundWindow(hWnd);end;end.第二种方法,使用互斥技术。varhMutex:THandle;beginHMutex:=CreateMutex(nil,False,'OneCopyMutex');ifWaitForSingleOb
6、ject(hMutex,0)<>wait_TimeOutthenbeginApplication.Initialize;Application.CreateForm(TForm1,Form1);Application.Run;end;end.1.3.2把最初的实例呈现给用户以上两种方法都可以避免应用程序的多重实例,但这显然不够。如果最初的应用程序是最小化的,而我们可爱的用户没有注意到他的存在,他可能会因为每次启动程序失败而大伤胆火,并影响我们的软件产品在他心目中的地位。那我们就把最初的实例呈现给他吧。这个回调函数很好地列举了当前所有与TForm1类名相同的窗体,functionE
7、numWndProc(hwnd:THandle;Param:Cardinal):Bool;stdcall;varClassName,WinModuleName:string;WinInstance:THandle;beginResult:=True;SetLength(ClassName,100);GetClassName(hwnd,PChar(ClassName),Length(ClassName));ClassName:=PChar(ClassName);ifClassName=TForm1.ClassNamethenbegin{10获取目标窗口的模块名}SetLength(
8、WinModuleName,200);WinInstance:=GetWindowLong(hwnd,GWL_HINSTANCE);GetModuleFileName(WinInstance,PChar(WinModuleName),Length(WinModuleName));WinModuleName:=PChar(WinModuleName);//调整长度{20比较模块名}ifWinModuleName=ModuleNamethenbeginFoundWnd:=Hwnd;R