windows 服务程序和桌面程序集成(六)集成安装、启动、卸载功能

27 篇文章 6 订阅
23 篇文章 0 订阅

 

系列文章目录链接:

  1. windows 服务程序和桌面程序集成(一)概念介绍
  2. windows 服务程序和桌面程序集成(二)服务程序
  3. windows 服务程序和桌面程序集成(三)UDP监控工具
  4. windows 服务程序和桌面程序集成(四)桌面程序
  5. windows 服务程序和桌面程序集成(五)集成为一个EXE
  6. windows 服务程序和桌面程序集成(六)集成安装、启动、卸载功能
  7. windows 服务程序和桌面程序集成(七)效果演示及源程序下载
     

把windows服务程序的安装、启动等功能集成到自身的桌面程序上,需要引入单元uszhnServiceUtils.pas。

 该单元包括如下函数:

unit uszhnServiceUtils;

interface

uses
  WinApi.Windows, WinApi.Messages, System.SysUtils, WinApi.Winsvc, VCL.Dialogs,
  vcl.ExtCtrls,
  system.Classes,

  System.Win.Registry;

type
  TServiceState = (ssUnKnow, ssTimeOut, ssRuning{运行中},
  	ssWait{等待},
    ssStop{停止},
    ssUnInstall{未安装},
    ssPause{暂停});


//启动服务
function StartServices(const SvrName: string): Boolean;

function Always_StartServices(const SvrName: string; var ErrorMsg: String): Boolean;
//SvrName服务名;下同

//停止服务
function StopServices(const SvrName: string): Boolean;
///<summary>一直停,直到服务停下为止<sammary>
function Always_StopServices(const SvrName: string; var ErrorMsg: String): Boolean;

//查询服务状态;返回状态类型
function QueryServiceState(const SvrName: string): TServiceState;
///<summary>持续询问<sammary>
function Always_QueryServiceState(const SvrName: string; const tgtState: TServiceState;  TimeOut: Integer = 5*60*1000): TServiceState;



//注册服务
///<summary>建立一个服务</summary>
function CreateServices(const SvrName, FilePath: string): Boolean;
///<summary>建立一个服务;并且有服务描述</summary>
function CreateServiceWithDesc(const SvrName, FilePath, SrvDesc: string): Boolean;


function AddServiceDesc(const SvrName, SrvDesc: String): Boolean;
//服务名,FilePath: 服务路径

//卸载服务
function DeleteServices(const SvrName: string): Boolean;
//服务名


procedure GetServiceNames(Names: TStrings; DisplayNames: TStrings = nil;
  const Service_Type: integer = $30; const Computer: PChar = nil);

我们在桌面程序界面上增加如下按键:安装服务、启动服务、停止服务、卸载服务。

 uMainForm_Application.pas单元代码如下:

unit uMainForm_Application;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  system.DateUtils,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;

type
  TForm_Application = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Panel1: TPanel;
    Label1: TLabel;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form_Application: TForm_Application;

implementation

uses
  uWorkerThread, uszhnServiceUtils;

{$R *.dfm}

procedure TForm_Application.Button1Click(Sender: TObject);
begin
   //创建工作线程
  if WorkThread = nil then
     WorkThread := TWorkThread.Create;
  WorkThread.FreeOnTerminate := True;    //完成后直接释放
end;

procedure TForm_Application.Button2Click(Sender: TObject);
begin
  WorkThread.Pause;
end;

procedure TForm_Application.Button3Click(Sender: TObject);
begin
  WorkThread.Continue;
end;

procedure TForm_Application.Button4Click(Sender: TObject);
begin
  WorkThread.Terminate;
  while not WorkThread.Finished do
    begin
      Sleep(200);
    end;
  WorkThread := nil;
end;

procedure TForm_Application.Button5Click(Sender: TObject);
begin
  if CreateServices('Service1', ParamStr(0)) then
    begin
      Memo1.Lines.Add('服务安装成功: Service1');
    end
  else
    begin
       Memo1.Lines.Add('服务安装失败: Service1   xxxxx');
    end;
end;

procedure TForm_Application.Button6Click(Sender: TObject);
var
  T : TDateTime;
  FServiceState : TServiceState;
