用控制面板的工具栏启动和终止这个服务 dwcurrentstate:指定服务的当前状态因为服务的初始化在这里没有完成,所以这里的状态为 service_start_pending; 为了测试 memorystatus 服务在出错情况下的行为,可以将 memstatus.txt 文件设置成只读这样一来,服务应该无法启动 // 启动服务的控制分派机线程 monitoring started. int writetolog(char* str) #include 第五步:测试服务 return 0; 去掉只读属性,启动服务,在将文件设成只读服务将停止执行,因为此时日志文件写入失败如果你更新服务控制面板的内容,会发现服务状态是已plc的编程语言经停止 servicetable[1].lpservicename = null; 接着,启动工作循环每五秒钟查询一个可用物理内存并将结果写入日志文件 // 退出 servicemain 本文将首先解释如何创建一个定期查询可用物理内存并将结果写入某个文本文件的服务然后指导你完成生成,安装和实现服务的整个过程 int result; #define sleep_time 5000 dwcontrolsaccepted:这个域通知 scm 服务接受哪个域本文例子是允许 stop 和 shutdown 请求处理控制请求将在第三步讨论; if (log == null) } lpserviceproc: 指向服务主函数的指针(服务入口点);编程入门教程 服务控制管理器(scm:services control manager)是一个管理系统所有服务的进程当 scm 启动某个服务时,它等待某个进程的主线程来调用 startservicectrldispatcher 函数将分派表传递给 startservicectrldispatcher这将把调用进程的主线程转换为控制分派器该分派器启动一个新线程,该线程运行分派表中每个服务的 servicemain 函数(本文例子中只有一个服务)分派器还监视程序中所有服务的执行情况然后分派器将控制请求从 scm 传给服务 dwservicetype:指示服务类型,创建 win32 服务赋值 service_win32; 由于 se支撑软件rvicestatus 结构对于整个程序而言为全局量,servicestatus 中的工作循环在当前状态改变或服务终止后停止其它的控制请求如:pause 和 continue 在本文的例子没有处理 控制处理器函数必须报告服务状态,即便 scm 每次发送控制请求的时候状态保持相同因此,不管响应什么请求,都要调用 setservicestatus return(result); setservicestatus(hstatus, &servicestatus); fclose(log); result = writetolog("monitoring started."); } #include 在 servicemain 中,检查五笔字打字练习软件 initservice 函数的返回值如果初始化有错(因为有可能写日志文件失败),则将服务状态置为终止并退出 servicemain: void servicemain(int argc, char** argv); { 第一步:主函数和全局定义 fprintf(log, "%s\n", str); 第二步:servicemain 函数 { 现在,准备工作已经就绪,你可以开始编码了服务程序控制台程序的一个子集因此,开始你可以定义一个 main 函数,它是程序的入口点对于服务程序来说,main 的代码令人惊讶地简短,因为它只创建分派表并启动控制分派机 图一 显示 memorystatus 服务的服务控制面板 { 如 listing 反比例函数实际问题1 所示,循环一直到服务的状态为 service_running 或日志文件写入出错为止状态可能在 controlhandler 函数响应 scm 控制请求时修改 log = fopen(logfile, "a+"); servicetable[1].lpserviceproc = null; 发出此创建命令指定服务名和二进制文件的路径(注意 binpath= 和路径之间的那个空格)安装成功后,便可以用服务控制面板来控制这个服务(参见图一) 调用 setservicestatus 函数向 scm 报告服务的状态时要提供 hstatus 句柄和 servicestatus 结构注意 servicestatus 一个全局qq名片刷赞软件2015变量,所以你可以跨多个函数使用它servicemain 函数中,你给结构的几个域赋值,它们在服务运行的整个过程中都保持不变,比如:dwservicetype } 当初我写第一个nt 服务时,我到 msdn 上找例子在那里我找到了一篇 nigel thompson 写的文章:“creating a simple win32 service in c++”,这篇文章附带一个 c++ 例子虽然这篇文章很好地解释了服务的开发过程,但是,我仍然感觉缺少我需要的重要信息我想理解通过什么框架,调用什么函数,以及何时调用,但 c++ 在这方面没有让我轻松多少面向对象的方法固然方便,但由于用类对底层 win32 函数调用进win8激活软件行了封装,它不利于学习服务程序的基本知识这就是为什么我觉得 c 更加适合于编写初级服务程序或者实现简单后台任务的服务在你对服务程序有了充分透彻的理解之后,用 c++ 编写才能游刃有余当我离开原来的工作岗位,不得不向另一个人转移我的知识的时候,利用我用 c 所写的例子就非常容易解释 nt 服务之所以然 startservicectrldispatcher(servicetable); error = initservice(); listing 1 展示了 servicemain 的代码该函数是服务的入口点它运行在一个单独的线程当中,这个线程是由控制分派器创建的servicemain 应该尽可能早早为服务注册控日语入门学习教程制处理器这要通过调用 registerservicectrlhadler 函数来实现你要将两个参数传递给此函数:服务名和指向 controlhandlerfunction 的指针 // 服务初始化 sleep_time 指定两次连续查询可用内存之间的毫秒间隔在第二步中编写服务工作循环的时候要使用该常量 servicetable[0].lpservicename = "memorystatus"; 声明几个全局变量,以便在程序的多个函数之间共享它们值此外,做一个函数的前向定义: 第三步:处理控制请求 每次你调用 setservicestatus 函数的时候,必须指定服务接收 stop 和 shutdown 请物联网的核心技术求listing 2 示范了如何在 controlhandler 函数中处理它们 服务是一个运行在后台并实现勿需用户交互的任务的控制台程序windows nt/2000/xp 操作系统提供为服务程序提供专门的支持人们可以用服务控制面板来配置安装好的服务程序,也就是 windows 2000/xp 控制面板|管理工具中的“服务”(或在“开始”|“运行”对话框中输入 services.msc /s——译者注)可以将服务配置成操作系统启动时自动启动,这样你就不必每次再重启系统后还要手动启动服务 int initservice() 第四步:安装和配置服务 void main() 首先,包含所需的头文件例子要调用 win32 函数(windows.易语言简单编程教程h)和磁盘文件写入(stdio.h): int initservice(); logfile 定义日志文件的路径,你将会用 writetolog 函数将内存查询的结果输出到该文件,writetolog 函数定义如下: memorystatus 的启动类型是手动,也就是说根据需要来启动这个服务右键单击该服务,然后选择上下文菜单中的“属性”菜单项,此时显示该服务的属性窗口在这里可以修改启动类型以及其它设置你还可以从“常规”标签中启动/停止服务以下是从系统中移除服务的方法: 开发更大更好的服务程序 注意:如果 startservicectrldispatcher 函数30秒没有被调用,便会报错,为了避免这种情况,我们必须在网络编程 servicemain 函数中(参见本文例子)或在非主函数的单独线程中初始化服务分派表本文所描述的服务不需要防范这样的情况 sc delete memorystatus 指定 “delete” 选项和服务名此服务将被标记为删除,下次西通重启后,该服务将被完全移除 service_table_entry servicetable[2]; service_status servicestatus; servicestatus.dwwin32exitcode = -1; stop 请求是 scm 终止服务的时候发送的例如,如果用户在“服务”控制面板中手动终止服务shutdown 请求是关闭机器时,由 scm 发送给所有运反比例函数应用ppt行中服务的请求两种情况的处理方式相同: dwwin32exitcode 和 dwservicespecificexitcode:这两个域在你终止服务并报告退出细节时很有用初始化服务时并不退出,因此,它们的值为 0; servicetable[0].lpserviceproc = (lpservice_main_function)servicemain; 图二 memorystatus 服务的属性窗口 在报告了服务状态之后,你可以调用 initservice 函数来完成初始化这个函数只是添加一个说明性字符串到日志文件如下面代码所示: if (error) 从服务控制面板启动 memorystatus 服务如果初始化不出错,日语入门学习资料表示启动成功过一会儿将服务停止检查一下 c:\myservices 文件夹中 memstatus.txt 文件的服务输出在我的机器上输出是这样的: 向 scm 报告 service_stopped 状态; return -1; file* log; lpservicename: 指向表示服务名称字符串的指针;当定义了多个服务时,那么这个域必须指定; // 初始化失败,终止服务 程序编好了,将之编译成 exe 文件本文例子创建的文件叫 memorystatus.exe,将它拷贝到 c:\myservices 文件夹为了在机器上安装这个服务,需要用 sc.exe 可执行文件,它是 win32 platform sdkc语言考试题及答案 中附带的一个工具(译者注:visaul studio .net 2003 ide 环境中也有这个工具,具体存放位置在:c:\program files\microsoft visual studio .net 2003\common7\tools\bin\winnt)使用这个实用工具可以安装和移除服务其它控制操作将通过服务控制面板来完成以下是用命令行安装 memorystatus 服务的方法: 如果初始化成功,则向 scm 报告状态: service_status_handle hstatus; windows 服务被设计用于需要在后台运行的应用程序以及实现没有用户交互的任务为了学习这种控制台应用程序的基础知识,c(不是布林带上轨道线c++)是最佳选择本文将建立并实现一个简单的服务程序,其功能是查询系统中可用物理内存数量,然后将结果写入一个文本文件最后,你可以用所学知识编写自己的 windows 服务 理解 win32 服务的基本概念,使你能更好地用 c++ 来设计包装类包装类隐藏了对底层 win32 函数的调用并提供了一种舒适的通用接口修改 memorystatus 程序代码,创建满足自己需要的服务!为了实现比本文例子所示范的更复杂的任务,你可以创建多线程的服务,将作业划分成几个工作者线程并从 servicemain 函数中监视它们的执行 #define logfile "c:\\myservices\\memstatus.txt" 分派表电工技术应用实例中所有的服务执行完之后(例如,用户通过“服务”控制面板程序停止它们),或者发生错误时startservicectrldispatcher 调用返回然后主进程终止 { sc create memorystatus binpath= c:\myservices\memorystatus.exe 写日志文件,监视停止; // 向 scm 报告运行状态 void controlhandler(dword request); servicestatus.dwcurrentstate = service_running; 分派表的最后一项必须是服务名和服务主函数域的 null 指针,文本例子程序中只宿主一个服务,所以服务名的定布林轨道参数义是可选的 return; listing 1 展示了如何指定服务特征和其当前状态来初始化 servicestatus 结构,servicestatus 结构的每个域都有其用途: monitoring stopped. 接着,定义两个常量: dwcheckpoint 和 dwwaithint:这两个域表示初始化某个服务进程时要30秒以上本文例子服务的初始化过程很短,所以这两个域的值都为 0 它指示控制分派器调用 controlhandler 函数处理 scm 控制请求注册完控制处理器之后,获得状态句柄(hstatus)通过调用 setservicestatus 函数,用 hstatus 向 scm 报告服务的状态 } 一易语言应用源码个程序可能包含若干个服务每一个服务都必须列于专门的分派表中(为此该程序定义了一个 servicetable 结构数组)这个表中的每一项都要在 service_table_entry 结构之中它有两个域: setservicestatus (hstatus, &servicestatus); 在第二步中,你用 servicemain 函数注册了控制处理器函数控制处理器与处理各种 windows 消息的窗口回调函数非常类似它检查 scm 发送了什么请求并采取相应行动 servicestatus.dwcurrentstate = service_stopped; 沈阳最好白癜风医院咨询江西白癜风专科医院地址转载请注明原文网址:http://www.gzdatangtv.com/jsyy/518.html |