用delphi7编写windows服务程序

合集下载

用delphi7编写windows服务程序

用delphi7编写windows服务程序

⽤delphi7编写windows服务程序⽤delphi7编写windows服务程序总结⼀、服务程序的创建delphi编写服务程序⾮常简单,点击菜单File->New->Other->New属性页->Service Application,系统⾃动会创建基本的代码。

这⾥需要说明的是,在“New属性页”中还有⼀个Service,这个Service和Service Application还是有区别的,应该说Service Application的范围⼤,它可以包含⼏个Service。

⼀个Service Application可以创建⼏个Service,service继承⾃TService,界⾯表现和TDataModel类似,做过数据库的朋友肯定都不陌⽣,区别是TDataModel是⽤来放数据库连接及操作组件的容器,⽽TService则是可以存放很多没有界⾯的组件,如indy的IDtcpclient等。

⼆、重要属性及事件说明属性:DisplayName 显⽰名称Name 名称,当你⽤命令提⽰符来启动、停⽌服务时,就需要⽤到Interactive 与界⾯交互的选项事件:OnCreate:类似于Tform的OnCreateOnDestroy:类似于Tform的OnDestroyOnExecute:⾮常重要,⼀般写成下⾯while not Terminated dobeginSleep(10);ServiceThread.ProcessRequests(False);end;OnPause:服务暂停OnShutdown:不太清楚OnStart:服务启动,重要OnStop:服务停⽌,重要三、服务的依赖关系因为我的服务是要连接数据库的,所以必须要等sql server的服务起来之后,我才能起来,这样才能连接数据库,因此这⾥⾯有个依赖关系的问题。

可以在属性Dependencies 中增加⼀项,选择MSSQLSERVER。

《Delphi7程序设计基础》实验指导书2012last

《Delphi7程序设计基础》实验指导书2012last

实验一Delphi程序设计初识实验目的●了解Delphi 7.0的集成开发环境(IDE)●初步掌握在Delphi IDE中开发应用程序的一般步骤●初步掌握窗体设计器、对象观察器、代码编辑器的使用方法实验示例1设计如下图所示的Windows应用程序。

程序运行后,窗口空白显示,鼠标点击窗口,则显示如图文字,同时“退出”按钮激活;单击“退出”按钮,则关闭窗口,结束运行。

实现步骤:1.新建Application项目启动Delphi 7.0后,IDE已自动创建并初始化了一个Application项目Project1。

第1步可省略。

否则,通过执行菜单【File】→【New】→【Application】项创建,或单击工具栏上的New items快捷钮打开的对话框来创建Application。

IDE自动初始化一个Windows应用程序项目。

2.在窗体上布置组件1)用鼠标拖动的方法,适当调整窗体的大小;2)在standard组件板上用鼠标点击(Button组件),然后在窗体适当位置单击,将自动创建按钮Button1;3)在standard组件板上用鼠标点击(Label组件),然后在窗体适当位置单击,将自动创建标签Label1。

3.设置窗体和组件属性1)通过单击窗体空白处,或在对象观察器(Object Inspector)窗口的对象列表框中选中Form1,然后在属性页(Properties)中点击选中Caption属性,在其后输入“My first form”属性值;2)同样方法选中Label1组件对象,将其Caption属性值设为“我的第一个Windows应用程序”,Font(字体)属性设为“宋体”、五号、深蓝色,Visible(可视的)属性设为False;3)选中Button1组件对象,设置其Caption属性为“退出”,Enabled(激活的)属性设为False。

4.编写程序代码1)选中Form1,在对象观察器窗口的事件(Events)页中选中OnClick(鼠标点击)事件,鼠标双击其后的编辑处,IDE则自动初始化了一个TForm1的OnClick事件处理过程(见代码编辑器窗口),转到代码编辑器窗口,在对应事件处理过程中编写如下代码:procedure TForm1.FormClick(Sender: TObject);beginlabel1.Visible:=true;button1.Enabled:=true;end;2)选中Button1,同样方法,编写其OnClick事件处理程序代码如下:procedure TForm1.Button1Click(Sender: TObject);beginform1.Close;end;5.保存项目和程序单元执行菜单【File】→【S ave Project As…】项,在打开的保存项目文件对话框中,选择项目保存位置,编辑项目文件名,确认保存项目(扩展名dpr);然后执行菜单【File】→【Save As…】项,在打开的对话框中保存单元文件(扩展名pas)。

Delphi7创建Intraweb Web程序

Delphi7创建Intraweb Web程序

使用Delphi 7创建Intraweb应用程序赵海平haipin@一、使用Intraweb创建Web服务程序Intraweb是一套开发Web应用程序的简单工具,你可以像开发传统的可视化和窗口程序一样,开发Web应用程序。

你可以通过Delphi语言写出各种商用软件,当需要的时候Intraweb可以转成脚本或者Html语言。

你可以通过下面的各种方式使用IntraWeb:✧单独式IntraWeb使用其独立的应用对象类型处理程序。

程序开发不需商业服务器,而以Intraweb自己的应用程序服务器来进行应用程序开发.✧应用程序模式IntraWeb支持应用程序对象。

应用程序依靠商业服务器。

✧页面模式应用程序被Web Broker or WebSnap所支持。

二、IntraWeb应用程序可以创建如下三种类型:✧ISAPI/NSAPI✧Apache 版本1 和2✧CGI (仅用于页面模式)✧Windows服务三、使用Intraweb控件IntraWeb与大多数的浏览器兼容,IntraWeb应用程序自己探测用户的浏览器,以达到最好的浏览效果。

IntraWeb支持Internet Explorer从版本4-6, Netscape 4和6,以及Mozilla.。

一个重要的优势是IntraWeb象开发Vcl和CLX程序一样,使用同一套工具和技术。

你可以拖动控件到窗口上开发你的程序界面。

下面列出VCL/CLX控件与IntraWeb控件的对照表:VCL/CLX控件对应的IntraWeb IntraWeb控件面板位置Button IWButton IWStandardCheckBox IWCheckBox IW StandardComboBox IWComboBox IW Standard DBCheckBox IWDBCheckBox IW DataDBComboBox IWDBComboBox IW DataDBEdit IWDBEdit IW DataDBGrid IWDBGrid IW DataDBImage IWDBImage IW DataDBLabel IWDBLabel IW DataDBListBox IWDBListBox IW Data DBLookupComboBox IWDBLookupComboBox IW Data DBLookupListBox IWDBLookupListBox IW DataDBMemo IWDBMemo IW DataDBNavigator IWDBNavigator IW DataDBText IWDBText IW DataEdit IWEdit IW StandardImage IWImage or IWImageFile IW StandardLabel IWLabel IW StandardListBox IWListBox IW StandardMemo IWMemo IW Standard RadioGroup IWRadioGroup IW StandardTimer IWTimer IW StandardTreeView IWTreeView IW Standard四、开始创建IntraWeb应用程序假如你以前使用过Delphi开发过可视化应用程序,那么,恭喜你,你已经有了基本的开发IntraWeb的基础。

利用Delphi编写Windows控制面板组件及实例

利用Delphi编写Windows控制面板组件及实例

利用Delphi编写Windows 控制面板组件及实例张建军(中国人民解放军合肥炮兵学院研究生系97级)韩莹(中保财险安徽省铜陵市分公司计财部)关键词:在windows95/Nt/98操作系统中,控制面板(controlpanel)提供了定制windows的操作方法,通过它可以完成设置打印机、显示、网络、添加新硬件等功能。

通常控制面板包含20多个组件(*.cpL),分别负责系统某一方面的设置。

鼠标双击任一组件图标,控制面板调用相应程序,弹出对话框,允许设置系统参数。

确认修改后系统参数保存在windows注册表或某一配置文件(*.INI)中。

一、控制面板组件基础知识控制面板是一个windows应用程序c:\wINDowS\coNtRoL.ExE,其配置文件是c:\wINDowS\coNtRoL.INI.控制面板组件是一些动态链接库,其扩展名不是DLL,而是cpL.通常,控制面板组件保存在c:\wINDowS\SyStEm\目录下。

在coNtRoL.INI中有一个[mmcpL]节,该节可指定由coNtRoL.ExE调用的动态链接库,其格式一般为:…[mmcpL]uniqueName=D:\pRoJEct1.DLL(这里假设pRoJEct1为用户编写的控制面板组板文件名,其访问路径可由读者自行确定)…采用此方法,pRoJEct1.DLL不必存放在c:\wINDowS\SyStEm\目录下,扩展名不必改为cpL.coNtRoL.ExE运行后按以下顺序调用这些动态链接库:在c:\wINDowS\SyStEm\目录下调用mAIN.INI.已加载并输出cplApplet()函数的可安装驱动程序。

在coNtRoL.INI[mmcpL]节中指定的DLL.在c:\wINDowS\SyStEm\目录下调用cpL.因此,编写控制面板组件近似于编写普通DLL.通常一个cpL支持控制面板中的一个组件(即一个图标),也可支持多个组件。

Delphi中的Windows API编程初步

Delphi中的Windows API编程初步

Delphi中的Windows API编程初步使用RAD类型工具的人越来越多了,虽然我对于RAD类的工具向来不多作评议,但我还是常常使用的。

所以我深深的知道这类工具虽然给我们带来了便利,使我们能不用将更多的精力放在界面上,但同时也将初学者紧紧的圈在了他所提供的控件和组件中。

所以很多人并不能真正的了解windows的消息驱动原理以及windows的运作过程。

本文中我们就一起来学习一下windows的运作过程,使我们对delphi这样一个优秀的编程工具有一个新的认识,并对windows下的程序编写有更深刻、透辟的了解和认识。

一、消息的定义我们先从使用的角度看看windows的运作过程。

我们都知道windows是一个多任务的平台,使用这个平台,我们可以一边工作,一边听歌曲,等等。

所以对于这个操作平台可以想象到它除了一般操作系统所提供的对文件系统,内存系统等的管理之外,更重要的就是我们所熟知的消息驱动了,也就是说,要通过一定的方法和结构可以给每一个运行中的程序实例以及其中的每一个窗口传递其中所触发的事件。

Windows中究竟是怎样做到的呢?让我们打开安装delphi的目录,在其中的source\rtl\Win\Windows.pas文件(或者在一个工程文件,找到uses,在其中找到Windows,然后按下Ctrl键,用鼠标点击单词),在其中的第18919行,我们可以看到这样一个结构的定义:{ Message structure }PMsg = ^TMsg ;tagMSG = packed recordhwnd : HWND ;message : UINT ;wParam : WPARAM ;lParam : LPARAM ;time : DWORD ;pt : TPoint ;end ;{ $ EXTERNALSYM tagMSG }TMsg = tagMSG ;MSG = tagMSG ;{ $ EXTERNALSYM MSG }其中hwnd字段表示触发了消息的窗口的ID,由此可以保证消息正确的发送到每一个窗口去。

Delphi7程序设计第3章

Delphi7程序设计第3章

⑸ OnKeyDown事件、OnKeyUp OnKeyDown OnKeyUp事件和OnKePress OnKeyUp 事件 这是响应键盘的一组事件。组件处于激活的焦 点状态时,按下了键盘上的键时将触发 OnKeyDown事件,返回的是按下键的键值,可以 OnKeyDown 是复合键;释放一个按下的键时将触发OnKeyUp OnKeyUp 事件;键盘上的键一次完整地按下和释放操作 将触发OnKeyPress OnKeyPress事件。 OnKey量的可视化组件,使程序员能够在 拖拖放放中轻松地设计程序界面。Delphi中提供的 【Standard】 、 【Additional】 和 【Win32】 三 个 标 签页放置基本组件。这些组件都是任何程序设计必不 可少的。本节将详细介绍常用组件的使用方法。
5.HideSelection属性 该属性决定当输入焦点从Tmemo组件移走后,编辑框内原 来被选中的文本是否依然保持选中状态。其设置为True,不 保持;其值为False,保持。该属性的默认值为True。 6.MaxLength属性 该属性确定编辑框最多可以输入的字符数,缺省值为0, 表示可以输入任意多的字符;如果该属性不为0,只能向编辑 框中输入小于或等于设定值的字符数。 7.Modified属性 该属性确定编辑框中的内容自建立以来或者Modified属 性最后一次被设置为False之后是否被修改。 8. PasswordChar属性 该属性在一些编辑框组件如TMaskEdit、TDBEdit中都有。 缺省时该属性为#0,即没有掩码。用户可以自己设置一个掩 码,如‘*’,则用户在编辑框中输入的字符都将以‘*’字 符显示,而隐藏真实的字符。
当编辑框中的内容发生变化时,触发该事件,它是Edit中最 常用,也是最有用的事件之一。 当按下一个按键时,触发该事件。 编辑框获得输入焦点时,触发该事件。