begin
  if StartServices('Service1') then
    begin
      FServiceState := QueryServiceState('Service1');
      T := IncSecond(Now,10);
      while FServiceState <> ssRuning do
        begin
          if Now > T then
            begin
              Memo1.Lines.Add('服务: Service1 启动失败!(Service), 超时未启动(10秒)');
              Exit;
            end;
          Application.ProcessMessages;
          Sleep(200);
          FServiceState := QueryServiceState('Service1');
        end;

      Memo1.Lines.Add('   ----------------------------------------------');
      Memo1.Lines.Add('   |  启动服务成功: Service1' );
      Memo1.Lines.Add('   ----------------------------------------------');
    end
  else
    begin
       Memo1.Lines.Add('*********************************************************');
       Memo1.Lines.Add('*                  Service  服务启动失败                *');
       Memo1.Lines.Add('* ServiceName: Service1 (服务启动后名称)');
       Memo1.Lines.Add('*********************************************************');
    end;
end;


procedure TForm_Application.Button7Click(Sender: TObject);
var
  FServiceState : TServiceState;
begin
  if StopServices('Service1') then
    begin
      FServiceState := QueryServiceState('Service1');
      while FServiceState <> ssStop do
       begin
         Application.ProcessMessages;
         Sleep(100);
         FServiceState := QueryServiceState('Service1');
       end;
      Memo1.Lines.Add('   ----------------------------------------------');
      Memo1.Lines.Add('   |  停止服务成功: Service1' );
      Memo1.Lines.Add('   ----------------------------------------------');
    end
  else
    begin
       Memo1.Lines.Add('*********************************************************');
       Memo1.Lines.Add('*                  Service  服务停止失败                *');
       Memo1.Lines.Add('* ServiceName: Service1 (服务启动后名称)');
       Memo1.Lines.Add('*********************************************************');
    end;
end;

procedure TForm_Application.Button8Click(Sender: TObject);
var
  FServiceState : TServiceState;
begin
  if DeleteServices('Service1') then
    begin
      FServiceState := QueryServiceState('Service1');
      while FServiceState <> ssUnInstall do
        begin
           FServiceState := QueryServiceState('Service1');
           Application.ProcessMessages;
        end;

      Memo1.Lines.Add('服务卸载成功: Service1');
    end
  else
    begin
       Memo1.Lines.Add('服务卸载失败: Service1');
    end;

end;

end.

经过以上步骤,就彻底实现了双模程序,及实现了windows服务程序的完美调试,也实现了在程序自身完成服务的安装、启动、停止、卸载等功能。

本系列文章完整程序目录:

