program Project1;

uses
Windows,
WinSvc; const
ServiceName: pchar = 'SnowWings Service';
DisplayName: pchar = 'Skysword';
Description: pchar = '服务器控制台'; var
Status: TServiceStatus;
StatusHandle: SERVICE_STATUS_HANDLE;
ServiceTable: array [ .. ] of TServiceTableEntry;
Stopped: boolean;
Paused: boolean; { 我们自己要实现的功能代码写在这里 }
procedure ServiceMain;
begin
repeat
if not Paused then
begin
// Beep(1000, 1000);
Sleep();
end;
until Stopped;
end;
{ 服务处理程序:一个服务处理程序内可以包含一个服务或多个服务的执行代码,但是它们都拥有固定的三个部分:服务main函数,服务ServiceMain函数和服务Control Handler函数。
服务配置程序:服务配置程序包括:服务的创建、服务的卸载、服务信息的查询、修改等; } procedure ServiceCtrlHandler(Control: dword); stdcall; // 服务控制函数
begin
case Control of
SERVICE_CONTROL_STOP: // 停止服务
begin
Stopped := True;
Status.dwCurrentState := SERVICE_STOP_PENDING;
SetServiceStatus(StatusHandle, Status);
end;
SERVICE_CONTROL_PAUSE: // 暂停服务
begin
Paused := True;
Status.dwCurrentState := SERVICE_PAUSED;
SetServiceStatus(StatusHandle, Status);
end;
SERVICE_CONTROL_CONTINUE: // 继续服务
begin
Paused := False;
Status.dwCurrentState := SERVICE_RUNNING;
SetServiceStatus(StatusHandle, Status);
end;
SERVICE_CONTROL_INTERROGATE:
SetServiceStatus(StatusHandle, Status);
SERVICE_CONTROL_SHUTDOWN:
Stopped := True;
end;
end; procedure ServiceCtrlDispatcher(dwArgc: dword; var lpszArgv: pchar); stdcall;
begin
StatusHandle := RegisterServiceCtrlHandler(ServiceName, @ServiceCtrlHandler);
if StatusHandle <> then
begin
ZeroMemory(@Status, SizeOf(Status));
Status.dwServiceType := SERVICE_WIN32_OWN_PROCESS or
SERVICE_INTERACTIVE_PROCESS;
Status.dwCurrentState := SERVICE_START_PENDING;
Status.dwControlsAccepted := SERVICE_ACCEPT_STOP or
SERVICE_ACCEPT_PAUSE_CONTINUE;
Status.dwWaitHint := ;
SetServiceStatus(StatusHandle, Status);
Stopped := False;
Paused := False;
Status.dwCurrentState := SERVICE_RUNNING;
SetServiceStatus(StatusHandle, Status);
ServiceMain; // 入口
Status.dwCurrentState := SERVICE_STOPPED;
SetServiceStatus(StatusHandle, Status);
end;
end; procedure UninstallService(ServiceName: pchar);
var
SCManager: SC_HANDLE;
Service: SC_HANDLE;
begin
SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if SCManager = then
Exit;
try
Service := OpenService(SCManager, ServiceName, SERVICE_ALL_ACCESS);
ControlService(Service, SERVICE_CONTROL_STOP, Status);
DeleteService(Service);
CloseServiceHandle(Service);
finally
CloseServiceHandle(SCManager);
end;
end; /// ////////////////
{ 添加一个服务的描述信息,你是否采用了更简洁的方法,这是一个例子 }
function SetServiceDescription(SH: THandle; Desc: pchar): Bool;
const
SERVICE_CONFIG_DESCRIPTION: dword = ;
var
OSVersionInfo: TOSVersionInfo;
ChangeServiceConfig2: function(hService: SC_HANDLE; dwInfoLevel: dword;
lpInfo: Pointer): Bool; StdCall;
LH: THandle;
begin
Result := False;
OSVersionInfo.dwOSVersionInfoSize := SizeOf(OSVersionInfo);
GetVersionEx(OSVersionInfo);
if (OSVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT) and // NT? 环境判断 ,可以去掉
(OSVersionInfo.dwMajorVersion >= ) then
begin
LH := GetModuleHandle(advapi32);
Result := LH <> ;
if not Result then
Exit;
ChangeServiceConfig2 := GetProcAddress(LH, 'ChangeServiceConfig2A');
Result := @ChangeServiceConfig2 <> nil;
if not Result then
Exit;
Result := ChangeServiceConfig2(SH, SERVICE_CONFIG_DESCRIPTION, @Desc);
{ if Result then
FreeLibrary(LH); }
end;
end; procedure InstallService(ServiceName, DisplayName, Description: pchar;
FileName: string);
const
SERVICE_CONFIG_DESCRIPTION: dword = ;
var
SCManager: SC_HANDLE;
Service: SC_HANDLE;
Args: pchar;
begin
SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if SCManager = then
Exit;
try
Service := CreateService(SCManager, ServiceName, DisplayName,
SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS or
SERVICE_INTERACTIVE_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_IGNORE,
pchar(FileName), nil, nil, nil, nil, nil);
try
SetServiceDescription(Service, Description);
except
end;
Args := nil;
StartService(Service, , Args);
CloseServiceHandle(Service);
finally
CloseServiceHandle(SCManager);
end;
end; begin
if ParamStr() = '/u' then
begin
UninstallService(ServiceName);
end
else
begin
ServiceTable[].lpServiceName := ServiceName;
ServiceTable[].lpServiceProc := @ServiceCtrlDispatcher;
ServiceTable[].lpServiceName := nil;
ServiceTable[].lpServiceProc := nil;
StartServiceCtrlDispatcher(ServiceTable[]);
InstallService(ServiceName, DisplayName, Description,
pchar(ParamStr()));
end; end.

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

  1. 通过zabbix自带模板监控windowsPC机器

       通过zabbix自带模板监控windowsPC机器   作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.       欢迎加入:高级运维工程师之路 598432640 相信有很多 ...

  2. Zabbix Server 自带模板监控有密码MySQL数据库

    Zabbix Server 自带模板监控有密码MySQL数据库 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.  一.Zabbix-agent端的配置 1>.为数据库设置密码 ...

  3. 007-Zabbix Server 自带模板监控MySQL数据库

    监控数据库分为三种: 1.Zabbix Server 自带模板监控无密码MySQL数据库 2.Zabbix Server 自带模板监控有密码MySQL数据库 3.Zabbix Server 自带模板监 ...

  4. Zabbix4.0.1使用自带模板监控Linux主机 CPU、内存、硬盘、网卡

    环境: 前提已经安装好zabbix服务端.zabbix客户端, zabbix_server端ip和主机名信息:    ip:192.168.1.204 hostname:  www.test.com ...

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

    第二章  建议学习时间4小时  课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑 ...

  6. (原创)带模板的OLE输出EXCEL

    其实带模板的OLE输出EXCEL就是将要输出的EXCEL中一些拥有固定值(如标题,表头行等)的单元格先填充好数据和设置好格式后作为模板上传到SAP 中.这样后续在输出EXCEL时只需从SAP中将模板下 ...

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

     1 域:概览 是Oracle Weblogic Server的基本管理单元 始终包含一个配置为管理服务器的Oracle WebLogic Server实例 域中可以包括一些称为受管服务器的Ora ...

  8. Zabbix Server 自带模板监控更加灵活MySQL数据库

    Zabbix Server 自带模板监控更加灵活MySQL数据库 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.  一.zabbix-agent端配置 1>.修改zabbix的 ...

  9. Zabbix Server 自带模板监控无密码MySQL数据库

    Zabbix Server 自带模板监控无密码MySQL数据库 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.  一.安装MariaDB 1>.安装MariaDB  [root ...

随机推荐

  1. 非mapreduce生成Hfile,然后导入hbase当中

    转自:http://blog.csdn.net/stark_summer/article/details/44174381 未实验 最近一个群友的boss让研究hbase,让hbase的入库速度达到5 ...

  2. PHP微信公众号开发之自动回复

    先把源码类发出来 <?php /** 自己封装 微信 开发api */ header('Content-type: text/html; charset=utf-8');#设置头信息 class ...

  3. c语言数据类型(一)

    (强数据类型) 1.常量 常量是程序中不可变的量 10为常量 两种常量 #define 定义宏常量 const #对于#define 类型的常量,c语言的习惯是常量名称大写, 对于普通const常量以 ...

  4. word_宏示例

    参考:https://jingyan.baidu.com/article/870c6fc3326588b03fe4beeb.html 内容自适应 Application.Browser.Target ...

  5. hadoop分布式集群的搭建

    电脑如果是8G内存或者以下建议搭建3节点集群,如果是搭建5节点集群就要增加内存条了.当然实际开发中不会用虚拟机做,一些小公司刚刚起步的时候会采用云服务,因为开始数据量不大. 但随着数据量的增大才会考虑 ...

  6. 更换Git的地址;

    Git地址变了,Android Studio更新和提交代码都用不了了:需要把新的Git地址更换一下: 1.打开git项目的文件夹,进入git操作框: 2. git remote -v 查看现有地址: ...

  7. Hdu 4622 Reincarnation(后缀自动机)

    /* 字符串长度较小, 可以离线或者直接与处理所有区间的答案 动态加入点的时候, 因为对于其他点的parent构造要么没有影响, 要么就是在两个节点之间塞入一个点, 对于minmax的贡献没有改变 所 ...

  8. CF 966E May Holidays

    /* 考虑对于询问分块, 每根号n个询问做一次 考虑一次询问, 我们建立出虚树来每条链上的更改一定是一样的, 然后会有根号条链 对于每条链上的点按照w基数排序并且合并相同, 然后每次更改 就是一个指针 ...

  9. RocketMQ源码分析:(一)安装与案例演示

    环境: Windows 暂时理解的功能图,不定时改动: 1. 克隆rocketmq代码 git clone git@github.com:apache/rocketmq.git 2. 进入rocket ...

  10. python-单元测试unittest

    目录: 1.unittest.TestCase中常用的断言方法 1.1 subTest子测试 1.2 套件测试 1.3 批量测试单个用例 2. 加载器 2.1加载器协议 2.2.执行器 TestRun ...