windows相对路径怎么写

vsc相对路径怎么写(visualstudio中怎么存相对路径)

1.visual studio中怎么存相对路径

这篇文章主要写给那些以前没有用过VS的新手,同时也是自己学习经验的积累,高手就不用看了以免浪费您宝贵的时间。

在VS的工程中常常要设置头文件的包含路径,当然你可以使用绝对路径,但是如果你这样设置了你只能在你自己的机器上运行该工程;如果其他人拷贝你的工程到其他机器上就可能无法运行,这个是因为你在建工程时可能把工程放在了E:盘,但是其他人可能会把工程放在其他根目录下,这样会导致找不到头文件问题。

对于新手,在设置绝对路径时往往会犯浑,他们不清楚这里的“相当”究竟是以什么位置为起点。其实这里的相对路径就是相当于工程文件(XXXX.vcproj)为起点零计算出的能找到包含所需头文件(也就是找包含所需头文件的include目录)的路径。

例如你的工程文件(AmarylloLib.vcproj)所在目录路径为:

F:\game\Test\TraxAmaryllo\lib\wince5_vs2005_arm_d

该工程中包含的源文件要包含一个头文件,该头文件所在路径如下:

F:\game\Test\TraxAmaryllo\include

则我们可以从工程文件AmarylloLib.vcproj所在目录为起点向上回退到包含你所需要头文件的include文件夹所在的目录目录,你回退了几次就需要几个".."符号。

这里的相对路径设置如下:

..\..\include

我们来回退一下:

在AmarylloLib.vcproj当前目录下,回退一次到了包含wince5_vs2005_arm_d的文件夹lib下,再回退一次就到达了包含lib文件夹的TraxAmaryllo目录下,而在该目录下就包含我们需要包含的头文件所在的目录include目录。所有要在工程文件当前目录下要向上回退两次才能看到include目录

2.C# 相对路径

你可以这么干,如果你的文件夹叫程序文件夹叫Debug,

那么用下面的方法:

int i = Application.StartupPath.IndexOf("Debug");

string url = Application.StartupPath.Substring(0,i)+a.jpg;

这里面url就是路径了,又或者用下面的方法。

string[] dd = Application.StartupPath.Split('\\');

string url = "";

for (int i = 0; i < dd.Length-1; i++)

{

url += dd[i] + "\\";

}

url += a.jpg;

url一样是上层路径里的图片。

同理,上几层你都能弄到了

vsc相对路径怎么写

windows服务怎么写

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 #include #define SLEEP_TIME 5000 //间隔时间 #define FILE_PATH "C:\\log.txt" //信息输出文件 bool brun=false; SERVICE_STATUS servicestatus; SERVICE_STATUS_HANDLE hstatus; int WriteToLog(char* str); void WINAPI ServiceMain(int argc, char** argv); void WINAPI CtrlHandler(DWORD request); int InitService(); int WriteToLog(char* str) { FILE* pfile; fopen_s(&pfile,FILE_PATH,"a+"); if (pfile==NULL) { return -1; } fprintf_s(pfile,"%s\n",str); fclose(pfile); return 0; } void WINAPI ServiceMain。

windows服务怎么写

转载请注明出处育才学习网 » windows相对路径怎么写

知识

罗梅芬用日文怎么写(罗钰潇日语怎么写)

阅读(21428)

本文主要为您介绍罗梅芬用日文怎么写,内容包括伊蕾娜日语怎么写,王雪菲用日文怎么说,张佳怡在日语中怎么写啊怎么读啊。罗 ら ラ ra钰 ぎょく ギョク gyoku潇 しょう シヨウ shou第一列:日语汉字,写法同汉字,都要用繁体,这三个都挺难写的,看

知识

邓先生的英文怎么写(1~40的英文怎么说)

阅读(10445)

本文主要为您介绍邓先生的英文怎么写,内容包括“邓先生”用英语怎么写,1~40的英文怎么说,漂亮英文beautiful缩写怎么写。1 one 2 two 3 three 4 four 5 five 6 six 7 seven 8 eight 8 nine 10 te

知识

一个人布满皱纹怎么写(描写人物皱纹的句子)

阅读(9521)

本文主要为您介绍一个人布满皱纹怎么写,内容包括描写人物皱纹的句子,描写人物皱纹的句子,皱纹怎么描写。、老人脸上布满了皱纹,那一条条曲折不均的像是墙上斑驳的印迹,爬满了面容,留下了岁月的痕迹。2、外祖父是一位年过六旬的白发老人。在他

知识

登录接口怎么写(php登录的接口怎么写)

阅读(7765)

本文主要为您介绍登录接口怎么写,内容包括php登录的接口怎么写,网页登陆接口怎么做,网站登录接口程序怎么做。PHP 接口 接口 使用接口(interface),你可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。我们可以通过int