DELPHI编写服务程序

DELPHI编写服务程序

DELPHI编写服务程序一、服务程序和桌面程序的区别Windows 2000/XP/2003等支持一种叫做“系统服务程序”的进程,系统服务和桌面程序的区别是:系统服务不用登陆系统即可运行;系统服务是运行在System Idle Process/System/smss/winlogon/services下的,而桌面程序是运行在Explorer下的;系统服务拥有更高的权限,系统服务拥有Sytem的权限,而桌面程序只有Administrator权限;在Delphi中系统服务是对桌面程序进行了再一次的封装,既系统服务继承于桌面程序。

因而拥有桌面程序所拥有的特性;系统服务对桌面程序的DoHandleException做了改进,会自动把异常信息写到NT服务日志中;普通应用程序启动只有一个线程,而服务启动至少含有三个线程。

(服务含有三个线程:TServiceStartThread服务启动线程;TServiceThread服务运行线程;Application主线程,负责消息循环);摘录代码:procedure TServiceApplication.Run;begin...StartThread := TServiceStartThread.Create(ServiceStartT able);trywhile not Forms.Application.Terminated doForms.Application.HandleMessage;Forms.Application.Terminate;if StartThread.ReturnValue <> 0 thenFEventLogger.LogMessage(SysErrorMessage(StartThread.Re turnValue));finallyStartThread.Free;end;...end;procedure TService.DoStart;begintryStatus := csStartPending;tryFServiceThread := TServiceThread.Create(Self);FServiceThread.Resume;FServiceThread.WaitFor;FreeAndNil(FServiceThread);finallyStatus := csStopped;end;excepton E: Exception doLogMessage(Format(SServiceFailed,[SExecute, E.Message]));end;end;在系统服务中也可以使用TTimer这些需要消息的定时器,因为系统服务在后台使用TApplication在分发消息;二、如何编写一个系统服务打开Delphi编辑器,选择菜单中的File|New|Other...,在New Item中选择Service Application项,Delphi便自动为你建立一个基于TServiceApplication的新工程,TserviceApplication是一个封装NT服务程序的类,它包含一个TService1对象以及服务程序的装卸、注册、取消方法。

delphi7anli附录使用说明

delphi7anli附录使用说明

附录:案例使用说明1.关于操作系统的使用说明本书的案例适合于在Microsft Windows 98操作系统和Microsft Windows XP操作系统中开发制作,如果你在Microsft Windows 98操作系统中安装Delphi 7.x,则请先参考后面的Delphi的安装与使用,但是如果你指定要在Microsft Windows XP操作系统中使用本书并进行案例制作,由于Microsft Windows XP操作系统对于一些非微软的应用程序需要进行驱动程序签名,否则Delphi一些程序将不可运行,因此你需要首先作如下一些操作:在Microsft Windows XP操作系统中进行驱动程序签名的设置,其过程按如下顺序进行:控制面板――>系统属性――>驱动程序签名选项――>忽略-安装。

在进行了驱动程序签名设置之后,就可以象在Microsft Windows 98操作系统中安装和使用Delphi 7.x了。

2.本书中的Delphi 7.x代指Delphi 7.0以及Delphi 7.0以上的其他的测试版直到Delphi8.0。

3.Delphi 7.0的注册安装与使用注册本书中,由于Delphi 7.x泛指Delphi 7.0以上的一切升级版(包括Delphi 7.0),因此我们特以Delphi 7.0的安装为例来说明Delphi 在操作系统中的安装方法,请严格按此说明进行安装,因为光盘中的程序是未建立安装文件的程序,它们可能依赖于原开发环境,因此原开发平台的安装将影响到光盘中案例的正常的运行和演示。

安装Delphi 7.0的方法如下:第一步:启动Delphi 7.0,系统提示将Delphi 7.0的安装文件解压缩到硬盘的一个指定的驱动器之中,这样在硬盘中安装最为快捷而且不会由于光盘的质量问题而中断安装。

第二步:对Delphi 7.0进行安装注册。

在Delphi 7.0光盘中有一个序列号生成器(Keygen 程序),启动该程序生成安装Delphi 7.0的序列号和著作权号,请记下这两个号码,因为在安装Delphi 7.0后需要对Delphi 7.0进行使用注册,使用注册时即需要用到这两个号码。

用Delphi编写Windows服务程序

用Delphi编写Windows服务程序

一、Windows服务简介服务程序(Service Application)是一种运行于WinNT的后台程序,每个服务程序(Service Application)中可能包含若干个服务(Service),每个服务就是其中的一个线程(该服务也可以创建多个子线程)。

采用服务,应用程序可以获得特殊的权限,而且不会被用户通过Win2000的任务管理器直接结束程序,所以服务常常用来实现一些特殊的目标。

通过Win2000控制面板中的服务管理工具,我们可以设置/查看服务的特性:(1)服务名称;(2)显示名称;(3)描述;(4)启动类型;(5)依赖关系;其中,服务名称是标识给服务的。

以Win2000的C:\WINNT\System32\程序为例子,该Exe文件对应一个Service Application,是该服务程序的可见实体;该exe中包含多个服务(Service),例如Alerter,Dhcp(DHCP Client),Messenger等。

当我们结束一个服务的时候,该服务所在的Service Application 中的其他服务并没有被终止。

在Delphi中,Borland的工程师为我们提供了TServiceApplication,TService,TServiceThread等类,封装了大量细节,简化了服务程序的。

二、TServiceApplication在Delphi中,类TServiceApplication就对应上述的ServiceApplication。

利用Delphi的开发环境,我们新建一个Service Application Project,同时就创建了一个继承自TService的类。

项目文件中的Application对象就是一个TServiceApplication实例。

每个TServiceApplication包含若干个TService对象,正好对应上述的服务程序和服务之间的数量关系。

使用Delphi7创建Intraweb应用程序

使用Delphi7创建Intraweb应用程序

使用Delphi 7创建Intraweb应用程序赵海平haipin@一、使用Intraweb创建Web服务程序Intraweb是一套开发Web应用程序的简单工具,你可以像开发传统的可视化和窗口程序一样,开发Web应用程序。

你可以通过Delphi语言写出各种商用软件,当需要的时候Intraweb可以转成脚本或者Html语言。

你可以通过下面的各种方式使用IntraWeb:✧单独式IntraWeb使用其独立的应用对象类型处理程序。

程序开发不需商业服务器,而以Intraweb自己的应用程序服务器来进行应用程序开发.✧应用程序模式IntraWeb支持应用程序对象。

应用程序依靠商业服务器。

✧页面模式应用程序被Web Broker or WebSnap所支持。

二、IntraWeb应用程序可以创建如下三种类型:✧ISAPI/NSAPI✧Apache 版本1 和2✧CGI (仅用于页面模式)✧Windows服务三、使用Intraweb控件IntraWeb与大多数的浏览器兼容,IntraWeb应用程序自己探测用户的浏览器,以达到最好的浏览效果。

IntraWeb支持Internet Explorer从版本4-6, Netscape 4和6,以及Mozilla.。

一个重要的优势是IntraWeb象开发Vcl和CLX程序一样,使用同一套工具和技术。

你可以拖动控件到窗口上开发你的程序界面。

下面列出VCL/CLX控件与IntraWeb控件的对照表:VCL/CLX控件对应的IntraWeb IntraWeb控件面板位置Button IWButton IWStandardCheckBox IWCheckBox IW StandardComboBox IWComboBox IW Standard DBCheckBox IWDBCheckBox IW DataDBComboBox IWDBComboBox IW DataDBEdit IWDBEdit IW DataDBGrid IWDBGrid IW DataDBImage IWDBImage IW DataDBLabel IWDBLabel IW DataDBListBox IWDBListBox IW Data DBLookupComboBox IWDBLookupComboBox IW Data DBLookupListBox IWDBLookupListBox IW DataDBMemo IWDBMemo IW DataDBNavigator IWDBNavigator IW DataDBText IWDBText IW DataEdit IWEdit IW StandardImage IWImage or IWImageFile IW StandardLabel IWLabel IW StandardListBox IWListBox IW StandardMemo IWMemo IW Standard RadioGroup IWRadioGroup IW StandardTimer IWTimer IW StandardTreeView IWTreeView IW Standard四、开始创建IntraWeb应用程序假如你以前使用过Delphi开发过可视化应用程序,那么,恭喜你,你已经有了基本的开发IntraWeb的基础。

《Delphi程序设计基础教程》 第1章 Delphi7集成开发环境

《Delphi程序设计基础教程》  第1章 Delphi7集成开发环境

1.2 Delphi软件的安装及卸载
图1-10 设置安装路径
DELPHI程序设计基础教程
2020年1月9日星期四
1.2 Delphi软件的安装及卸载
选择完安装路径后,单击【next】按钮, 安装向导询问用户是否安装数据库保存到 本地硬盘,如图1-11所示。
DELPHI程序设计基础教程
2020年1月9日星期四
1.2 Delphi软件的安装及卸载
单击【Install】按钮,开始正式安装,如图1-13所 示。
图1-13 正式安装
DELPHI程序设计基础教程
2020年1月9日星期四
1.2 Delphi软件的安装及卸载
系统安装完毕后,用户可单击【Finish】按钮即可 ,如图1-14所示。
图1-14 系统安装完毕
DELPHI程序设计基础教程
2020年1月9日星期四
1.1 Delphi简介
Delphi7的新特点 Delphi7在继承了Delphi中能有效的帮助开发人员快速
的构造出所需的Windows应用程序等传统优势的同时,也进 行了进一步的完善和发展。
目前,Delphi7加强了集成开发环境、数据库、可视组 件库等方面功能。首先,为了顺应当今基于Web服务的电子 商务应用程序开发的潮流,Delphi7加强了使用商业XML的 Windows操作系统与Web Services兼容能力。其次,为了 更加便于程序员编程,Delphi7在集成开发环境中的组件面 板上新加入了一些组件并优化了代码编辑工作。再次, Delphi7使用Rave Reports(即目前可获得的第一个和唯一 的专业性可视化报表工具)技术,这大大加快了程序员创 建跨平台的报表的速度。另外,Delphi7增加了对Windows XP风格的支持。最后,Delphi7也为开发人员提供了更为可 靠的安全性的控制以及可伸缩性的开发需要。

用Delphi开发WinSock应用程序

用Delphi开发WinSock应用程序

组件分别放到 客户端、服务 器端 ( 应用程序 )的窗 体上 ,
然后编写相应的事 件处理 和函数使得客 户端 、 服务器端协
用这些组件方 便、 迅速地开发 一些有关 Wisc n k的应用程 o 序 ,如编写 H r 、F P - i和 We Tr _ 、EMal P r b浏监器等方面的
应的数据 t 若是要对所有保持连接的客户端发送公告数据. 则应如 下安排代码 r
fr 1 O t e So 乱 Act Co n cin - O f s o := o s t U e n e t st o o 』 1 s T ete8o  ̄ l s s r d e
客户方套 接字 和服务器方套接字 它们封装 了Wi ok P n cA I S
的函数和例程 , 使得利 用它 们编写同络应用程序时不 必关
注有关套接字的建立 、 管理 等方面的 细节 。 Ci tokt 当T ln ce eS
和 T ev ro kt 用阻塞型的方式 工作时 , SreS ce 使 要用到的相 关 类还有 T n u k tt a 与 Tev r l a hed wi e e r m S Se sreC i t ra 。 eT
这时 客户方、服务器方套接字都 是各自单独以异步的方式 从 套接 字连接中读写信 息,在这种方式下 ,当从 套接字连 接 读取数据时 ,执行 过程不会 被阻塞 ( 即一直在执行 ) 。
在这种一般情况下 . 设计时将 T l ns ee、 s r rok t C i t k tT v S ce ee e e
t'c 。即 A I,它 定义了多 个函数和 例程 ,以使程 序员 ef e l a P) 能够利用 Wi o 的 消息驱动机制进行 编程; n ws d 更进一步的 是,D l i( e h4与 D lh5 eh Dli p p epi)用一组组件 为我们封装

用DELPHI编写WINDOWS服务程序

用DELPHI编写WINDOWS服务程序

