Delphi 不使用自带模板创建服务

[delphi] view plain copy

  1. <pre name="code" class="delphi">program Project1;
  2. uses
  3. Windows,
  4. WinSvc;
  5. const
  6. ServiceName: pchar = ‘SnowWings Service‘;
  7. DisplayName: pchar = ‘Skysword‘;
  8. Description: pchar = ‘雪羽服务器控制台‘;
  9. var
  10. Status:       TServiceStatus;
  11. StatusHandle: SERVICE_STATUS_HANDLE;
  12. ServiceTable: array [0 .. 1] of TServiceTableEntry;
  13. Stopped:      boolean;
  14. Paused:       boolean;
  15. { 我们自己要实现的功能代码写在这里 }
  16. procedure ServiceMain;
  17. begin
  18. repeat
  19. if not Paused then
  20. begin
  21. // Beep(1000, 1000);
  22. Sleep(1000);
  23. end;
  24. until Stopped;
  25. end;
  26. { 服务处理程序:一个服务处理程序内可以包含一个服务或多个服务的执行代码,但是它们都拥有固定的三个部分:服务main函数,服务ServiceMain函数和服务Control Handler函数。
  27. 服务配置程序:服务配置程序包括:服务的创建、服务的卸载、服务信息的查询、修改等; }
  28. procedure ServiceCtrlHandler(Control: dword); stdcall; // 服务控制函数
  29. begin
  30. case Control of
  31. SERVICE_CONTROL_STOP: // 停止服务
  32. begin
  33. Stopped               := True;
  34. Status.dwCurrentState := SERVICE_STOP_PENDING;
  35. SetServiceStatus(StatusHandle, Status);
  36. end;
  37. SERVICE_CONTROL_PAUSE: // 暂停服务
  38. begin
  39. Paused                := True;
  40. Status.dwCurrentState := SERVICE_PAUSED;
  41. SetServiceStatus(StatusHandle, Status);
  42. end;
  43. SERVICE_CONTROL_CONTINUE: // 继续服务
  44. begin
  45. Paused                := False;
  46. Status.dwCurrentState := SERVICE_RUNNING;
  47. SetServiceStatus(StatusHandle, Status);
  48. end;
  49. SERVICE_CONTROL_INTERROGATE:
  50. SetServiceStatus(StatusHandle, Status);
  51. SERVICE_CONTROL_SHUTDOWN:
  52. Stopped := True;
  53. end;
  54. end;
  55. procedure ServiceCtrlDispatcher(dwArgc: dword; var lpszArgv: pchar); stdcall;
  56. begin
  57. StatusHandle := RegisterServiceCtrlHandler(ServiceName, @ServiceCtrlHandler);
  58. if StatusHandle <> 0 then
  59. begin
  60. ZeroMemory(@Status, SizeOf(Status));
  61. Status.dwServiceType := SERVICE_WIN32_OWN_PROCESS or
  62. SERVICE_INTERACTIVE_PROCESS;
  63. Status.dwCurrentState     := SERVICE_START_PENDING;
  64. Status.dwControlsAccepted := SERVICE_ACCEPT_STOP or
  65. SERVICE_ACCEPT_PAUSE_CONTINUE;
  66. Status.dwWaitHint := 1000;
  67. SetServiceStatus(StatusHandle, Status);
  68. Stopped               := False;
  69. Paused                := False;
  70. Status.dwCurrentState := SERVICE_RUNNING;
  71. SetServiceStatus(StatusHandle, Status);
  72. ServiceMain; // 入口
  73. Status.dwCurrentState := SERVICE_STOPPED;
  74. SetServiceStatus(StatusHandle, Status);
  75. end;
  76. end;
  77. procedure UninstallService(ServiceName: pchar);
  78. var
  79. SCManager: SC_HANDLE;
  80. Service:   SC_HANDLE;
  81. begin
  82. SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  83. if SCManager = 0 then
  84. Exit;
  85. try
  86. Service := OpenService(SCManager, ServiceName, SERVICE_ALL_ACCESS);
  87. ControlService(Service, SERVICE_CONTROL_STOP, Status);
  88. DeleteService(Service);
  89. CloseServiceHandle(Service);
  90. finally
  91. CloseServiceHandle(SCManager);
  92. end;
  93. end;
  94. /// ////////////////
  95. { 添加一个服务的描述信息,你是否采用了更简洁的方法,这是一个例子 }
  96. function SetServiceDescription(SH: THandle; Desc: pchar): Bool;
  97. const
  98. SERVICE_CONFIG_DESCRIPTION: dword = 1;
  99. var
  100. OSVersionInfo:        TOSVersionInfo;
  101. ChangeServiceConfig2: function(hService: SC_HANDLE; dwInfoLevel: dword;
  102. lpInfo: Pointer):   Bool; StdCall;
  103. LH:                   THandle;
  104. begin
  105. Result                            := False;
  106. OSVersionInfo.dwOSVersionInfoSize := SizeOf(OSVersionInfo);
  107. GetVersionEx(OSVersionInfo);
  108. if (OSVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT) and // NT? 环境判断 ,可以去掉
  109. (OSVersionInfo.dwMajorVersion >= 5) then
  110. begin
  111. LH     := GetModuleHandle(advapi32);
  112. Result := LH <> 0;
  113. if not Result then
  114. Exit;
  115. ChangeServiceConfig2 := GetProcAddress(LH, ‘ChangeServiceConfig2A‘);
  116. Result               := @ChangeServiceConfig2 <> nil;
  117. if not Result then
  118. Exit;
  119. Result := ChangeServiceConfig2(SH, SERVICE_CONFIG_DESCRIPTION, @Desc);
  120. { if Result then
  121. FreeLibrary(LH); }
  122. end;
  123. end;
  124. procedure InstallService(ServiceName, DisplayName, Description: pchar;
  125. FileName: string);
  126. const
  127. SERVICE_CONFIG_DESCRIPTION: dword = 1;
  128. var
  129. SCManager: SC_HANDLE;
  130. Service:   SC_HANDLE;
  131. Args:      pchar;
  132. begin
  133. SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  134. if SCManager = 0 then
  135. Exit;
  136. try
  137. Service := CreateService(SCManager, ServiceName, DisplayName,
  138. SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS or
  139. SERVICE_INTERACTIVE_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_IGNORE,
  140. pchar(FileName), nil, nil, nil, nil, nil);
  141. try
  142. SetServiceDescription(Service, Description);
  143. except
  144. end;
  145. Args := nil;
  146. StartService(Service, 0, Args);
  147. CloseServiceHandle(Service);
  148. finally
  149. CloseServiceHandle(SCManager);
  150. end;
  151. end;
  152. begin
  153. if ParamStr(1) = ‘/u‘ then
  154. begin
  155. UninstallService(ServiceName);
  156. end
  157. else
  158. begin
  159. ServiceTable[0].lpServiceName := ServiceName;
  160. ServiceTable[0].lpServiceProc := @ServiceCtrlDispatcher;
  161. ServiceTable[1].lpServiceName := nil;
  162. ServiceTable[1].lpServiceProc := nil;
  163. StartServiceCtrlDispatcher(ServiceTable[0]);
  164. InstallService(ServiceName, DisplayName, Description,
  165. pchar(ParamStr(0)));
  166. end;
  167. end.</pre><br>
  168. <br>
  169. <pre></pre>
  170. <br>