知识

档案奖惩情况怎么写(奖惩情况怎么写)

阅读(9605)

本文主要为您介绍档案奖惩情况怎么写,内容包括奖惩情况怎么写,个人简历及奖惩情况怎么填写,个人简历里面奖惩情况怎么写。在简历里的“奖励”部分,列出与你所获得的并与你的求职目标相关的荣誉、奖励和奖金。你既可以按时间顺序排列,也可以按

知识

头孢克肟拼音怎么写(头孢克肟的肟念什么)

阅读(8005)

本文主要为您介绍头孢克肟拼音怎么写,内容包括头孢克肟片全名拼音,头孢克肟片全名拼音,头孢克肟的肟念什么。肟[wò] :是含有羰基的醛、酮类化合物与羟胺作用而生成的有机化合物,可以参与许多有机化学反应,例如经典的Beckmann重排就是肟为底

知识

一库搜用日语怎么写(日语一库是什么意思)

阅读(7994)

本文主要为您介绍一库搜用日语怎么写,内容包括日语大神来,看动漫里的主人公说一句:恰,一库搜这是什么意思,一库一库;一搜库这两个日语是什么意思怎么写,看片都有“一库”(日语)是什么意。一库的意思就是“出发,出去”的意思。日语「行く」的音译

知识

外租无人机广告怎么写(植保无人机广告语)

阅读(7003)

本文主要为您介绍外租无人机广告怎么写,内容包括求一个无人机创意广告词谢谢巨友们了,求一关于无人机的广告标语,求一关于无人机的广告标语我们公司是做无人机的,新成立的公司,求。DJI大疆创新研发的的MG-1农业植保机专为农村作业环境设计,

知识

河南话que怎么写(河南话的nenna怎么写)

阅读(6537)

本文主要为您介绍河南话que怎么写,内容包括que怎么写,河南话的nenna怎么写,que怎么写。尿一壶(niào yī hú)关系密切,观点一致。例:“他俩今天尿一壶啦。”●尿(niào)⑴、从尿道排泄的液体。⑵、排泄小便。⑶、不放

知识

国学经文的论文怎么写(国学征文该怎么写)

阅读(7120)

本文主要为您介绍国学经文的论文怎么写,内容包括国学征文该怎么写,弟子规的400论文,关于国学经典的征文怎么写。“子曰:“温故而知新,可以为师”……小时,总是觉得国学就是没用的,古人写的话,我们还需要背,每次老师教给我们时,我总是会让思想开一

知识

化学实验总结怎么写(化学实验报告小结怎么写)

阅读(5399)

本文主要为您介绍化学实验总结怎么写,内容包括化学实验总结怎么写,化学实验报告小结怎么写,化学实验小结怎么写。化学实验报告的书写: 一般情况下化学实验报告是根据实验步骤和顺序从七方面展开来写的: 1.实验目的:即本次实验所要达到的目标或

知识

蝴蝶豌豆拼音怎么写(豌豆的拼音是什么)

阅读(5833)

本文主要为您介绍蝴蝶豌豆拼音怎么写,内容包括蝴蝶怎么拼音的,豌豆的拼音是什么,蝴蝶的拼音是什么。豌豆的拼音是[wān dòu]。豌豆是豆科一年生攀援草本,高0.5-2米。全株绿色,光滑无毛,被粉霜。叶具小叶4-6片,托叶心形,下缘具

知识

海绵宝宝用英文怎么说(海绵宝宝用英文怎么说)

阅读(6514)

本文主要为您介绍海绵宝宝用英文怎么说,内容包括海绵宝宝用英语怎么说,海绵宝宝用英文怎么说,海绵宝宝英文名是什么。1. SPONGEBOB SQUAREPANTS 近期很夯的一步卡通影片《海绵宝宝》(SpongeBob SquarePants)是一系

知识

茶盏怎么用(茶盏在茶道中干嘛用)

阅读(5425)

本文主要为您介绍茶盏怎么用,内容包括茶盏怎么用我要写一篇200字左右的茶盏的使用说明,求指教,茶盏在茶道中干嘛用,问一下斗笠盏如何使用现在是不是很少有人使用它,它的意义。苏东坡的名句"从来佳茗似佳人",典型地代表了唐宋及以后的文人墨客,

知识

thinkpad小红点怎么用(怎么学习使用thinkpad小红点)

阅读(7589)

本文主要为您介绍thinkpad小红点怎么用,内容包括怎么学习使用thinkpad小红点,thinkpad小红点怎么用,求教:THINKPAD的小红点使用方法。Thinkpad 小红点最高效的使用方法为:左手拇指按左键,无操作时在左键待命2、右手拇指按右键,同时兼按空格键及