会把所有的请求委托给该 TServiceThread 成员对象处理,该对象以默认的方式处理所有的请求。 TService. ServiceExecute 是 TService 的主体内容。一个服务要正常运行,除了需要处理它要关注的目标(比如监听某个端口、执行某个 任务等)外,还要响应外部命令/请求:比如终止、暂停、恢复该服务。因此可以考虑创建一个专门的线程来完成该任务,而在 ServiceExecute 中处理外面命令/请求inated do begin ServiceThread.ProcessRequests(False); end; 当然,也可以在 OnExecute 中处理某些任务,如监听某个端口,但是这常常会导致该 Service 不能及时响应 Stop/Pause 等请求。当 OnExecute 执行完了,该服务实际上就完成了任务要结束了(terminate)。
MyPHSThread := TPHSSendThread.Create(); MyPHSThread.FreeOnTerminate:=True;
MyPHSThread.Priority:= tpLower ;
end;
在 OnStop 事件内,我们应该停止线程,并释放打开的资源,需要注意的是当你停止线程时,一般用 Terminate 方法,在线程内用 Terminated 属性来判断 是否需要结束线程,而由于是线程,和主进程是时间运行的,有可能你刚好在进行 Terminate 时,线程已经刚进行过 Terminated 判断,正在进行比较费时 的处理工作,而此时主进程立即执行 Terminate 后就进行释放资源的工作时,会造成线程执行错误,因此应该等到线程真正的正确停止后,主进程才能进行资 源释放工作。
三、TService

delphi如何实现启动停止windows服务

delphi如何实现启动停止windows服务
var
HandleSocket: Hwnd;
begin
HandleSocket := FindWindow(nil, 'scktsrvr');
if HandleSocket <> 0 then
SendMessage(handlesocket, wm_close, 0, 0);
Result := hService <> 0;
if Result then
try //停止并卸载服务;
Result := ControlService(hService, SERVICE_CONTROL_STOP, SvcStatus);
//删除服务,这一句可以不要;
up
---------------------------------------------------------------
from mota骆la
那就只执行一次喽
将Scktsrvr放入:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
end;
---------------------------------------------------------------
帮你up一下!
---------------------------------------------------------------
Байду номын сангаас
Scktsrvr.exe加到启动程序中
---------------------------------------------------------------

用Delphi编写Windows服务程序

用Delphi编写Windows服务程序

用Delphi编写Windows服务程序Delphi是一种基于Object Pascal语言的集成开发环境(IDE),主要用于Windows平台的软件开发。

它提供了丰富的库和组件,使得开发者可以轻松地创建各种类型的应用程序,包括Windows服务程序。

Windows服务程序是在后台运行的应用程序,它们可以在Windows系统启动时自动启动,并在系统运行期间持续运行。

这些服务通常用于执行一些重要的任务,如数据备份、定时任务、网络通信等。

编写Windows服务程序需要以下步骤:1. 创建新的Delphi项目:打开Delphi IDE,选择"File"菜单,点击"New",然后选择"Other",在弹出的对话框中选择"Service Application",点击"OK"按钮。

这将创建一个新的Windows服务程序项目。

2. 设计服务:在Delphi IDE的主界面中,可以看到Service1单元。

在该单元中,可以定义服务的属性和事件。

可以使用TService组件来添加自定义的属性和事件。

例如,可以添加一个Timer组件来定时执行某个任务。

3. 编写服务逻辑:在Service1单元中,可以编写服务的逻辑代码。

例如,可以在服务的OnStart事件中编写启动逻辑,在OnStop事件中编写停止逻辑。

可以使用Delphi提供的各种库和组件来实现所需的功能。

4. 安装服务:在Delphi IDE的主界面中,选择"Project"菜单,点击"Options",然后选择"Application"选项卡。

在"Title"字段中输入服务的名称,在"Description"字段中输入服务的描述。

然后点击"Install"按钮,将服务安装到系统中。

用Delphi创建服务程序

用Delphi创建服务程序