下一篇:windows 服务程序和桌面程序集成(七)效果演示及源程序下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
采用多功能集成环境在windows服务器上搭建PHP网站案例 服务器版本:Windows Server 2008 R2 Enterprise 平时搭建PHP网站,可以在linux服务器上搭建,也可以在windows服务器上搭建,主要看你个人需求了,今天我们演示的是用PHPWAMP绿色集成环境在windows服务器上搭建php网站。 这款PHPWAMP绿色集成环境也属于WAMP套件,大家知道什么是WAMP吧? Windows下的Apache+Mysql+PHP,称为WAMP。 WAMP套件其实有很多,就比如wampserver、apmserv、xampp等等,这些WAMP环境各有特点。 本文演示的是纯绿色的PHP集成环境PHPWAMP, 所采用的版本号是2016年的8.1.8.8版本,2017年的8.8.8.8版本估计也差不多要出来了。 为什么要使用PHPWAMP集成环境,而不是其他集成环境呢? 1、因为PHPWAMP解压即可使用,你甚至不需要安装VC运行库也可直接运行,而其他的集成环境都需要你额外去安装vc运行库,下载费时间,安装也费时间。 2、PHPWAMP默认集成的各个组件都是最新版本的,而且是完整版,所以更加适合在服务器上运行(其他集成环境通常用来测试的,集成的组件阉割过,体积小很多)当然PHPWAMP也很适合在本地测试,如果包括32位和64位、线程安全与非线程安全的PHP版本,共计700多个PHP版本随便你切换。 3、PHPWAMP可以同时运行各个不同版本的PHP网站,十分适合对比测试。多版本同时运行也适合在服务器上运行那些对php版本要求比较严格的PHP程序,可在服务器上同时运行不同php版本的网站程序。 4、关键这货还能一键去除域名后面的端口号,实现与Apache、Nginx、IIS等WEB服务器共存时,去掉域名后面的端口号。 5、兼容性很强,兼容XP系统、windows7、windows8、windows10也能完美兼容,在各windows服务器上兼容能力也很强。 6、phpwamp集成环境还能与其他任意环境共存,互不影响,端口号可视化修改,强制解除端口占用等。 7、拥有强制干掉一切环境阻碍,一键强制卸载任意php环境,瞬间轰掉阻碍(不会影响系统),简单粗暴,让你节省时间立刻完成网站配置。 8、切换PHP版本方便,还能自定义PHP版本,提供700个PHP版本随便你换,及时满足各种程序对不同版本的需求。 9、在phpMyAdmin官方网站,你可以看到phpMyAdmin的各个版本下载中都提示了不同版本所能兼容的PHP版本与数据库版本,而PHPWAMP自带的数据库管理工具phpMyAdmin经过特殊修改,能完美兼容任何PHP版本,无论你切换任意PHP版本,都能正常使用,不会像一些PHP环境那样,升级或者换个版本,phpMyAdmin就会出现问题。 10、PHPWAMP拥有自动定期重启动服务器,自动定期重启动apache、mysql等服务的功能。 下面演示在服务器上搭建php网站的过程,服务器版本如下图显示Windows Server 2008 R2 Enterprise 采用多功能集成环境在windows服务器上搭建PHP网站案例 在任意IDC服务商购买服务器后,在本地电脑点这里打开远程桌面连接,来连接远程服务器 采用多功能集成环境在windows服务器上搭建PHP网站案例 然后在出来的界面输入你所购买服务器的相关信息,如下图 采用多功能集成环境在windows服务器上搭建PHP网站案例 下图就是登陆后的样子,现在我们可以操作这台服务器了。 采用多功能集成环境在windows服务器上搭建PHP网站案例 然后用服务器自带的浏览器下载PHPWAMP集成环境,可以在百度搜“PHPWAMP”,找到官网下载。 采用多功能集成环境在windows服务器上搭建PHP网站案例 解压后打开软件 采用多功能集成环境在windows服务器上搭建PHP网站案例 把主界面的端口改成80 采用多功能集成环境在windows服务器上搭建PHP网站案例 切换任意php版本,然后打开Apache2.4站点管理 采用多功能集成环境在windows服务器上搭建PHP网站案例 添加站点后,我们开始一键生成对应hosts 采用多功能集成环境在windows服务器上搭建PHP网站案例 点击这个按钮启动网站采用多功能集成环境在windows服务器上搭建PHP网站案例 完美启动,网站程序自己配置即可,这点不会的话,可以百度PHPWAMP使用教程 采用多功能集成环境在windows服务器上搭建PHP网站案例 到了这一步,网站只能在服务器上查看,别人通过互联网是访问不了的,因为还有一个重要的步骤要做,那就是域名解析,把域名解析到这个服务器上,全
Inno 集成版 Inno All-in-One Setup 是由国内 KngStr 发布到 GitHub 开源社区中基于 Inno Setup 的增强版本。对于经常使用 Inno Setup 的同学们来说增强版的功能可以让您在对 Inno Setup 脚本方面得到更多的扩展。 Inno 集成版 Inno All-in-One Setup 中文版Inno 集成版 Inno All-in-One Setup 中文版 主要特点: 自 2006 年以来支持每个 Windows 版本,包括:Windows 10,ARM 上的 Windows 10,Windows Server 2019,Windows Server 2016,Windows 8.1,Windows 8,Windows Server 2012,Windows 7,Windows Server 2008 R2,Windows Server 2008 和 Windows Vista。(不需要 Service Pack。) 广泛支持在 Windows 64 位版本上安装 64 位应用程序。都支持 x64,ARM64 和I tanium 体系结构。 对管理和非管理安装的广泛支持。 支持创建单个 EXE 来安装程序,以便于在线分发。还支持磁盘跨接。 标准 Windows 向导界面。 可自定义的设置类型,例如完整,最小,自定义。 完整的卸载功能安装文件: 包括对“ deflate”,bzip2和7-Zip LZMA / LZMA2文件压缩的集成支持。安装程序可以比较文件版本信息,替换使用中的文件,使用共享文件计数,注册DLL / OCX和类型库以及安装字体。 在任何地方都可以创建快捷方式,包括在“开始”菜单和桌面上。 创建注册表和.INI条目。 在安装之前,之中或之后运行其他程序。 支持多语言安装,包括从右到左语言支持。 支持密码和加密安装。 支持数字签名的安装卸载,包括双重签名(SHA1和SHA256)。 静默安装卸载。 Unicode 安装集成的预处理程序选项可进行高级编译时自定义。 集成的 Pascal 脚本引擎选项,用于高级运行时安装卸载自定义。 完整的源代码可从 GitHub 获得。 微小的占用空间:包括所有功能在内,仅开销约为 1.5 mB。 所有功能均已完整记录。 由 Microsoft Visual Studio Code 和 Embarcardero Delphi 制作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海纳老吴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值