1. 用c#写windows服务 怎么写
1、在VS2010创建windows service工程,文件--新建--项目--windows服务,名称:TestWindowsService,设置server1的ServiceName属性为TestWindowsService 2、由于服务是要安装的,所以它运行的时候就需要一个安装类Installer将服务安装到计算机,新建一个后台服务安装类Install继承自Installer,安 装初始化的时候是以容器进行安装的,所以还要建立ServiceProcessInstaller和ServiceInstaller服务信息组件添加到 容器安装,在Install类增加如下代码: using System; using System.Collections.Generic; //using System.Linq; using System.Text; using System.Configuration.Install; using System.ComponentModel; namespace TestWindowsService { [RunInstaller(true)]//注意这里的属性Attribute设置 class Install : Installer { private System.ComponentModel.IContainer components = null; private System.ServiceProcess.ServiceProcessInstaller spInstaller; private System.ServiceProcess.ServiceInstaller sInstaller; private void InitializeComponent() { components = new System.ComponentModel.Container(); // 创建ServiceProcessInstaller对象和ServiceInstaller对象 this.spInstaller = new System.ServiceProcess.ServiceProcessInstaller(); this.sInstaller = new System.ServiceProcess.ServiceInstaller(); // 设定ServiceProcessInstaller对象的帐号、用户名和密码等信息 this.spInstaller.Account = System.ServiceProcess.ServiceAccount.LocalSystem; this.spInstaller.Username = null; this.spInstaller.Password = null; // 设定服务名称 this.sInstaller.ServiceName = "TestWindowsService"; sInstaller.DisplayName = "后台Windows服务"; sInstaller.Description = "一个后台Windows运行的服务"; // 设定服务的启动方式 this.sInstaller.StartType = System.ServiceProcess.ServiceStartMode.Automatic; this.Installers.AddRange(new System.Configuration.Install.Installer[] { this.spInstaller, this.sInstaller }); } } } 3、点击Service1.cs的视图设计器,在“单击此处切换到代码视图”上右键--添加安装程序,就出现了ProjectInstaller.cs。
点击ProjectInstaller.cs--选择serviceInstaller1--设置ServiceName为TestWindowsService,StartType为Automatic。选择serviceProcessInstaller1--设置account为LocalSystem 点击运行--出现:“无法从命令行或调试器启动服务” 4、一个空的服务基本上搞定了,只是业务没有,就看怎么在服务器上安装部署了.C#写的Windows后台服务不能直接安装,需要借助.NET Framework里面的InstallUtil.exe安装工具安装,我们可以做成一个执行CMD命令的文件BAT文件来安装启动它,命令如下: %windir%\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe �%\TestWindowsService.exe 安装完成以后,我们可以在我的电脑管理服务里面看到才安装上的后台服务. 5、卸载:找到开始--运行--regedit,找到目录下的TestWindowsService: 删除后重新启动就可以了。
6、C#获取服务程序路径string PathBase = System.AppDomain.CurrentDomain.BaseDirectory; //-------------------另一种安装部署时添加注册表信息实现开机自启动------------------------ 使用VS自带的打包模块可以很方便的对项目进行打包部署,同时我们也可以在安装部署时操作注册表实现开机启动软件。具体实现如下: 创建安装部署这部分就不用说了,添加安装部署项目后,鼠标右键安装项目->视图->注册表, 要使软件在开机就运行,可以在HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run中 添加键值保存软件目录。
在这里我们依次添加以上的项,然后在Run中添加键值,键名可以自己起,value要填软件的物理路径。物理路径是客户在部署确定 的,我们如何获取呢?这里我们可以使用[TARGETDIR]获取客户选择的路径,在加上软件的启动文件名称。
比如软件启动文件的名称是 Client.exe,那么Value的值就为:[TARGETDIR]Client.exe.生成安装项目。找到bin目录下的setup.exe文件 运行,安装结束后我们可以在注册表中找到相应的键值。
重启电脑系统就会自动运行我们设置的软件。
2. 如何编写windows服务程序
Windows提供了一套后台服务程序编程接口,用户在编写后台服务程序时需要遵循一定的编程框架,否则服务程序不能正常运行。
服务程序通常编写成控制台类型的应用程序,总的来说,一个遵守服务控制管理程序接口要求的程序 包含下面三个函数: 1)服务程序主函数(main):调用系统函数 StartServiceCtrlDispatcher 连接程序主线程到服务控制管理程序。 和其它进程一样,Main函数是服务进程的入口函数,服务控制管理器(SCM)在启动服务程序时,会从服务程序的main函数开始执行。
在进入点函数里面要完成ServiceMain的初始化,准确点说是初始化一个SERVICE_TABLE_ENTRY结构数组,这个结构记录了这个服务程序里面所包含的所有服务的名称和服务的进入点函数。然后再调用接口StartServiceCtrlDispatcher 。
Main函数的函数框架如下: int _tmain(int argc, _TCHAR* argv[]) { //服务入口点函数表 SERVICE_TABLE_ENTRY dispatchTable[]= { {TEXT(SZSERVICENAME),(LPSERVICE_MAIN_FUNCTION)Service_Main}, { NULL,NULL} }; if((argc>1)&&((*argv[1]=='-')||(argv[1]=="/"))) { /* 参数个数大于1是安装或者删除服务,该操作是由用户来执行的 当然也可以讲这一部分功能另写一个程序来实现 */ if(_stricmp("install",argv[1]+1)==0) { installService(); } else if(_stricmp("remove",argv[1]+1)==0) { removeService(); } else if(_stricmp("debug",argv[1]+1)==0) { bDebugServer=true; debugService(argc,argv); } } else { /* 如果未能和上面的如何参数匹配,则可能是服务控制管理程序来启动该程序。 立即调用StartServiceCtrlDispatcher 函数 */ g_logout.Logout("%s\n", "enter StartServiceCtrlDispatcher。
"); //通知服务管理器为每一个服务创建服务线程 if(!StartServiceCtrlDispatcher(dispatchTable)) g_logout.Logout("%s\n", "StartServiceCtrlDispatcher failed."); else g_logout.Logout("%s\n", "StartServiceCtrlDispatcher OK."); } return 0; } SCM启动一个服务程序之后,它会等待该程序的主线程去调StartServiceCtrlDispatcher。如果那个函数在两分钟内没有被调用,SCM将会认为这个服务有问题,并调用TerminateProcess去杀死这个进程。
这就要求你的主线程要尽可能快的调用StartServiceCtrlDispatcher。 2)服务入口点函数(ServiceMain):执行服务初始化任务,同时执行多个服务的服务进程有多个服务入口函数。
在服务入口函数里,必须立即注册服务控制回调函数。然后调用函数SetServiceStatus 通知SCM 服务现在的状态,否则SCM会认为服务启动失败。
ServiceMain函数框架如下: void WINAPI Service_Main(DWORD dwArgc, LPTSTR *lpszArgv) { //注册服务控制处理函数 sshStatusHandle=RegisterServiceCtrlHandler(TEXT(SZSERVICENAME),Service_Ctrl); //如果注册失败 if(!sshStatusHandle) { g_logout.Logout("%s\n", "RegisterServiceCtrlHandler failed。"); return; } //初始化 SERVICE_STATUS 结构中的成员 ssStatus.dwServiceType=SERVICE_WIN32_OWN_PROCESS; //可执行文件中只有一个单独的服务 ssStatus.dwServiceSpecificExitCode=0; ssStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP; //允许用SCP去停止该服务 //更新服务状态 if(ReportStatusToSCMgr(SERVICE_START_PENDING,//服务状态,服务仍在初始化 NO_ERROR, 3000)) //等待时间 SvcInit( dwArgc, lpszArgv ); //服务初始化函数 else g_logout.Logout("%s\n", "ReportStatusToSCMgr SERVICE_START_PENDING failed。
"); } 服务初始化函数SvcInit: 该函数的写法比较重要。在函数中创建一个等待事件,然后一直等待该事件。
该线程在服务接到请求之前一直处于挂起状态,直到接到服务停止消息。 VOID SvcInit( DWORD dwArgc, LPTSTR *lpszArgv) { /*创建事件*/ ghSvcStopEvent = CreateEvent( NULL, // default security attributes TRUE, // manual reset event FALSE, // not signaled NULL); // no name if ( ghSvcStopEvent == NULL) { ReportSvcStatus( SERVICE_STOPPED, NO_ERROR, 0 ); return; } // Report running status when initialization is complete. ReportSvcStatus( SERVICE_RUNNING, NO_ERROR, 0 ); // 在这里执行服务线程的创建。
while(1) { // 等待停止事件被触发 WaitForSingleObject(ghSvcStopEvent, INFINITE); ReportSvcStatus( SERVICE_STOPPED, NO_ERROR, 0 ); return; } } 3)控制服务处理程序函数(Handler):在服务程序收到控制请求时由控制分发线程引用。(此处是Service_Ctrl)。
void WINAPI Service_Ctrl(DWORD dwCtrlCode) { //处理控制请求码 switch(dwCtrlCode) { //先更新服务状态为 SERVICDE_STOP_PENDING,再停止服务。 case SERVICE_CONTROL_STOP: ReportStatusToSCMgr(SERVICE_STOP_PENDING,NO_ERROR,500); ServiceStop(); //由具体的服务程序实现 /*ssStatus.dwCurrentState=SERVICE_STOPPED;*/ //其它控制请求。
default: break; } } 3. 注意事项 1)安装服务可以另写一个程序。
3. 如何写一个windows 服务,用webservice调用
创建一个windows服务程序(新建项目->;左侧选windows->;右侧选windows服务),然后把生成的文件引入到windows服务的程序中
5、写调用事件(BeginImportUFData)
6、完成后编译生成一下,这时就会在此windows服务程序的bin文件夹下生成一个exe文件(如:MyNewService.exe
)
7、按以下方式安装
安装:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe 绝对路径\MyNewService.exe
卸载:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe -u 绝对路径\MyNewService.exe
例如:(用dos命令窗口执行)
安装:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe E:\chengxu\MyNewService\MyNewService\bin\Debug\MyNewService.exe
【然后显示:正在安装程序集,最后显示:“提交”阶段成功完成】
卸载:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe -u E:\chengxu\MyNewService\MyNewService\bin\Debug\MyNewService.exe
【最后提示:卸载完成】
启动、停止服务是window操作,找到管理-->;服务 操作
4. windows服务
1、Alerter Alerter(警示器)服务的进程名是Service.exe(即启动这个服务后在后台运行的进程名 称,可以通过任务管理器看到,下同)。
Alerter服务的功能是,WinXP将系统上发生的与 管理有关的事件以警示(Alert)信息传送至网络上指定的电脑或用户,例如当发生打印错 误或硬盘即将写满等事件,这类警示信息由WinXP的警示器服务(Alerter Service)收集 、送出。尽管Alerter依存的服务并没有Messenger(信使)服务,但Alerter服务必须依靠 后者才能送出信息,故在启动Alerter服务后还必须确定Messenger服务也在工作状态,而 接收的电脑也必须启动Messenger服务。
由于Alerter服务运行后,服务是用户可以发送“ 弹出(Pop-up)”信息给其他用户,这些信息有可能被攻击者用来实施攻击,如诱骗用户 修改口令等,从而造成安全隐患。同时该服务使得用户账号泄漏,也有可能被攻击者利用 来进行口令猜测攻击。
所以对于家庭单机用户,甚至对于绝大多数小型的局域网来说,这 个功能是完全可禁用的,不仅节省了系统资源和加快启动速度,也提高了机器的安全性。 2、Application Layer Gateway Service 简称“ALG”(应用层网关)的进程名是alg.exe,WinXP Home/Pro默认安装的启动类型为 手动。
ALG又被称为代理服务器(Proxy Server),是网络防火墙从功能层面上分类的一种 。当内部计算机与外部主机连接时,将由代理服务器担任内部计算机与外部主机的连接中 继者。
使用ALG的好处是隐藏内部主机的地址和防止外部不正常的连接,如果代理服务器上 未安装针对该应用程序设计的代理程序时,任何属于这个网络服务的封包将无法通过防火 墙。通俗点说,具体到ALG本身,它就是附带的Internet连接共享/防火墙的具体控管程序 ,如果你需要启动这二者,这个服务是必备的。
当然,只有一台计算机的上网家庭可以考 虑禁用这个服务,不过WinXP内置的防火墙效果还是不错的,如果不是坚持要用第三方的防 火墙,还是开着它吧。 3、Application Management AppMent(应用程序管理服务)的进程名是Svchost.exe,WinXP Home/Pro默认安装的启动 类型为手动,没有任何依存服务关系。
从Win2000开始,微软引入了一种基于MSI文件格式 (应用程序安装信息程序包文件)的全新、有效软件管理方案——即应用程序管理组件服 务(Application Management),它不仅管理软件的安装、删除,而且可使用此项服务修 改、修复现有应用程序,监视文件复原并通过复员排除基本故障等。通常这个服务我们保 持其默认状态较好。
可能许多朋友都有印象,当年ACDSee4.0刚发布时,由于安装制作上的考虑不周,并没有考 虑到那个时候大多数人的系统还并不支持MSI安装格式,结果只得又去下载安装一个名为W indows Installer的MSI辅助文件才解决问题。通常以MSI文件格式安装的软件十分好认, 比如说Office XP,当你安装后再次运行软件的安装程序时,它一般会有“重新安装”、“ 修复软件”、“卸载软件”多个选项,而不是以前安装程序那种就简单地卸载或覆盖安装 了事。
4、Automatic Updates Wuauserv(自动更新服务)的进程名是Svchost.exe,WinXP Home/Pro默认安装的启动类型 为自动,没有任何依存服务关系。这个是大家都非常熟悉的系统自动更新功能,就不多说 了。
用小猫上网而深受其苦的朋友记得在系统属性中关闭是不够的,还要将Automatic Up dates这个服务禁用才可以。以后需要更新,直接在IE中输入Windows Update网站地址htt p://v4.windowsupdate.microsoft.com/zhcn/default.asp手动更新即可。
5、Background Intelligent Transfer Service BITS(后台智能传输服务)的进程名是Svchost.exe,WinXP Home/Pro默认安装的启动类型 为手动,依赖于Remote Procedure Call、Workstation服务。微软宣称BITS能够利用剩余 的带宽传输文件,当网络切断或计算机重启时,后台智能传输服务会自动对文件传输加以 维护,当网络重新连接时,后台智能传输服务将从停止的地方继续开始传输文件。
其实这 个服务原是用来实现HTTP1.1服务器之间的信息传输,基本上它的应用也就是支持自动更新 时的断点续传。如果你禁用了Automatic Updates,留着它也没什么意义。
6、ClipBook ClipSrv(剪贴板查看器服务)的进程名是clipsrv.exe,WinXP Home/Pro默认安装的启动 类型为手动,依赖于Network DDE服务。ClipBook通过Network DDE和Network DDE DSDM提 供的网络动态数据交换服务,可查阅远程机器中的剪贴版,通俗地说ClipBook就是支持剪 贴版查看器(ClipBook Viewer)程序,该程序可允许剪贴页被远程计算机上的ClipBook浏 览。
例如有个较大的文档工程,由A、B、C共同开发。A负责Excel数据部分,B负责Visio制图部 分,而C负责将两部分文档整合。
C经常需要对A、B的数据进行拷贝,愚蠢的做法是C打开A 、B在网络邻居上共享的文档,然后将相关内容拷贝。而对Windows体系有一定了解的用户 应该听说过OLE这个东西,上面说的Excel数据和Visio制图都可以认为是独立的OLE对象, 如果A、B、C的3台机器上的ClipBook服务都为开启,就可。
5. 写的window 服务怎么启动
打开windows系统的系统服务,有以下几种方式:
1、右击我的电脑/计算机,点击管理,打开计算机管理。
依次选择服务和应用程序——服务。
2、使用快捷键和命令:
同时按下win+r键,在运行窗口中输入services.msc,即可打开服务。
用以上两种方法打开服务后,双击想要打开的的服务,选择启动。
以windows updata为例:
在服务状态选择“启动”,就可以打开服务,根据是否需要开机启动,启动类型可以选择自动或者手动,自动为开机自启。
6. windows服务
1、Alerter Alerter(警示器)服务的进程名是Service.exe(即启动这个服务后在后台运行的进程名 称,可以通过任务管理器看到,下同)。
Alerter服务的功能是,WinXP将系统上发生的与 管理有关的事件以警示(Alert)信息传送至网络上指定的电脑或用户,例如当发生打印错 误或硬盘即将写满等事件,这类警示信息由WinXP的警示器服务(Alerter Service)收集 、送出。尽管Alerter依存的服务并没有Messenger(信使)服务,但Alerter服务必须依靠 后者才能送出信息,故在启动Alerter服务后还必须确定Messenger服务也在工作状态,而 接收的电脑也必须启动Messenger服务。
由于Alerter服务运行后,服务是用户可以发送“ 弹出(Pop-up)”信息给其他用户,这些信息有可能被攻击者用来实施攻击,如诱骗用户 修改口令等,从而造成安全隐患。同时该服务使得用户账号泄漏,也有可能被攻击者利用 来进行口令猜测攻击。
所以对于家庭单机用户,甚至对于绝大多数小型的局域网来说,这 个功能是完全可禁用的,不仅节省了系统资源和加快启动速度,也提高了机器的安全性。 2、Application Layer Gateway Service 简称“ALG”(应用层网关)的进程名是alg.exe,WinXP Home/Pro默认安装的启动类型为 手动。
ALG又被称为代理服务器(Proxy Server),是网络防火墙从功能层面上分类的一种 。当内部计算机与外部主机连接时,将由代理服务器担任内部计算机与外部主机的连接中 继者。
使用ALG的好处是隐藏内部主机的地址和防止外部不正常的连接,如果代理服务器上 未安装针对该应用程序设计的代理程序时,任何属于这个网络服务的封包将无法通过防火 墙。通俗点说,具体到ALG本身,它就是附带的Internet连接共享/防火墙的具体控管程序 ,如果你需要启动这二者,这个服务是必备的。
当然,只有一台计算机的上网家庭可以考 虑禁用这个服务,不过WinXP内置的防火墙效果还是不错的,如果不是坚持要用第三方的防 火墙,还是开着它吧。 3、Application Management AppMent(应用程序管理服务)的进程名是Svchost.exe,WinXP Home/Pro默认安装的启动 类型为手动,没有任何依存服务关系。
从Win2000开始,微软引入了一种基于MSI文件格式 (应用程序安装信息程序包文件)的全新、有效软件管理方案——即应用程序管理组件服 务(Application Management),它不仅管理软件的安装、删除,而且可使用此项服务修 改、修复现有应用程序,监视文件复原并通过复员排除基本故障等。通常这个服务我们保 持其默认状态较好。
可能许多朋友都有印象,当年ACDSee4.0刚发布时,由于安装制作上的考虑不周,并没有考 虑到那个时候大多数人的系统还并不支持MSI安装格式,结果只得又去下载安装一个名为W indows Installer的MSI辅助文件才解决问题。通常以MSI文件格式安装的软件十分好认, 比如说Office XP,当你安装后再次运行软件的安装程序时,它一般会有“重新安装”、“ 修复软件”、“卸载软件”多个选项,而不是以前安装程序那种就简单地卸载或覆盖安装 了事。
4、Automatic Updates Wuauserv(自动更新服务)的进程名是Svchost.exe,WinXP Home/Pro默认安装的启动类型 为自动,没有任何依存服务关系。这个是大家都非常熟悉的系统自动更新功能,就不多说 了。
用小猫上网而深受其苦的朋友记得在系统属性中关闭是不够的,还要将Automatic Up dates这个服务禁用才可以。以后需要更新,直接在IE中输入Windows Update网站地址htt p://v4.windowsupdate.microsoft.com/zhcn/default.asp手动更新即可。
5、Background Intelligent Transfer Service BITS(后台智能传输服务)的进程名是Svchost.exe,WinXP Home/Pro默认安装的启动类型 为手动,依赖于Remote Procedure Call、Workstation服务。微软宣称BITS能够利用剩余 的带宽传输文件,当网络切断或计算机重启时,后台智能传输服务会自动对文件传输加以 维护,当网络重新连接时,后台智能传输服务将从停止的地方继续开始传输文件。
其实这 个服务原是用来实现HTTP1.1服务器之间的信息传输,基本上它的应用也就是支持自动更新 时的断点续传。如果你禁用了Automatic Updates,留着它也没什么意义。
6、ClipBook ClipSrv(剪贴板查看器服务)的进程名是clipsrv.exe,WinXP Home/Pro默认安装的启动 类型为手动,依赖于Network DDE服务。ClipBook通过Network DDE和Network DDE DSDM提 供的网络动态数据交换服务,可查阅远程机器中的剪贴版,通俗地说ClipBook就是支持剪 贴版查看器(ClipBook Viewer)程序,该程序可允许剪贴页被远程计算机上的ClipBook浏 览。
例如有个较大的文档工程,由A、B、C共同开发。A负责Excel数据部分,B负责Visio制图部 分,而C负责将两部分文档整合。
C经常需要对A、B的数据进行拷贝,愚蠢的做法是C打开A 、B在网络邻居上共享的文档,然后将相关内容拷贝。而对Windows体系有一定了解的用户 应该听说过OLE这个东西,上面说的Excel数据和Visio制图都可以认为是独立的OLE对象, 如果A、B、C的3台机器上的ClipBook服务都为开。
7. 怎样写脚本把windows服务改为手动
编写一个批处理文件,按照下列命令实例进行操作:
net start "服务名" (开启服务)
net stop "服务名" (关闭服务)
如果启动的服务名是词组时,服务名称两边要加双引号。
sc config 服务名 start= demand //手动
sc condig 服务名 start= auto //自动
sc config 服务名 start= disabled //禁用
sc start 服务名
sc stop 服务名
参考:
8. 如何编写windows服务程序
如何编写windows服务程序 By:张鹏/Hikvision 这两天想学习关于如何编写windows服务程序的知识,就上网查了些资料。
看了一篇文章《用C 语言编写Windows 服务程序的五个步骤》。但可能由于译者的疏忽,忘记了将关键代码放入该文档,导致初学者可能会看不懂。
所以又查阅了相关资料。自己完成了《用C 语言编写Windows 服务程序的五个步骤》中的样例程序。
在本文中我希望能给初学者一些帮助,大致讲一下编写windows服务程序需要的知识。 首先Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序。
这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。这使服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用。
还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务。 服务是有状态的,当我们使用windows自带的服务管理程序sc.exe查看服务状态时可以显示服务的当前状态,这个状态是由我们在程序代码中进行控制的。
你最好在服务初始化的时候将服务设置为SERVICE_START_PENDING,当初始化完毕时设为SERVICE_RUNNING,这些状态是系统自定义的状态,可通过msdn查看其他状态。这个状态信息你会在sc.exe中看到。
在编写windows服务程序过程中你需要关注的函数有: 1.首先是main函数,由于windows服务不需要界面,所以大部分程序为win32控制台应用程序,所以程序主函数为main 而不是WinMain()。在主函数要做的主要工作就是初始化一个SERVICE_TABLE_ENTRY 分派表结构体,然后调用StartServiceCtrlDispatcher();这将把调用进程的主线程转换为控制分派器。
该分派器启动一个新线程,该线程运行分派表中对应于你的服务的ServiceMain()函数。ServiceMain()函数将在下面提到。
此过程示例代码如下: SERVICE_TABLE_ENTRY entrytable[2]; entrytable[0].lpServiceName="testservice"; entrytable[0].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain; entrytable[1].lpServiceName=NULL; entrytable[1].lpServiceProc=NULL; StartServiceCtrlDispatcher(entrytable); 在这之后系统将自动创建一个线程去执行ServiceMain函数的内容,你应该将你要执行的任务在ServiceMain中循环,这样服务就开始运行了。 2.ServiceMain函数为void WINAPI ServiceMain(int argc, char** argv)格式的函数,函数名字可以任意定义。
它的作用就是:将你需要执行的任务放到该函数中循环执行即可。这就是服务程序的工作函数。
在ServiceMain执行你的任务前,需要给SERVICE_TABLE_ENTRY 分派表结构体进行赋值,注意由于此时服务还没有开始执行你的任务所以我们将服务的状态设置为SERVICE_START_PENDING,即正在初始化。我们进行如下赋值: servicestatus.dwServiceType = SERVICE_WIN32; servicestatus.dwCurrentState = SERVICE_START_PENDING; servicestatus.dwControlsAccepted=SERVICE_ACCEPT_SHUTDOWN|SERVICE_ACCEPT_STOP; //在本例中只接受系统关机和停止服务两种控制命令 servicestatus.dwWin32ExitCode = 0; servicestatus.dwServiceSpecificExitCode = 0; servicestatus.dwCheckPoint = 0; 2014下半年教师资格证统考大备战 中学教师资格考试 小学教师资格考试 幼儿教师资格考试 教师资格证面试 servicestatus.dwWaitHint = 0; hstatus = ::RegisterServiceCtrlHandler("testservice", CtrlHandler); CtrlHandler为void WINAPI CtrlHandler(DWORD request)型的函数,函数名字可以任意设定。
将在下一点讲到。 Hstatus为SERVICE_STATUS_HANDLE类型的全局变量。
当需要改变服务状态时SetServiceStatus()函数需要它做为参数来标识一个服务。 3. void WINAPI CtrlHandler(DWORD request),函数的主要功能是,接收系统传递的控制命令,比如当你通过sc.exe关闭服务时,该函数会收到SERVICE_CONTROL_STOP消息,你就可以对服务进行必要的管理。
在本例子程序中就只接收SERVICE_ACCEPT_SHUTDOWN和SERVICE_ACCEPT_STOP消息,这是通过前面给servicestatus赋值设定的。 这样一个基本的服务程序就完成了。
下面贴出我的示例代码仅供参考。该代码在vs2008中调试通过。
本文结束的时候会附上如何安装服务。 #include
转载请注明出处育才学习网 » windows服务怎么写