用Delphi创建服务程序Windows 2000/XP和2003等支持一种叫做"服务程序"的东西.程序作为服务启动有以下几个好处:(1)不用登陆进系统即可运行.(2)具有SYSTEM特权.所以你在进程管理器里面是无法结束它的.笔者在2003年为一公司开发机顶盒项目的时候,曾经写过课件上传和媒体服务,下面就介绍一下如何用Delphi7创建一个Service程序.运行Delphi7,选择菜单File-->New-->Other--->Service Application.将生成一个服务程序的框架.将工程保存为ServiceDemo.dpr和Unit_Main.pas,然后回到主框架.我们注意到,Service有几个属性.其中以下几个是我们比较常用的:(1)DisplayName:服务的显示名称(2)Name:服务名称.我们在这里将DisplayName的值改为"Delphi服务演示程序",Name改为"DelphiService".编译这个项目,将得到ServiceDemo.exe.这已经是一个服务程序了!进入CMD模式,切换致工程所在目录,运行命令"ServiceDemo.exe /install",将提示服务安装成功!然后"net start DelphiService"将启动这个服务.进入控制面版-->管理工具-->服务,将显示这个服务和当前状态.不过这个服务现在什么也干不了,因为我们还没有写代码:)先"net stop DelphiService"停止再"ServiceDemo.exe /uninstall"删除这个服务.回到Delphi7的IDE.我们的计划是为这个服务添加一个主窗口,运行后任务栏显示程序的图标,双击图标将显示主窗口,上面有一个按钮,点击该按钮将实现Ctrl+Alt+Del功能.实际上,服务程序莫认是工作于Winlogon桌面的,可以打开控制面板,查看我们刚才那个服务的属性-->登陆,其中"允许服务与桌面交互"是不打钩的.怎么办?呵呵,回到IDE,注意那个布尔属性:Interactive,当这个属性为True的时候,该服务程序就可以与桌面交互了.File-->New-->Form为服务添加窗口FrmMain,单元保存为Unit_FrmMain,并且把这个窗口设置为手工创建.完成后的代码如下:unit Unit_Main;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs, Unit_FrmMain;typeTDelphiService = class(TService)procedure ServiceContinue(Sender: TService; var Continued: Boolean);procedure ServiceExecute(Sender: TService);procedure ServicePause(Sender: TService; var Paused: Boolean);procedure ServiceShutdown(Sender: TService);procedure ServiceStart(Sender: TService; var Started: Boolean);procedure ServiceStop(Sender: TService; var Stopped: Boolean);private{ Private declarations }function GetServiceController: TServiceController; override;{ Public declarations }end;varDelphiService: TDelphiService;FrmMain: TFrmMain;implementation{$R *.DFM}procedure ServiceController(CtrlCode: DWord); stdcall;beginDelphiService.Controller(CtrlCode);end;function TDelphiService.GetServiceController: TServiceController; beginResult := ServiceController;end;procedure TDelphiService.ServiceContinue(Sender: TService;var Continued: Boolean);beginwhile not Terminated dobeginSleep(10);ServiceThread.ProcessRequests(False);end;end;procedure TDelphiService.ServiceExecute(Sender: TService); beginwhile not Terminated dobeginSleep(10);ServiceThread.ProcessRequests(False);end;end;procedure TDelphiService.ServicePause(Sender: TService;var Paused: Boolean);beginPaused := True;end;procedure TDelphiService.ServiceShutdown(Sender: TService); begingbCanClose := true;Status := csStopped;ReportStatus();end;procedure TDelphiService.ServiceStart(Sender: TService;var Started: Boolean);beginStarted := True;Svcmgr.Application.CreateForm(TFrmMain, FrmMain);gbCanClose := False;FrmMain.Hide;end;procedure TDelphiService.ServiceStop(Sender: TService;var Stopped: Boolean);beginStopped := True;gbCanClose := True;FrmMain.Free;end;end.主窗口单元如下:unit Unit_FrmMain;interfaceusesWindows, Messages, SysUtils, V ariants, Classes, ShellApi, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;constWM_TrayIcon = WM_USER + 1234;typeTFrmMain = class(TForm)Timer1: TTimer;Button1: TButton;procedure FormCreate(Sender: TObject);procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);procedure FormDestroy(Sender: TObject);procedure Timer1Timer(Sender: TObject);procedure Button1Click(Sender: TObject);private{ Private declarations }IconData: TNotifyIconData;procedure AddIconToTray;procedure TrayIconMessage(var Msg: TMessage); message WM_TrayIcon;procedure SysButtonMsg(var Msg: TMessage); message WM_SYSCOMMAND;public{ Public declarations }end;varFrmMain: TFrmMain;gbCanClose: Boolean;implementation{$R *.dfm}procedure TFrmMain.FormCreate(Sender: TObject);beginFormStyle := fsStayOnTop; {窗口最前}SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW); {不在任务栏显示} gbCanClose := False;Timer1.Interval := 1000;Timer1.Enabled := True;end;procedure TFrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);beginCanClose := gbCanClose;if not CanClose thenbeginHide;end;end;procedure TFrmMain.FormDestroy(Sender: TObject);beginTimer1.Enabled := False;DelIconFromTray;end;procedure TFrmMain.AddIconToTray;beginZeroMemory(@IconData, SizeOf(TNotifyIconData));IconData.cbSize := SizeOf(TNotifyIconData);IconData.Wnd := Handle;IconData.uID := 1;IconData.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;IconData.uCallbackMessage := WM_TrayIcon;IconData.hIcon := Application.Icon.Handle;IconData.szTip := 'Delphi服务演示程序';Shell_NotifyIcon(NIM_ADD, @IconData);end;procedure TFrmMain.DelIconFromTray;beginShell_NotifyIcon(NIM_DELETE, @IconData);end;procedure TFrmMain.SysButtonMsg(var Msg: TMessage);beginif (Msg.wParam = SC_CLOSE) or(Msg.wParam = SC_MINIMIZE) then Hideelse inherited; // 执行默认动作end;procedure TFrmMain.TrayIconMessage(var Msg: TMessage);beginif (Msg.LParam = WM_LBUTTONDBLCLK) then Show();end;procedure TFrmMain.Timer1Timer(Sender: TObject);beginAddIconToTray;end;procedure SendHokKey;stdcall;varHDesk_WL: HDESK;beginHDesk_WL := OpenDesktop ('Winlogon', 0, False, DESKTOP_JOURNALPLAYBACK);if (HDesk_WL <> 0) thenif (SetThreadDesktop (HDesk_WL) = True) thenPostMessage(HWND_BROADCAST, WM_HOTKEY, 0, MAKELONG (MOD_ALT or MOD_CONTROL, VK_DELETE));end;procedure TFrmMain.Button1Click(Sender: TObject);vardwThreadID : DWORD;beginCreateThread(nil, 0, @SendHokKey, nil, 0, dwThreadID);end;end.补充:(1)关于更多服务程序的演示程序,请访问以下Url:/pages.php?id=226,上面包含了多个演示如何控制和管理系统服务的代码.(2)请切记:Windows实际上存在多个桌面.例如屏幕传输会出现白屏,可能有两个原因:一是系统处于锁定或未登陆桌面,二是处于屏幕保护桌面.这时候要将当前桌面切换到该桌面才能抓屏.(3)关于服务程序与桌面交互,还有种动态切换方法.大概单元如下:unit ServiceDesktop;interfacefunction InitServiceDesktop: boolean;procedure DoneServiceDeskTop;implementationuses Windows, SysUtils;constDefaultWindowStation = 'WinSta0';DefaultDesktop = 'Default';varhwinstaSave: HWINSTA;hdeskSave: HDESK;hwinstaUser: HWINSTA;hdeskUser: HDESK;function InitServiceDesktop: boolean;vardwThreadId: DWORD;begindwThreadId := GetCurrentThreadID;// Ensure connection to service window station and desktop, and// save their handles.hwinstaSave := GetProcessWindowStation;hdeskSave := GetThreadDesktop(dwThreadId);hwinstaUser := OpenWindowStation(DefaultWindowStation, FALSE, MAXIMUM_ALLOWED); if hwinstaUser = 0 thenbeginOutputDebugString(PChar('OpenWindowStation failed' + SysErrorMessage(GetLastError))); Result := false;exit;end;if not SetProcessWindowStation(hwinstaUser) thenbeginOutputDebugString('SetProcessWindowStation failed');Result := false;exit;end;hdeskUser := OpenDesktop(DefaultDesktop, 0, FALSE, MAXIMUM_ALLOWED);if hdeskUser = 0 thenbeginSetProcessWindowStation(hwinstaSave);CloseWindowStation(hwinstaUser);Result := false;exit;end;Result := SetThreadDesktop(hdeskUser);if not Result thenOutputDebugString(PChar('SetThreadDesktop' + SysErrorMessage(GetLastError)));end;procedure DoneServiceDeskTop;begin// Restore window station and desktop.SetThreadDesktop(hdeskSave);SetProcessWindowStation(hwinstaSave);if hwinstaUser <> 0 thenCloseWindowStation(hwinstaUser);if hdeskUser <> 0 thenCloseDesktop(hdeskUser);end;initializationInitServiceDesktop;finalizationDoneServiceDesktop;end.更详细的演示代码请参看:/samples/samples/os/isarticle.zip(4)关于安装服务如何添加服务描述.有两种方法:一是修改注册表.服务的详细信息都位于HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\下面,例如我们刚才那个服务就位于HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\DelphiService下.第二种方法就是先用QueryServiceConfig2函数获取服务信息,然后ChangeServiceConfig2来改变描述.用Delphi实现的话,单元如下:unit WinSvcEx;interfaceuses Windows, WinSvc;const//// Service config info levels//SERVICE_CONFIG_DESCRIPTION = 1;SERVICE_CONFIG_FAILURE_ACTIONS = 2;//// DLL name of imported functions//type//// Service description string//PServiceDescriptionA = ^TServiceDescriptionA;PServiceDescriptionW = ^TServiceDescriptionW;PServiceDescription = PServiceDescriptionA;{$EXTERNALSYM _SERVICE_DESCRIPTIONA}_SERVICE_DESCRIPTIONA = recordlpDescription : PAnsiChar;end;{$EXTERNALSYM _SERVICE_DESCRIPTIONW}_SERVICE_DESCRIPTIONW = recordlpDescription : PWideChar;end;{$EXTERNALSYM _SERVICE_DESCRIPTION}_SERVICE_DESCRIPTION = _SERVICE_DESCRIPTIONA;{$EXTERNALSYM SERVICE_DESCRIPTIONA}SERVICE_DESCRIPTIONA = _SERVICE_DESCRIPTIONA;{$EXTERNALSYM SERVICE_DESCRIPTIONW}SERVICE_DESCRIPTIONW = _SERVICE_DESCRIPTIONW;{$EXTERNALSYM SERVICE_DESCRIPTION}SERVICE_DESCRIPTION = _SERVICE_DESCRIPTIONA;TServiceDescriptionA = _SERVICE_DESCRIPTIONA;TServiceDescriptionW = _SERVICE_DESCRIPTIONW;TServiceDescription = TServiceDescriptionA;//// Actions to take on service failure//{$EXTERNALSYM _SC_ACTION_TYPE}_SC_ACTION_TYPE = (SC_ACTION_NONE, SC_ACTION_RESTART, SC_ACTION_REBOOT, SC_ACTION_RUN_COMMAND);{$EXTERNALSYM SC_ACTION_TYPE}SC_ACTION_TYPE = _SC_ACTION_TYPE;PServiceAction = ^TServiceAction;{$EXTERNALSYM _SC_ACTION}_SC_ACTION = recordaType : SC_ACTION_TYPE;Delay : DWORD;end;{$EXTERNALSYM SC_ACTION}SC_ACTION = _SC_ACTION;TServiceAction = _SC_ACTION;PServiceFailureActionsA = ^TServiceFailureActionsA;PServiceFailureActionsW = ^TServiceFailureActionsW;PServiceFailureActions = PServiceFailureActionsA;_SERVICE_FAILURE_ACTIONSA = recorddwResetPeriod : DWORD;lpRebootMsg : LPSTR;lpCommand : LPSTR;cActions : DWORD;lpsaActions : ^SC_ACTION;end;{$EXTERNALSYM _SERVICE_FAILURE_ACTIONSW}_SERVICE_FAILURE_ACTIONSW = recorddwResetPeriod : DWORD;lpRebootMsg : LPWSTR;lpCommand : LPWSTR;cActions : DWORD;lpsaActions : ^SC_ACTION;end;{$EXTERNALSYM _SERVICE_FAILURE_ACTIONS}_SERVICE_FAILURE_ACTIONS = _SERVICE_FAILURE_ACTIONSA;{$EXTERNALSYM SERVICE_FAILURE_ACTIONSA}SERVICE_FAILURE_ACTIONSA = _SERVICE_FAILURE_ACTIONSA;{$EXTERNALSYM SERVICE_FAILURE_ACTIONSW}SERVICE_FAILURE_ACTIONSW = _SERVICE_FAILURE_ACTIONSW;{$EXTERNALSYM SERVICE_FAILURE_ACTIONS}SERVICE_FAILURE_ACTIONS = _SERVICE_FAILURE_ACTIONSA;TServiceFailureActionsA = _SERVICE_FAILURE_ACTIONSA;TServiceFailureActionsW = _SERVICE_FAILURE_ACTIONSW;TServiceFailureActions = TServiceFailureActionsA;///////////////////////////////////////////////////////////////////////////// API Function Prototypes///////////////////////////////////////////////////////////////////////////TQueryServiceConfig2 = function (hService : SC_HANDLE; dwInfoLevel : DWORD; lpBuffer : pointer;cbBufSize : DWORD; var pcbBytesNeeded) : BOOL; stdcall;TChangeServiceConfig2 = function (hService : SC_HANDLE; dwInfoLevel : DWORD; lpInfo : pointer) : BOOL; stdcall;varhDLL : THandle ;LibLoaded : boolean ;varOSV ersionInfo : TOSV ersionInfo;{$EXTERNALSYM QueryServiceConfig2A}QueryServiceConfig2A : TQueryServiceConfig2;{$EXTERNALSYM QueryServiceConfig2W}QueryServiceConfig2W : TQueryServiceConfig2;{$EXTERNALSYM QueryServiceConfig2}QueryServiceConfig2 : TQueryServiceConfig2;{$EXTERNALSYM ChangeServiceConfig2A}{$EXTERNALSYM ChangeServiceConfig2W}ChangeServiceConfig2W : TChangeServiceConfig2;{$EXTERNALSYM ChangeServiceConfig2}ChangeServiceConfig2 : TChangeServiceConfig2;implementationinitializationOSV ersionInfo.dwOSV ersionInfoSize := SizeOf(OSV ersionInfo);GetV ersionEx(OSV ersionInfo);if (OSV ersionInfo.dwPlatformId = VER_PLA TFORM_WIN32_NT) and (OSV ersionInfo.dwMajorV ersion >= 5) then beginif hDLL = 0 thenbeginhDLL:=GetModuleHandle(AdvApiDLL);LibLoaded := False;if hDLL = 0 thenbeginhDLL := LoadLibrary(AdvApiDLL);LibLoaded := True;end;end;if hDLL <> 0 thenbegin@QueryServiceConfig2A := GetProcAddress(hDLL, 'QueryServiceConfig2A');@QueryServiceConfig2W := GetProcAddress(hDLL, 'QueryServiceConfig2W');@QueryServiceConfig2 := @QueryServiceConfig2A;@ChangeServiceConfig2A := GetProcAddress(hDLL, 'ChangeServiceConfig2A');@ChangeServiceConfig2W := GetProcAddress(hDLL, 'ChangeServiceConfig2W');@ChangeServiceConfig2 := @ChangeServiceConfig2A;end;endelsebegin@QueryServiceConfig2A := nil;@QueryServiceConfig2W := nil;@QueryServiceConfig2 := nil;@ChangeServiceConfig2A := nil;@ChangeServiceConfig2W := nil;@ChangeServiceConfig2 := nil;end;finalizationif (hDLL <> 0) and LibLoaded thenFreeLibrary(hDLL);end.interfaceusesWindows,WinSvc,WinSvcEx;function InstallService(const strServiceName,strDisplayName,strDescription,strFilename: string):Boolean; //eg:InstallService('服务名称','显示名称','描述信息','服务文件');procedure UninstallService(strServiceName:string);implementationfunction StrLCopy(Dest: PChar; const Source: PChar; MaxLen: Cardinal): PChar; assembler;asmPUSH EDIPUSH ESIPUSH EBXMOV ESI,EAXMOV EDI,EDXMOV EBX,ECXXOR AL,ALTEST ECX,ECXJZ @@1REPNE SCASBJNE @@1INC ECX@@1: SUB EBX,ECXMOV EDI,ESIMOV ESI,EDXMOV EDX,EDIMOV ECX,EBXSHR ECX,2REP MOVSDMOV ECX,EBXAND ECX,3REP MOVSBSTOSBMOV EAX,EDXPOP EBXPOP ESIPOP EDIend;function StrPCopy(Dest: PChar; const Source: string): PChar;beginResult := StrLCopy(Dest, PChar(Source), Length(Source));end;function InstallService(const strServiceName,strDisplayName,strDescription,strFilename: string):Boolean; var//ss : TServiceStatus;//psTemp : PChar;hSCM,hSCS:THandle;srvdesc : PServiceDescription;desc : string;//SrvType : DWord;lpServiceArgV ectors:pchar;beginResult:=False;//psTemp := nil;//SrvType := SERVICE_WIN32_OWN_PROCESS and SERVICE_INTERACTIVE_PROCESS;hSCM:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);//连接服务数据库if hSCM=0 then Exit;//MessageBox(hHandle,Pchar(SysErrorMessage(GetLastError)),'服务程序管理器',MB_ICONERROR+MB_TOPMOST);hSCS:=CreateService( //创建服务函数hSCM, // 服务控制管理句柄Pchar(strServiceName), // 服务名称Pchar(strDisplayName), // 显示的服务名称SERVICE_ALL_ACCESS, // 存取权利SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS,// 服务类型SERVICE_WIN32_SHARE_PROCESSSERVICE_AUTO_START, // 启动类型SERVICE_ERROR_IGNORE, // 错误控制类型Pchar(strFilename), // 服务程序nil, // 组服务名称nil, // 组标识nil, // 依赖的服务nil, // 启动服务帐号nil); // 启动服务口令if hSCS=0 then Exit;//MessageBox(hHandle,Pchar(SysErrorMessage(GetLastError)),Pchar(Application.Title),MB_ICONERROR+MB_TO PMOST);if Assigned(ChangeServiceConfig2) thenbegindesc := Copy(strDescription,1,1024);GetMem(srvdesc,SizeOf(TServiceDescription));GetMem(srvdesc^.lpDescription,Length(desc) + 1);tryStrPCopy(srvdesc^.lpDescription, desc);ChangeServiceConfig2(hSCS,SERVICE_CONFIG_DESCRIPTION,srvdesc);finallyFreeMem(srvdesc^.lpDescription);FreeMem(srvdesc);end;end;lpServiceArgV ectors := nil;if not StartService(hSCS, 0, lpServiceArgV ectors) then //启动服务Exit;//MessageBox(hHandle,Pchar(SysErrorMessage(GetLastError)),Pchar(Application.Title),MB_ICONERROR+MB_TOPM OST);CloseServiceHandle(hSCS); //关闭句柄Result:=True;end;procedure UninstallService(strServiceName:string);varSCManager: SC_HANDLE;Service: SC_HANDLE;Status: TServiceStatus;beginSCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);if SCManager = 0 then Exit;tryService := OpenService(SCManager, Pchar(strServiceName), SERVICE_ALL_ACCESS);ControlService(Service, SERVICE_CONTROL_STOP, Status);DeleteService(Service);CloseServiceHandle(Service);finallyCloseServiceHandle(SCManager);end;end;end.(5)如何暴力关闭一个服务程序,实现我们以前那个"NT工具箱"的功能?首先,根据进程名称来杀死进程是用以下函数: uses Tlhelp32;function KillTask(ExeFileName: string): Integer;constPROCESS_TERMINA TE = $0001;varContinueLoop: BOOL;FSnapshotHandle: THandle;FProcessEntry32: TProcessEntry32;beginResult := 0;FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);FProcessEntry32.dwSize := SizeOf(FProcessEntry32);ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);while Integer(ContinueLoop) <> 0 dobeginif ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =UpperCase(ExeFileName))) thenResult := Integer(TerminateProcess(OpenProcess(PROCESS_TERMINA TE,BOOL(0),FProcessEntry32.th32ProcessID),0));ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);end;CloseHandle(FSnapshotHandle);end;但是对于服务程序,它会提示"拒绝访问".其实只要程序拥有Debug权限即可: function EnableDebugPrivilege: Boolean;function EnablePrivilege(hToken: Cardinal; PrivName: string; bEnable: Boolean): Boolean; varTP: TOKEN_PRIVILEGES;Dummy: Cardinal;beginTP.PrivilegeCount := 1;LookupPrivilegeV alue(nil, pchar(PrivName), TP.Privileges[0].Luid);if bEnable thenTP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLEDelse TP.Privileges[0].Attributes := 0;AdjustTokenPrivileges(hToken, False, TP, SizeOf(TP), nil, Dummy);Result := GetLastError = ERROR_SUCCESS;end;varhToken: Cardinal;beginOpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken); result:=EnablePrivilege(hToken, 'SeDebugPrivilege', True);CloseHandle(hToken);end;使用方法:EnableDebugPrivilege;//提升权限KillTask('xxxx.exe');//关闭该服务程序.。