http://blog.csdn.net/warrially/article/details/8258911

时间: 2024-10-19 18:16:25

Delphi 不使用自带模板创建服务的相关文章

用delphi创建服务程式

视窗系统 2000/XP和2003等支持一种叫做"服务程式"的东西.程式作为服务启动有以下几个好处: (1)不用登陆进系统即可运行. (2)具有SYSTEM特权.所以你在进程管理器里面是无法结束他的. 笔者在2003年为一公司研发机顶盒项目的时候,原来写过课件上传和媒体服务,下面就介绍一下怎么用Delphi7创建一个Service程式. 运行Delphi7,选择菜单File-->New-->Other--->Service Application.将生成一个服务程式的

Unity自带网络功能——创建服务,以及连接指定服务

游戏本身需要在网络上创建一个服务,然后其它游戏才能连接到这个服务,进而实现在同一游戏场景中一同玩耍的效果. 创建服务调用的方法是Network.InitializeServer( ): 连接指定服务调用的方法是Network.Connect( ): 本文说明了这两个方法在实例中的使用方式.

zabbix使用自己编写脚本模板和zabbix自带模板两种方法添加对指定进程和端口的监控

zabbix使用自己编写脚本模板和zabbix自带模板两种方法添加对指定进程和端口的监控 1.自带监控模板进行os的监控 进入/usr/local/zabbix/etc/zabbix_agentd.conf 配置文件修改 LogRemoteCommands=1     ###开启脚本功能 Server=192.168.5.129     ##修改zabbix指向的服务器: 重启zabbix_agentd.zabbix_server服务 在配置-->主机-->添加主机--> 配置主机信息主