Delphi面向Windows开发的基本实现

Delphi面向Windows开发的基本实现

第5章 面向Windows开发的基本实现Delphi可以实现Windows系统中的大多数可执行文件类型,这主要包括可执行程序(.EXE)和动态链接库(.DLL)。

其他的一些文件类型,通常以动态链接库的形式编译,只是输出的文件扩展名不同而已(例如.CPL,.SCR,.OCX等)。

Delphi使用动态链接库的格式实现了自己的库文件:包(.BPL)。

本章全面解析Delphi支持这些文件格式的每一个细节。

5.1 Win32应用程序:EXE5.1.1 适应Win32应用程序的最简化内核Nico Bendlin的MiniDExe很好地演示了不使用任何Delphi例程来实现一个Win32应用程序的方法。

对于一个可执行程序.EXE来说,只须满足如下条件,就可以在被Windows系统中执行:是一个以.EXE方式生成的格式正确的PE (Portable Executable)文件有一个正确的入口地址并记录在PE格式文件的头部编译器会按这样的规则生成文件模块,并将一段入口代码的地址记录在PE格式文件的头部。

这段入口代码固定地调用System.pas中的例程_InitExe()。

因此,可以进一步简化Nico Bendlin的MiniDExe://系统初始化单元unit SysInit;interfaceDelphi源代码分析第5章面向Windows开发的基本实现·84·varTlsIndex: Integer = -1;TlsLast: Byte;constPtrToNil: Pointer = nil;implementationend.//系统内核单元unit System;interfaceprocedure _InitExe;procedure _HandleFinally;procedure _Halt0;constKernel32 = 'kernel32.dll';User32 = 'user32.dll';typeTGUID = recordD1: LongWord;D2: Word;D3: Word;D4: array[0..7] of Byte;end;implementationprocedure ExitProcess (uExitCode: LongWord); stdcall; external kernel32 name 'ExitProcess';procedure _InitExe;asmend;procedure _HandleFinally;asmend;Delphi源代码分析5.1 Win32应用程序:EXE ·85·procedure _Halt0;beginExitProcess(0);end;end.//示例程序。

delphi7教程

delphi7教程

delphi7教程本文由qing347056贡献doc文档可能在WAP端浏览体验不佳。

建议您优先选择TXT,或下载源文件到本机查看。

软件程序编制规范3.2,软件程序编制规范 3.2.1,编制程序:根据系统分析要求编制程序,要求实现代码的复用,算法的优化,程序代码的优化, 发现数据库设计不合理的及时反馈,减少循环嵌套,基础数据避免重复更新,保证进入的数据就是齐全的, 正确的. 3.2.2,程序自测:负责按测试方案进行自测,交付测试的程序不能出现不能正常运行,未按公式计算的简单错误. 3.2.3,程序测试:将完成的程序转系统分析人员按测试方案测试. 3.2.4,开发工具的程序编制规范:详见详细规范. 3.2.5,.net 编程规范一.安装方法: 1, 安装IIS 与 frontpage 扩展:点击控制面板,点击添加删除程序,选择添加删除WINDOWS 组件,选择应用程序服务器. 点击详细信息, 选择 internet 信息服务 IIS, 点击详细信息, 选择 frontpage 2002 server extensions 与 internet 信息服务管理器,按向导提示点击下一步,然后放入系统盘. 2, 要在防火墙退出的环境下进行安装,把网线拔掉. 3, 放入第一张光盘,他会提示安装.net 必备,放入第三张光盘,根据向导提示安装.安装完第一张, 第二张就可以运行.net 了.第四,五,六张为MSDN 帮助文件.(07.02.06 添加) 3.2.6 Delphi7.0 3.2.6,Delphi7.0 编程规范第一部分:软件安装与控件安装方法第一部分:软件安装与控件安装方法控件安装一,软件安装:光盘或网络安装后,将光盘CRACK 目录下dent.slip 拷贝到安装路径下.未注册信息将不再显示. 二,基本安装: 1,对于单个控件,Componet-->install component..-->PAS 或 DCU 文件-->install; 2,对于带*.dpk 文件的控件包,File-->Open(下拉列表框中选*.dpk)-->install 即可; 3,对于带*.bpl 文件的控件包,Install Packages-->Add-->bpl 文件名即可; 4,如果以上 Install 按钮为失效的话,试试 Compile 按钮; 5,是run time lib 则在option 下的packages 下的runtimepackes 加之.如果编译时提示文件找不到的话,一般是控件的安装目录不在 Delphi 的 Lib 目录中,有两种方法可以解决: 1,反安装的源文件拷入到Delphi 的Lib 目录下; 2,或者Tools-->Environment Options 中把控件源代码路径加入到 Delphi 的 Lib 目录中即可. 注意:所安装的控件是否与你所用的Delphi 版本相适应. 三,控件删除: 在Component/Install Packages 中删除. 选Component/configure Palette… 有 pages 和 components 两个区域双击 components 区域,选中要删除得控件,下面有得Delete 按钮但系统提供的控件只能Hide,不能 delete. 打开控件所在的包文件(*.dpk),从中删除控件那个文件,再重新编译该包即可如果是整个控件包都要删除的话,project->Option->Packages,删掉那个packages 四,详细控件安装 1, Ehlib 控件第 1 页共 22 页运行Ehlib.v3.4.for.Delphi5678\Ehlib v3.4\Delphi7\DclEhLib70.dpk 文件,在弹出窗口中点击 Conpile,再点击install,提示安装成功后在Delphi—Tools—Environment Options—Library—Library Path 中添加路径Ehlib.v3.4.for.Delphi5678\Ehlib v3.4\Delphi7\ 2, Fastreport 控件分别运行fastreport 2.53\source\fr7.dpk, fastreport 2.53\source\ado\ FRADO7.dpk, fastreport 2.53\source\BDE\FRBDE7.dpk, fastreport 2.53\source\DBX\FRDBX7.dpk fastreport 2.53\QueryBuilder\Source\dclOQB70.dpk fastreport 2.53\QueryBuilder\Source\ADO\dclOQBADO70.dpk fastreport 2.53\QueryBuilder\Source\BDE\dclOQBBDE70.dpk fastreport 2.53\QueryBuilder\Source\DBX\dclOQBDBX70.dpk, fastreport 2.53\QueryBuilder\Source\IBX\dclOQBIBX70.dpk 文件, 在弹出窗口中点击Conpile,再点击install; 安装完毕后,在Delphi—Tools—Environment Options—Library—Library Path 中添加路径: fastreport 2.53\source fastreport 2.53\source\ado fastreport2.53\source\bde fastreport 2.53\source\dbx fastreport 2.53\source\ibx fastreport 2.53\QueryBuilder\Source fastreport 2.53\QueryBuilder\Source\ado fastreport 2.53\QueryBuilder\Source\bde fastreport 2.53\QueryBuilder\Source\dbx fastreport 2.53\QueryBuilder\Source\ibx 3,Raize 控件分别运行Raize\RC3\Source\Rz30Ctls_Dsgn70.dpk,Raize\RC3\Source\Rz30DBCtls_Dsgn70.dpk,在弹出窗口中点击Compile, 再点击install; 安装完毕后, Delphi—Tools—Environment Options—Library 在—Library Path 中添加路径:Raize\RC3\Source 4,VirtualTreeview 控件VirtualTreeview4.0.12\VirtualTreeview\Packages\VirtualTreesD7 D.dpk 文件,在弹出窗口中点击Compile, 再点击install; 安装完毕后, Delphi—Tools—Environment Options—Library—Library Path 在中添加路径:VirtualTreeview4.0.12\VirtualTreeview\Packages 5,xlreport 控件分别运行xlreport\xlr4pro123.exe 和xlreport\xlr4dfull123.exe,注意安装过程中只保留delphi7 和demo 两个选项即可,安装完毕后将安装路径下的AfalinaSoft\XL Report 4\Source 文件夹的所有文件拷到 AfalinaSoft\XL Report 4\d7units 中,运行d7XLR4_D.dpk 文件;同样将AfalinaSoft\ProOptionPack\Source 内的所有文件拷到AfalinaSoft\ProOptionPack\d7units 中,运行 d7OPack.dpk 文件五,第三方控件的下载与安装:用到的第三方控件在了解其用途后,经主任审批后,方可进行安装. 六,控件功能的学习方法:凡第三方提供的控件均有DEMO 的演示示例,可根据所学知识查看其属性设置及事件,运行演示结果,便可学习控件的功能,领会其功能,做到灵活运用. 七,将经常用到的控件直接拖动放在前面,使用起来比较方便.第 2 页共 22 页部分: 程序设计要求: 第二部分: 程序设计要求: 一,所有代码必须有注释.所有代码单行的注释用(//),多行的注释用{},注释用中文.每段程序的注释说明要简洁明确,说明程序编制的目的及主要功能,按照系统分析文件的功能节点进行分段注释.每段开头与结尾分别用一行'/'包括.在每个功能段内部根据具体情况进行分段注释,每段开头与结尾分别用一行'/'包括. 1,程序(unit)头的注释:标明对应的系统分析文件名和最早开始编制时间. 2, 函数(过程)(function, procedure)头的注释内容包括: (1)函数(过程)的目的(purpose). (2)函数(过程)返回值(结果集)(return value)的类型及含义(程序标准事件不用标明). (3)函数(过程)参数(parameters)的类型及含义列表(程序标准事件不用标明). (4)函数(过程)中使用的临时变量(var)的类型及含义列表. 二,所有项目,窗口,单元,控件,菜单等按照命名规范命名. 1,项目命名:"P"+项目描述的第一个声码. 2,Form 命名:使用系统分析文件的程序名拼音头字母命名窗口.如结存查询,窗口命名为jccx.再往下一级延伸的,在上级窗口名后加能区分要求的拼音头字母来命名. 3,Unit 命名:Unit 的名称(name)用字母 U 后跟相应的 Form 名称. 4,自定义过程,函数(procedure, function)命名:使用函数目的的拼音头字母命名. 5,简单变量,参数命名:使用变量含义的拼音头字母命名. 6,控件命名:一般情况下延用默认名.Query 控件命名:query 有复用的情况,命名时用qy1,qy2…标准命名,特定的query,命名时用"qy"+对应表名. 7,菜单命名:延用默认名,含右键菜单. 三,所有直接调用 DBGridEh 的录入类程序必须添加标准右键菜单. 四,所有查询类程序必须有序号,合计,合计用页脚方式,动态形成序号,必须添加标准右键菜单,窗口必须有caption,必须标明系统分析人员,程序编制人员,所有录入类,循环计算类不得出现 MESSAGE 框为 SQL 语句代码,所有编译后的程序设置的断点要清除. 五,所有窗口均按照1024X768 设置,窗口显示位置为桌面居中位置(设置position 属性为poDesktopCenter),大小为占桌面屏幕的1/4 为适,所有窗口必须设置为置前属性(设置 Formstyle 属性为 fsStayOnT op),保证调用子窗口时显示在最前. 六,Dbgrideh 的菜单使用右键标准菜单,包含筛选,升序,降序,多行合计,导出 excel,基础库维护时还要有多行替换功能. 七,所有月份数据要形成月份表,如qcsjb,mksyjlb,并同时修改查询程序,利用通用的月份查询函数, 每个月底要进行结转. 八,所有连接非 SQL 数据库的表(接口程序除外),必须建立 SQL 表,维护后导出,不允许直接读写. 九,编制程序要充分考虑输入时的出错情况:判断是否输入了空格,是否输入了不合规则的内容,判断大小写,在程序中做出判断和限制.如包装入库数据,导出VFP 时必须为大写,可以直接将录入的内容转换在大写,再如进入结存数据,先判断录入的产品是否是存在的产品,否则造成结存表中的数据不正确. 十,所有单位引用统一,维护一致,显示顺序按照包装,加工,库……显示,考核汇报除外. 十一,对基础库维护信息都要记录,除记录字段更换信息外,还要求录入员和更新时间. 十二,实时计划,外贸业务,成本管理各类程序增加一级界面(点击主窗口按钮即显示的界面)时,均增加记录使用人,使用机器 IP,使用计数信息,具体方法:在新增form 的onshow 事件中增加程序类型(ssjh,unit1,cbgl)+'.jrmk(self.Caption)'; onclose 事件中增加程序类型(ssjh,unit1,cbgl)+'.lkmk(self.Caption)'; 语句,用于记录模块使用信息. 十三,用程序实现的数据更改,在程序试运行前必须经主任审批,主任不在时由代理人员审批. 十四,所有录入类,查询类中的必须录入项,如没有录入必须提示,否则不能执行.第 3 页共 22 页十五,所有计算类程序实现,先查看数据类型,用 QY 连接实现公式计算的,参照 SQL 函数使用方法,用 DELPHI 连接字段或变量计算的,参照DELPHI 函数使用方法. 十六,代码必须采用缩进格式表示嵌套,多层嵌套的也遵循此规则.标准格式,如下: 缩进快捷键:CTRL+SHIFT+I 为向后,CTRL+SHIFT+U 为向前,选中部分块后可以直接按快捷键操作.输写各层嵌套时可先将BEGIN……END 对应,然后再进行嵌套. while do begin if then begin if then begin end else begin end; end else begin end; end; 十七,跳转语句语法: 1,if 语句:会计算一个表达式,并根据计算结果决定程序流程.If 保留字后跟随一个生成boolean 值True 或False 的表达式.一般用"="作为关系运算符,比较产生一个布尔型值.当表达式为 True 时,执行 Then 后的语句.否则执行 else 后的代码,if 语句也可以不含 else 部分,表达式为 False 时自动跳到下一行程序.If 语句可以嵌套,当使用复合语句表达时,复合语句前后需加上begin……end.Else 保留字前不能加 "; 而且, ", 编译器会将 ELSE 语句视为属于最靠近的 IF 语句. 必要时, 须使用begin……end 保留字来强迫 else 部分属于某一级的 if 语句. (1),单个条件: if 条件 then A,待执行语句单行时: 执行语句; B,待执行语句多行时: begin 语句1… 语句2… …… end; (2),选择条件: If (条件 1) and (条件 2) OR(条件3)…… then (3),ELSE 使用语法: If 条件 then 语句 1 Else 语句; (4),以上可以多层嵌套,每个嵌套里面均遵循以上语法. 2,case 语句:第 4 页共 22 页Case 语句适用于被判断的变量或属性是整形,字符型,枚举型或子界型时用 case 语句进行逻辑跳转比编写复杂的 if 语句容易阅读,而且程序代码整形较快.例: Procedure Tform1.button1click(sender:T object); Var Number:integer; Begin Number:=strtoint(edit1.text); case number of 1,3,5,7,9:label2.caption:='奇数'; 0,2,4,6,8:label2.caption:='偶数';10..100: Begin Label2.caption:='在10 到100 之间'; Form1.color:=clblue; End; Else Label2.caption:='大于 100 或为负数'; END; END; END. 十八,循环语句语法: 1,repeat 语句 i:=0; repeat i:=i+1; writen(i); until i=10; 2, while 条件 do begin end; 3,升序:for i:=0 to a do/降序: for i:=a downto 0 do begin end; 十九,在应用程序中所有QY 的connection 设置为主FORM 中的Adoconnection,所有的连接数据库设置均在 INI 文件中实现. 二十,多条语句不能写在一行,一条语句过长应分行写,分行尽量做到平均,层次性与语句的完整性.例: qy2.SQL.Add('update '+bm+' set jhdh=jhdh*'+qy1.FieldByName('lb').AsString+' '+ 'where rq='''+zxrq+''' and gx='+''''+ListBox1.Items[ListBox1.ItemIndex]+''' '+ 'and charindex(xm,'+''''+qy1.FieldByName('sm').AsString+''')>0'); 二十一,程序流程要清晰,一条 sql 语句实现的功能要单一.Sql 查询结果使用虚拟表保存的,使用前后清除虚拟表. 二十二,使用 else 语句时要避免语句过长,造成 if else 混乱. 二十三,多个系统调用的模块,要形成 DLL 文件,要有模块使用记录,更新时同步更新. 二十四,遇到需要与 VFP 接口的程序,要将 VFP 表维护好以后形成 SQL 表,不能直接连 VFP 表,导出 VFP 表后在原程序中使用. 二十五,sql 与 delphi 常用函数对照,使用方法及注意事项:第 5 页共 22 页1,在 delphi 程序中用变量取数据库表中字段值时,用 DELPHI 的类型对应 SQL 表字段中的类型来声明变量的类型. 2,在程序中执行 SQL 语句时,用 SQL 语句的语法. 3,经常用到的函数列表: delphi 字段类型字符型整型小数型日期时间型截取字符位置 string integer double tdatetime Copy(maskedit1.text,1,2) Pos('101',qy1.fieldbyname( 'bhxs').asstring) Round(4.5)=5;round(3.5)=3; 函数取值规则为四舍六入,五取偶, Formatfolat('0.00',1.1234) ='1.12' Trunc(4.9)=4 Inttostr(qy1.fieldbyname('ddqs').asinteger),floattostr ,strtoint,strtofloat,datetim etostr Length() Uppercase() Lowercase() Trim sql varchar,nvarchar,char,text int float,numeric datetime substring(rq,1,2) Charindex('101',bhxs)取小数位数函数取整Round(1.1234,2)=1.12Round(1.1234,0)=1 Cast(ddqs as varchar(10)) convert(int,a.LcLastDate+10-a. sndate) Len() Upper() Lower() 去左边的空格 Ltrim() 去右边的空格 Rtrim()类型转换取长度大写小写去空格举例如下: je:=strtofloat(formatfloat('0.00', qy1.fieldbyname('dj').asfloat*qy1.fieldbyname('ddqs').asinteger)); qy1.sql.add('select round(cast(hgjs as float)/ca st(jhjs as float),2)… ') 4,所有 Format+类型的函数,返回的类型均为字符型,在使用时注意,类型要对应. 5,整形的字段进行数值计算时必须先转换成 float 型后再计算. 二十六,函数,过程的使用: 1,函数的声明: 函数头: Function<函数名>(<形式参数表>):<类型>; 函数体: Begin <语句>; <语句>; …… <语句>; END; 2,在函数体中必须有一个赋值语句,将函数的返回值赋给函数名.第 6页共 22 页例: Function Total(x,y:integer):integer; Begin T otal:=x+y; End; 3,函数的调用:例: Procedure Tform1.Button1Click(Sender:Tobject); Var X,y,z:integer; Begin X:=2; Y:=3; Z:=total(x,y);//调用函数Label1.Caption:=inttostr(z); End; End. 4,函数在主 FORM 中声明,其它模块调用时,在USES 窗口位置处,加引用的单元文件名,调用方法为FORM 名+"."+函数名.按函数设置的参数赋值. 5,函数与过程的差异:过程的关键字为Proceduce,在函数声明中,必须指明函数的返回类型,而过程不需要返回任何类型的值,无需声明返回类型,在函数体中,必须将函数的返回类型赋给函数名,而在过程中则不存在此语句. 6,函数及过程其它要求: A,函数体或过程内容的编制在 FORM 的begin……END 范围之内进行编制,是单独的,不要含在其它的控件或事件之内. B,函数或过程内容查看方法:按 CTRL+SHIFT+鼠标点击,然后按向下箭头,便可达到函数体或过程内容. C,函数体内容的编制方法:先进行函数或过程声明,函数/过程命令+FORM 名+函数/过程名+(参数 1:类型; 参数 2: 类型; 注: ) 返回的参数值与定义的类型一致, form 名要与当前的 FORM 名一致, BEGIN……end 在之间编制实现功能.例:Procedure Tcbgl.sx1(component:string;form:string); D,函数或过程引用:函数或过程所在的 FORM 名+"."+函数或过程名+(参数 1 值,参数 2 值……),非参数定义的变量,要先赋值,再引用.例:cbgl.sx1(/doc/7c15899340.html,,'ZZCL MX'); E,对不同的数据或通过参数赋值,执行同样的程序语句,多次复用的要抽出来做成函数或过程,以实现代码优化与复用. F,跨月查询函数语句调用方法:当月表名不带月份时,调用fycx 函数,带月份时调用fycx1函数.具体方法:函数名(起始日期,截止日期,'表名',1); a:=''; a:=a+' select 字段 from '+zzbm[0]+' 条件'; for i:=1 to zzbm.Count-1 do begin a:=a+' union all select 字段 from '+zzbm[i]+' 条件'; end;. 二十七,公共属性部分: 序号1 2 3 4 属性名称Caption name visible enabled 属性说明设置窗口,控件等的显示内容. 窗口,控件的名称. 窗口,控件是否可视. 窗口,控件是否获得焦点.第 7 页共 22 页5 6 7 8 序号 1Taborder Align font readonly 事件名称 onshow控件获得焦点的顺序. 控件布局. 字体各项设置.一般设定宋体11 设置控件是否只读. 事件说明窗口显示时触发,在此事件中一般声明公共变量,函数过程等,格式设置,dbgrideh,combobox 等控件的数据来源实现,动态设置控件属性内容. 关闭窗口,释放内存.Form 名.Release 控件单击时触发.一般情况用在命令按钮中. 双击控件时触发.一般用在DEGRIDEH 控件中. 当控件内容改变时触发.一般用在COMBOBOX,RZEDIT 等此类控件. 当焦点离开控件时触发.一般用在非 DBGRIDEH 控件实现的数据录入,如统一领转录入. 通过键盘操作触发,一般用于回车键代替 TAB 键. 读取数据表中数据,有改变的记录,在更新记录之前触发的事件,一般用于记录更新信息及自动计算项目.一般用于 QY 控件. 更新完数据后触发,一般用于记录更新后信息.一般用于 QY 控件.二十八,常用事件列表:2 3 4 5 6 7 8onclose onclick ondbclick onchange onexit onkeypress Beforepost9afterpost二十九,虚拟表使用方法: 1,虚拟表命名方法:#+表名; 2,判断虚拟表是否存在,如果存在则删除: qy1.Close; qy1.SQL.Clear; qy1.SQL.Add('if object_id(''tempdb..#1'') is not null');qy1.SQL.Add('drop table #1'); qy1.execsql; 3,创建虚拟表方法: a.qy1.Close; qy1.SQL.Clear; qy1.SQL.Add('if object_id(''tempdb..#1'') is null'); qy1.SQL.Add('create table #1(字段名字段类型)'); qy1.execsql; b.qy2.Close; qy2.SQL.Clear; qy2.SQL.Add('select * into #1 from jcb'); qy2.execsql; 4,对虚拟表进行更新和追加时,要使用update 和insert 语句,不能使用edit 和append,避免出现忽略数据库名称的错误. 5,对虚拟表使用后要进行清除,避免再次调用时系统报错. 三十,调试程序:当程序出现错误不好查明原因,或运算结果不是想要的结果时,可以进入调试程序,跟踪运行阶段的各个状态,以便更好地分析错误的原因.第 8 页共 22 页1,单步执行:run-step over/f8,单步执行将把整个过程或函数当做一行,调试器每执行一行,当前执行点就自动移到下个要执行的行. 2,跟踪执行:run-Trace into,一次只执行一行,当执行到有过程或函数调用的行以后,当前执行点将进入过程或函数的内部. 3,跳过一段代码:RUN-Run To cursor,以非调试方式执行到光标所在的行,然后调试器接管对程序运行的控制,还可以再选择单步或跟踪执行. 4,返回到执行点:RUN-Show Execution Point,如果已执行完,调试器将重新打开此窗口. 5,暂停运行:Run-Program Pause:使程序运行暂时停止. 6,重新开始运行:Run-Program Reset,终止程序的运行并释放所有占用的内存和资源,并闭所有打开的文件,清除所有的变量设置,然后重新运行程序,但不删除先前设置的断点和观察窗口. 三十一,如果在表中设置字段的默认值,录入时经常出现"键列信息不足",所在在编制程序时,所有字符型字段取值=isnull(字段名,'').08.07.08 增控件的详细的详细使用方法第三部分控件的详细使用方法一,模块设置方法: 模块设置方法: 1,将单元文件拷到相应的工程文件夹下,打开工程文件后再打开单元文件. 2,点击Project->Addtoproject,选择相应的单元文件加入工程. 3,点击Project->options,进入工程属性设置界面,在 forms 界面可以选择主界面 main form;在 application 可以设置 exe 文件图标 icon. 4, 单元文件的声明: 在单元文件程序代码窗口中, implementation 和{$R *.dfm}两部分中间添加 uses 加 main form 的单元文件名,如果当前单元文件需要调用其他单元文件,或者其他单元文件的控件,虚拟表或者其他公共变量时,还需要在 uses 后添加其他单元文件名,例如: implementation uses ucbgl(main form,主要利用它的ADOConnection,各类函数,过程),usjcx(公共窗口),uyhdl (登录窗口,主要利用它保存的登录人相关信息); {$R *.dfm} 5,将单元文件中的数据连接控件query 的Connection 属性设置为工程main form 中的ADOConnection 控件名. 6,在总菜单中添加新增的按钮的 caption 属性,及onclick 事件程序,例如If Application.findcomponent('cgjhtb')=nil Then Application.CreateForm(T cgjhtb,cgjhtb); cgjhtb.show; 并记录下此按钮的名称(name). 7,在本单元用到系统自带函数或类时,在interface 下uses 中进行定义.例:inifiles 权限设置方法:控件:standardActionList1 二,权限设置方法:控件:standard--ActionList1 1,双击 main form 的 actionlist1,双击后点击 new action,添加新的 actions,命名为"q"+form 名. 定义 actions 的 caption 属性为新增按钮的 caption 属性,actions 的 onexecute 事件定义为按钮名称. 2,设置新添加按钮的 action 事件,选择对应的 actions("q"+FORM 名). 3,删除自动创建项,减少程序运行时占用内存,点击Project->Viewsource 打开工程文件将相应Application.CreateForm(Tform, form);语句删除,只保留主 FORM 与用户登录的创建语句. 4,菜单权限设置方法(以实时计划8.0 设置为例): A,执行实时计划8.0 中的权限管理菜单下的权限管理按钮,查看新添加的按钮的上级模块的模块数及命名,填写在上级模块对应的 2 文本框中,根据显示当模块总数,并在新增模块中对应的 2 个文本框中填写新增按钮的模块数(模块总数+1),及新增按钮的 caption 属性,点击确定.第 9 页共 22 页B,选择需添加权限的角色,在左边的系统资源中添加,更改选择角色的权限.如果还没有该角色,则首先在上,下角色框中分别输入上级角色,角色后点击添加按钮. 事务处理使用方法: 三,事务处理使用方法当更改性操作数据均要求使用事务处理,输入类,计算类均要求使用事物处理,可以重复计算且计算量大的,数据感知控件直接更新数据库数据的,为减少服务器负载,可以不用事务处理,示例如下: cbgl.ADOConnection1.BeginTrans;(把要执行的语句放入内存) TRY(开始试执行) 更新或计算语句/doc/7c15899340.html,mitTrans;(把已经更新的数据更新到数据库中,释放内存) 提示执行完毕,在运行过程中使用时不用提示. Except 如果执行不成功cbgl.ADOConnection1.RollbackTrans;(执行数据回滚,把已更新的恢复到未执行状态) 提示未能执行,计算类的关闭窗口,录入类的,清空已输入的内容. end; 控件使用规范,控件:ADOADOConnection1 四,ADOConnection 控件使用规范,控件:ADO--ADOConnection1 1,commandtimeout:连接自动跳出时间,设置为200; 2,connectionstring:设置数据库的连接属性; 3,loginprompt:是否输入用户名和密码; 4,ADOConnection 连接数据库设置方法(1)静态连接:点击 ADO,点击 ADOConnection,设置其属性 connectionstring 为数据库的连接属性.Loginprompt 设置为 FALSE,在运行程序时不提示数据库的密码录入界面.点击 ADOQUERY 设置 connection 属性为相应的ADOConnection 名. (2)ini 文件连接方法: ini:=Tinifile.Create(ExtractFilePath(Application.ExeName)+'cbgl.i ni');ADOConnection1.ConnectionString:='Provider=SQLOLEDB.1;pas sword='+pw+';Persist Security Info=False;User ID=SA;Initial Catalog='+ini.ReadString('SERVER','DATANAME','')+'; Data Source='+ini.ReadString('SERVER','servername',''); (3)注意事项:使用 INI 文件连接时,connectionstring 为空. 日期设置标准方法: 控件,控件:additional :additional-五,日期设置标准方法:使用 MaskEdit 控件,控件:additional-- MaskEdit1 1,设置MaskEdit 属性为!99/99/00;1;,并将 character for blanks 设置为'' 2,设置 MaskEdit 的 autoselect 属性为false 3,在form 的oncreate 或onshow 事件中增加DateSeparator:='.'; ShortDateFormat:='yy/mm/dd';实现日期格式为' . . '. 4,在控件 onchange 事件增加 IF MaskEdit1.SelStart=8 THEN selectNext(ActiveControl, True, True);第 10 页共 22 页使输入完毕自动移到下一焦点. 六,query 控件的使用方法,控件:ADO- ADOQuery1 控件的使用控件:ADO1,查询类数据: qy1.close; qy1.SQL.Clear; qy1.SQL.Add('sel ect……'); qy1.Open; 2,更改类数据: qy1.close; qy1.SQL.Clear; qy1.SQL.Add('update……/insert……'); qy1.execsql; 3,对数据进行更改的方法: a.qy1.edit ……qy1.post;b.SQL 语句'update 表名 set 字段='+''''+变量值(非字符型要转换成字符型)+''' ' C.注意引号的用法. 4,追加,插入数据的方法: a.qy1.append……qy1.post; b.SQl 语句'insert into 表名(字段名,……) values('+''''++''',……)' 5,SQL 语句中常量,变量调用标准: a.常量前后要添加两个半角单引号,即''常量'',例 select * from mlb where dw=''包装一车间'',特别注意字符用双引号; b.变量必须转换为字符型再引用,引用方法'+''''+变量+''', '+inttostr(变量)+', 例 select * from mlb where dw='+''''+dlid.dw+'''; 6,动态建立索引方法:SQL 语句'create index 表名 on 索引名 (索引字段)' 7,设置 QUERY 控件 commandTimeout 属性值为200,单位为秒,特殊情况可适当延长. 8, 设置query 的connection 属性为相应的 ADOconnection 控件名, 一般引用程序主窗口的 ADOconnection. 使用规范,控件:Ehlib七,Dbgrideh 使用规范,控件:Ehlib- DBGridEh1 1,Datasource 属性.选择数据来源,点击下拉框显示本单元或其他在本单元声明使用单元的datasource 控件. 2,AllowedOperations 属性:设置每条记录的属性,alopInsertEh 允许插入,alopUpdateEh 允许更新,alopDeleteEh 允许删除,alopAppendEh 允许追加. 3,Align 属性.设置Dbgrideh 显示方法.Alleft 为靠左显示;alright 为靠右显示;Altop 为靠上显示; albottom 为靠下显示;alclient 为充满窗口;alnone 为保持编译程序时位置. 4,colunms 属性.点击按钮显示列名列表.点击某行按 F11 显示此行属性.(1)fieldname.输入对应结果集字段. (2)title 属性的 caption 属性为列标题. (3)footers.点击按钮显示 foot 列表.点击某行按 F11 显示此行属性. A.fieldname.输入对应结果集字段B.Valuetype.选择对字段的操作.Fvtavg 求平均值;fvtsum 求和;fvtcount 计数;fvtfieldvalue 显示结果集最后一条记录值;fvtnone 无操作;fvtstatictext 为静态值;(4)Readonly 设置字段为只读. (5)width 为列宽度. (6)wordwrap 为是否自动折行. (7)visible 设置列是否可见.第 11 页共 22 页(8)displayformat:设置显示格式,例如日期型字段可设置为"yy.mm.dd",双精度型字段可以定义小数位数,3 位"0.000". 5, EditActions: 对整个DBGRIDEH 的属性设置, geaCutEh 允许剪切,geaCopyEh 允许复制,geaPasteEh 允许粘贴,geaDeleteEh 允许删除,geaSelectAllEh 允许全部选择. 6,options 的 dgmultiselect 属性设置多行选择. 7,optionseh 的 dghenterastab 设置响应回车键换列,会自动跳过只读列,到一列焦点. 8,footerrowcount 设置页脚行数. 9,sumlist 的active 属性设置页脚计算是否生效. 10,visible 设置控件是否可见. 11,Rowsizingallowed 属性设置是否自动折行. 12,popupmemu 选择弹出菜单. 13,Readonly 设置控件是否为只读. 14,Borderstyle 设置是否有网格线. 15,Drowmemotext 设置 textx 型和image 型字段是否显示原内容. 16,Font 属性设置显示字体. 17,Titlefont 设置标题字体. 18,Usemultitile 设置是否使用父子标题.具体设置方法: (1)将 Usemultitile 设置为 true; (2)将各列的标题 caption 属性设置为"父标题|子标题"的形式 19,enabled 设置焦点是否可控. 20,其他属性保持默认值. 21,建立页脚合计的方法: (1)设置Dbgrideh 的footercolor 为 clYellow; (2)设置 Dbgrideh 的 footerrowcount 为 1;(3)设置 Dbgrideh 的 sumlist-active 为 true; (4)双击 Dbgrideh,点击相应的字段属性中的footers 按钮,在弹出框中点击添加按钮,新增一个合计字段后,设置其属性 fieldname 为相应字段名,并选择 valuetype;(5)动态设置页脚合计方法: DBGridEh1.SumList.Active:=true; DBGridEh1.footerrowcount:=1;。

DELPHI下的WINSOCK编程

DELPHI下的WINSOCK编程

DELPHI下的Winsock编程--从TClientSocket控件出发{}unit Unit1;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,ComCtrls,StdCtrls,ScktComp;typeTForm1=class(TForm)ServerSocket1:TServerSocket;Memo1:TMemo;Button1:TButton;StatusBar1:TStatusBar;Memo2:TMemo;procedure ServerSocket1ClientConnect(Sender:TObject;Socket:TCustomWinSocket);procedure ServerSocket1ClientDisconnect(Sender:TObject;Socket:TCustomWinSocket);procedure ServerSocket1ClientRead(Sender:TObject;Socket:TCustomWinSocket);procedure Button1Click(Sender:TObject);private{Private declarations}public{Public declarations}end;varForm1:TForm1;implementation{$R*.dfm}procedure TForm1.ServerSocket1ClientConnect(Sender:TObject;Socket:TCustomWinSocket);beginStatusBar1.SimpleText:='connect';end;procedure TForm1.ServerSocket1ClientDisconnect(Sender:TObject;Socket:TCustomWinSocket);beginStatusBar1.SimpleText:='disconnect';end;procedure TForm1.ServerSocket1ClientRead(Sender:TObject;Socket:TCustomWinSocket);beginMemo1.Lines.Add(Socket.ReceiveText);end;procedure TForm1.Button1Click(Sender:TObject);beginif ServerSocket1.Active thenServerSocket1.Socket.Connections[0].SendText(Memo2.Text);end;end.然后编译程序。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用delphi7编写windows服务程序总结一、服务程序的创建delphi编写服务程序非常简单,点击菜单File->New->Other->New属性页->Service Application,系统自动会创建基本的代码。

这里需要说明的是,在“New属性页”中还有一个Service,这个Service和Service Application还是有区别的,应该说Service Application的范围大,它可以包含几个Service。

一个Service Application可以创建几个Service,service继承自TService,界面表现和TDataModel类似,做过数据库的朋友肯定都不陌生,区别是TDataModel是用来放数据库连接及操作组件的容器,而TService则是可以存放很多没有界面的组件,如indy的IDtcpclient等。

二、重要属性及事件说明属性:DisplayName 显示名称Name 名称,当你用命令提示符来启动、停止服务时,就需要用到Interactive 与界面交互的选项事件:OnCreate:类似于Tform的OnCreateOnDestroy:类似于Tform的OnDestroyOnExecute:非常重要,一般写成下面while not Terminated dobeginSleep(10);ServiceThread.ProcessRequests(False);end;OnPause:服务暂停OnShutdown:不太清楚OnStart:服务启动,重要OnStop:服务停止,重要三、服务的依赖关系因为我的服务是要连接数据库的,所以必须要等sql server的服务起来之后,我才能起来,这样才能连接数据库,因此这里面有个依赖关系的问题。

可以在属性Dependencies 中增加一项,选择MSSQLSERVER。

四、服务与界面的通讯服务也是可以创建form的,只是只是这个窗口,在服务启动时显示,服务停止后就关闭了。

而我想做一个就象sql server 2000的服务管理器哪样的界面,不论服务启动是否,都可以显示,而且也可以在界面上直接控制服务。

所以我就又建了一个应用,而这个应用和原来服务的通讯用自定义消息来传递。

比如,有人通过控制面板停止服务了,服务必须通知界面上的状态。

Delphi获取Windows系统服务的状态function ServiceGetStatus(sMachine, sService: string ): DWord;varschm, schs: SC_Handle;ss: TServiceStatus;dwStat : DWord;begindwStat := 0;schm := OpenSCManager(PChar(sMachine), Nil, SC_MANAGER_CONNECT);if (schm > 0) thenbeginschs := OpenService(schm, PChar(sService), SERVICE_QUERY_STA TUS);if(schs > 0) thenbeginif(QueryServiceStatus(schs, ss))then dwStat := ss.dwCurrentState;CloseServiceHandle(schs);end;CloseServiceHandle(schm);end;Result := dwStat;end;{判断某服务是否安装,未安装返回true,已安装返回false} function ServiceUninstalled(sMachine, sService : string ) : boolean; beginResult := 0 = ServiceGetStatus(sMachine, sService);end;{判断某服务是否启动,启动返回true,未启动返回false}function ServiceRunning(sMachine, sService : string ) : boolean;beginResult := SERVICE_RUNNING = ServiceGetStatus(sMachine, sService ); end;{判断某服务是否停止,停止返回true,未停止返回false}function ServiceStopped(sMachine, sService : string ) : boolean;beginResult := SERVICE_STOPPED = ServiceGetStatus(sMachine, sService );end;Delphi 如何停止、启动windows系统服务//下面是写了一个启动服务的函数StartService,用来启动服务。

function StartService(AServName: string): Boolean; //use WinSvcvarSCManager, hService: SC_HANDLE;lpServiceArgVectors: PChar;beginSCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);Result := SCManager <> 0;if Result thentryhService := OpenService(SCManager, PChar(AServName), SERVICE_ALL_ACCESS); Result := hService <> 0;if (hService = 0) and (GetLastError = ERROR_SERVICE_DOES_NOT_EXIST) then Exception.Create('The specified service does not exist');if hService <> 0 thentrylpServiceArgVectors := nil;Result := WinSvc.StartService(hService, 0, PChar(lpServiceArgVectors));if not Result and (GetLastError = ERROR_SERVICE_ALREADY_RUNNING) then Result := True;finallyCloseServiceHandle(hService);end;finallyCloseServiceHandle(SCManager);end;end;function StartService(AServName: string): Boolean; //use WinSvc<br/>var<br/>SCManager, hService: SC_HANDLE;<br/>lpServiceArgVectors: PChar;<br/>begin<br/>SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);<br/>Result := SCManager <> 0;<br/>if Result then<br/>try<br/>hService := OpenService(SCManager, PChar(AServName), SERVICE_ALL_ACCESS);<br/>Result := hService <> 0;<br/>if (hService = 0) and (GetLastError = ERROR_SERVICE_DOES_NOT_EXIST) then<br/>Exception.Create('The specified service does not exist');<br/>if hService <> 0 then<br/>try<br/>lpServiceArgVectors := nil;<br/>Result := WinSvc.StartService(hService, 0, PChar(lpServiceArgVectors));<br/>if not Result and (GetLastError = ERROR_SERVICE_ALREADY_RUNNING) then<br/>Result := True;<br/>finally<br/>CloseServiceHandle(hService);<br/>end;<br/>finally<br/>CloseServiceHa ndle(SCManager);<br/>end;<br/>end;<br/>下面是停止服务的代码StopServicefunction StopService(AServName: string): Boolean;varSCManager, hService: SC_HANDLE;SvcStatus: TServiceStatus;beginSCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);Result := SCManager <> 0;if Result thentryhService := OpenService(SCManager, PChar(AServName), SERVICE_ALL_ACCESS);Result := hService <> 0;if Result thentry //停止并卸载服务;Result := ControlService(hService, SERVICE_CONTROL_STOP, SvcStatus);//删除服务,这一句可以不要;// DeleteService(hService);finallyCloseServiceHandle(hService);end;finallyCloseServiceHandle(SCManager);end;end;使用delphi新建服务,停止系统服务2009-12-09 15:46本文主要讲解了如何使用delphi新建服务,停止系统服务,以及获取服务状态和新建系统服务器的方法,以下是关键代码:</B>unit Servicescontrol;interfaceuses Windows,Messages,SysUtils,Winsvc,Dialogs;function StartServices(Const SvrName:String):Boolean;function StopServices(Const SvrName:String):Boolean;function QueryServiceStatu(Const SvrName: String):String; function CreateServices(Const SvrName,FilePath:String):Boolean; function DeleteServices(Const SvrName: String):Boolean;implementation//开启服务function StartServices(Const SvrName: String): Boolean;vara,b:SC_HANDLE;c:PChar;beginResult:=False;a:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);if a <=0 then Exit;b:=OpenService(a,PChar(SvrName),SERVICE_ALL_ACCESS);if b <=0 then Exit;tryResult:=StartService(b,0,c);CloseServiceHandle(b);CloseServiceHandle(a);exceptCloseServiceHandle(b);CloseServiceHandle(a);Exit;end;end;//停止服务function StopServices(Const SvrName: String): Boolean;vara,b: SC_HANDLE;d: TServiceStatus;beginResult := False;a :=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);if a <=0 then Exit;b:=OpenService(a,PChar(SvrName),SERVICE_ALL_ACCESS);if b <=0 then Exit;tryResult:=ControlService(b,SERVICE_CONTROL_STOP,d);CloseServiceHandle(a);CloseServiceHandle(b);exceptCloseServiceHandle(a);CloseServiceHandle(b);Exit;end;end;//查询当前服务的状态function QueryServiceStatu(Const SvrName: String): String;a,b: SC_HANDLE;d: TServiceStatus;beginResult := '未安装';a := OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);if a <=0 then Exit;b := OpenService(a,PChar(SvrName),SERVICE_ALL_ACCESS);if b <= 0 then Exit;tryQueryServiceStatus(b,d);if d.dwCurrentState = SERVICE_RUNNING thenResult := '启动' //Runelse if d.dwCurrentState = SERVICE_RUNNING thenResult := 'Wait' //Runingelse if d.dwCurrentState = SERVICE_START_PENDING thenResult := 'Wait' //Pauseelse if d.dwCurrentState = SERVICE_STOP_PENDING thenResult := '停止' //Pauseelse if d.dwCurrentState = SERVICE_PAUSED thenResult := '暂停' //Pauseelse if d.dwCurrentState = SERVICE_STOPPED thenResult := '停止' //Stopelse if d.dwCurrentState = SERVICE_CONTINUE_PENDING thenResult := 'Wait' //Pauseelse if d.dwCurrentState = SERVICE_PAUSE_PENDING thenResult := 'Wait'; //PauseCloseServiceHandle(a);CloseServiceHandle(b);exceptCloseServiceHandle(a);CloseServiceHandle(b);Exit;end;end;{建立服务}function CreateServices(Const SvrName,FilePath: String): Boolean;vara,b:SC_HANDLE;beginResult:=False;if FilePath ='' then Exit;a := OpenSCManager(nil,nil,SC_MANAGER_CREATE_SERVICE);if a <= 0 then Exit;tryb := CreateService(a,PChar(SvrName),PChar(SvrName),SERVICE_ALL_ACCESS,SERVICE_INTERACTIVE_PROCESS or SERVICE_WIN32_OWN_PROCESS,SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,PChar(FilePath),nil,nil,nil,nil,nil);if b <= 0 then beginShowMessage( SysErrorMessage( GetlastError ));Exit;end;CloseServiceHandle(a);CloseServiceHandle(b);Result := True;exceptCloseServiceHandle(a);CloseServiceHandle(b);Exit;end;end;{卸载服务}function DeleteServices(Const SvrName: String): Boolean;vara,b:SC_HANDLE;beginResult:=False;a := OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);if a <= 0 then Exit;b :=OpenService(a,PChar(SvrName),STANDARD_RIGHTS_REQUIRED);if b <= 0 then Exit;tryResult := DeleteService(b);if not Result thenShowMessage(SysErrorMessage(GetlastError));CloseServiceHandle(b);CloseServiceHandle(a);exceptCloseServiceHandle(b);CloseServiceHandle(a);Exit;end;end;end.调用方法:{启动服务}StartServices(服务名);{停止服务}StopServices(服务名);{新建服务}CreateServices(服务名,exe文件路径);{删除服务}DeleteServices(服务名);{获取服务状态}string:=QueryServiceStatu(服务名);用Delphi创建windows服务程序2009-12-09 16:15Windows 2000/XP和2003等支持一种叫做"服务程序"的东西.程序作为服务启动有以下几个好处:(1)不用登陆进系统即可运行.(2)具有SYSTEM特权.所以你在进程管理器里面是无法结束它的.笔者在2003年为一公司开发机顶盒项目的时候,曾经写过课件上传和媒体服务,下面就介绍一下如何用Delphi7创建一个Service程序.运行Delphi7,选择菜单File-->New-->Other--->Service Application.将生成一个服务程序的框架.将工程保存为ServiceDemo.dpr和Unit_Main.pas,然后回到主框架.我们注意到,Service有几个属性.其中以下几个是我们比较常用的:(1)DisplayName:服务的显示名称(2)Name:服务名称.我们在这里将DisplayName的值改为"Delphi服务演示程序",Name改为"DelphiService".编译这个项目,将得到ServiceDemo.exe.这已经是一个服务程序了!进入CMD模式,切换致工程所在目录,运行命令"ServiceDemo.exe /install",将提示服务安装成功!然后"net start DelphiService"将启动这个服务.进入控制面版-->管理工具-->服务,将显示这个服务和当前状态.不过这个服务现在什么也干不了,因为我们还没有写代码:)先"net stop DelphiService"停止再"ServiceDemo.exe /uninstall"删除这个服务.回到Delphi7的IDE.我们的计划是为这个服务添加一个主窗口,运行后任务栏显示程序的图标,双击图标将显示主窗口,上面有一个按钮,点击该按钮将实现Ctrl+Alt+Del功能.实际上,服务程序莫认是工作于Winlogon桌面的,可以打开控制面板,查看我们刚才那个服务的属性-->登陆,其中"允许服务与桌面交互"是不打钩的.怎么办?呵呵,回到IDE,注意那个布尔属性:Interactive,当这个属性为True的时候,该服务程序就可以与桌面交互了.File-->New-->Form为服务添加窗口FrmMain,单元保存为Unit_FrmMain,并且把这个窗口设置为手工创建.完成后的代码如下:unit Unit_Main;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs, Unit_FrmMain; typeTDelphiService = class(TService)procedure ServiceContinue(Sender: TService; var Continued: Boolean);procedure ServiceExecute(Sender: TService);procedure ServicePause(Sender: TService; var Paused: Boolean);procedure ServiceShutdown(Sender: TService);procedure ServiceStart(Sender: TService; var Started: Boolean);procedure ServiceStop(Sender: TService; var Stopped: Boolean);private{ Private declarations }publicfunction GetServiceController: TServiceController; override;{ Public declarations }end;varDelphiService: TDelphiService;FrmMain: TFrmMain;implementation{$R *.DFM}procedure ServiceController(CtrlCode: DWord); stdcall;beginDelphiService.Controller(CtrlCode);end;function TDelphiService.GetServiceController: TServiceController; beginResult := ServiceController;end;procedure TDelphiService.ServiceContinue(Sender: TService;var Continued: Boolean);beginwhile not Terminated dobeginSleep(10);ServiceThread.ProcessRequests(False);end;end;procedure TDelphiService.ServiceExecute(Sender: TService); beginwhile not Terminated dobeginSleep(10);ServiceThread.ProcessRequests(False);end;end;procedure TDelphiService.ServicePause(Sender: TService;var Paused: Boolean);beginPaused := True;end;procedure TDelphiService.ServiceShutdown(Sender: TService); begingbCanClose := true;FrmMain.Free;Status := csStopped;ReportStatus();end;procedure TDelphiService.ServiceStart(Sender: TService;var Started: Boolean);beginStarted := True;Svcmgr.Application.CreateForm(TFrmMain, FrmMain); gbCanClose := False;FrmMain.Hide;end;procedure TDelphiService.ServiceStop(Sender: TService; var Stopped: Boolean);beginStopped := True;gbCanClose := True;FrmMain.Free;end;end.。

相关文档
最新文档