Zabbix-3.0.3使用自带模板监控MySQL

导读 Zabbix是一款优秀的,开源的,企业级监控软件,可以通过二次开发来监控你想要监控的很多服务,本文介绍使用Zabbix自带的模板监控MySQL服务. 配置userparameter_mysql.conf #移动到zabbix解压缩路径 cd /usr/local/src/zabbix-3.0.3/conf/zabbix_agentd #拷贝文件到/opt/zabbix/etc/zabbix_agentd.conf.d/ #指定自己的zabbix安装目录 cp userparameter_m

【VMCloud云平台】SCSM(六)SCSM创建服务

完成了SCO准备与SCSM连接器,这一篇就开始配置SCSM服务(紫色为已完成施工,红色为施工中,蓝色为计划中) 登录到SCSM01中,打开SCSM控制台,点击连接器,并且选择上篇中创建的两个连接器点击立即同步: 接着我们点击库,就可以看到我们创建的Runbook了: 结合点击右侧创建RunBook自动活动模板,输入模板名称: 接着就会弹出模板菜单,我们先勾选左上角的可用于自动化,使其自动化属性激活: 接着点击Runbook的Tab,选择对应的创建VM流程,检测下参数是否自动映射: 在库的模板的地

03_Weblogic之配置简单域:启动和配置域,使用模板创建域,使用控制台

 1  域:概览 是Oracle Weblogic Server的基本管理单元 始终包含一个配置为管理服务器的Oracle WebLogic Server实例 域中可以包括一些称为受管服务器的Oracle Weblogic Server实例(可选) 还可以包含协同工作的服务器实例的集群. 2. 域图 3.配置域 一  安装后,配置将在其上开发和部署应用程序的域. 二  通过创建域,您可以定义资源集合,例如: -----受管服务器 -----集群 -----数据库连接 -----安全服务 --

自学angular系列-----创建服务

在angualr应用中,factory方法是用来注册服务的最常规方式,其实总结了一下,一共有5种方式来创建服务: 1.    factory() factory方法是创建和配置服务最快捷的方式:接受两个参数: name(字符串):需要注册的服务名: getFn(函数):这个函数会在angularJs创建服务实例时被调用. var formApp = angular.module("formApp",["ngRoute"]); formApp.factory(&quo

nodejs零基础详细教程2:模块化、fs文件操作模块、http创建服务模块

第二章  建议学习时间4小时  课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑.编写接口,最后完成一个完整的项目后台,预计共10天课程. 模块儿化  为什么需要模块儿化? 我们以前的常规js代码中,我们为了重用一些js代码,是将js方法封装起来,放到js文件中,然后在HTML页面中引入js,就可以在页面中使用这些方法了. 当这种直接引入和调用的方式存在一些不友好的地方,比如,

Docker中通过模板创建镜像,Docker容器、仓库及数据管理

1.通过模板创建镜像 (1)首先去下载一个模板 http://openvz.org/Download/templates/precreated //下载速度不快,阿铭下载了一个centos6的模板centos-6-x86-minimal.tar.gz (2)导入该镜像的命令为: cat centos-6-x86-minimal.tar.gz|docker import - centos6 (3)查看导入的镜像 docker images (4)导出镜像: 把现有镜像,导出为一个文件: docke