delphi 启动停止windows服务 转
http://blog.csdn.net/haiou327/article/details/6106233
不用cmd用delphi如何实现启动停止windows服务
建议参考一下Delphi的ScktSrvr原码,
$(DELPHI)/Source/Vcl/ScktSrvr.dpr
--------------------------------------------------------------------------------
windows 系统服务
--------------------------------------------------------------------------------
function StartService(AServName: string): Boolean; //use WinSvc
var
SCManager, hService: SC_HANDLE;
lpServiceArgVectors: PChar;
begin
SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
Result := SCManager <> ;
if Result then
try
hService := OpenService(SCManager, PChar(AServName), SERVICE_ALL_ACCESS);
Result := hService <> ;
if (hService = ) and (GetLastError = ERROR_SERVICE_DOES_NOT_EXIST) then
Exception.Create('The specified service does not exist');
if hService <> then
try
lpServiceArgVectors := nil;
Result := WinSvc.StartService(hService, , PChar(lpServiceArgVectors));
if not Result and (GetLastError = ERROR_SERVICE_ALREADY_RUNNING) then
Result := True;
finally
CloseServiceHandle(hService);
end;
finally
CloseServiceHandle(SCManager);
end;
end; function StopService(AServName: string): Boolean;
var
SCManager, hService: SC_HANDLE;
SvcStatus: TServiceStatus;
begin
SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
Result := SCManager <> ;
if Result then
try
hService := OpenService(SCManager, PChar(AServName), SERVICE_ALL_ACCESS);
Result := hService <> ;
if Result then
try //停止并卸载服务;
Result := ControlService(hService, SERVICE_CONTROL_STOP, SvcStatus);
//删除服务,这一句可以不要;
// DeleteService(hService);
finally
CloseServiceHandle(hService);
end;
finally
CloseServiceHandle(SCManager);
end;
end;
///////////////////////////////////////////////////////////////////////////////////
总不能让用户自己启动scktsrvr.exe吧?将其安装为NT服务似乎也不是很好的办法,我想最好就是将它绑定到应用服务器了,请问各位,我该如何做呢?一定送分!
---------------------------------------------------------------
---------------------------------------------------------------
可以将你的App Server加到ScktSrvr那个程序中,或ScktSrvr加到你的程序中,那个程序在VCL目录下,不管怎么,第一次还是得安装成NT服务,不然它自动会加?
---------------------------------------------------------------
---------------------------------------------------------------
把Scktsrvr加到启动程序中(我就是这样做的);
---------------------------------------------------------------
---------------------------------------------------------------
把Scktsrvr加到启动程序中
---------------------------------------------------------------
把它加启动程序中?不好吧。
该程序是NT服务型的,只要运行一次,以后就自动运行了。所以没有必要让它加到启动组中每次再运行一次。
可以试试以下两种方法:
1.在发布应用服务器时,把Scktsrvr一同发布,在应用服务器执行的开始,先执行Scktsrvr,第一次执行后,在注册表中写一个标志,表示Scktsrvr已经运行。以后再运行时首先检查这个标志,如已运行就不再执行了。
2.在安装盘中做呀。制作安装盘的工具大多都有执行外壳命令的功能。安装应用服务器后让安装程序执行一下Scktsrvr就可以了!
---------------------------------------------------------------
---------------------------------------------------------------
Scktsrvr.exe加到启动程序中
---------------------------------------------------------------
在Delphi的安装目录下的/Source/Vcl目录下有ScktSrvr.dpr整个项目,你可以将的应用程序服务器加在这个项目里,就不用ScktSrvr.Exe了。
---------------------------------------------------------------
Scktsrvr是个服务
Scktsrvr.exe -install
注册这个服务,并在服务管理器把它设为自动就OK了。
---------------------------------------------------------------
把Scktsrvr加到启动程序中
---------------------------------------------------------------
我就是这样做的,在ScktSrvr.dqr项目里,加入远程数据模块,将服务器要用的控件都放到远程数据模块中,编译执行。
然后打开客户端程序,连接,成功!!没什么问题也!!!!
---------------------------------------------------------------
先启动你的Scktsrvr;
可以再应用程序启动后,调用外部程序;
---------------------------------------------------------------
---------------------------------------------------------------
那就只执行一次喽
将Scktsrvr放入:
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/RunOnce
---------------------------------------------------------------
---------------------------------------------------------------
在dpr中
procedure RunSckt;
var
handle: hwnd;
begin
if FindWindow(nil, 'scktsrvr') = 0 then
ShellExecute(handle, 'open', pchar(extractFilepath(application.exename) + 'scktsrvr.exe'), '', '', SW_SHOWNA);
end;
在主form中
procedure TfrmMain.FormDestroy(Sender: TObject);
var
HandleSocket: Hwnd;
begin
HandleSocket := FindWindow(nil, 'scktsrvr');
if HandleSocket <> 0 then
SendMessage(handlesocket, wm_close, 0, 0);
end;
---------------------------------------------------------------
第一 scktsrvr /install 安装到服务器中最好,因为在98下面启动是不行的,只有在2k下面或者NT下面才行;
第二 scktsrvr整个工程源代码在VCL下面,可以改变名称,和里面的数据模块,可以改个名称;
第三 通讯端口可以改变,最好改变,这个端口写在注册表里面,看看源代码就可以拉,最好改变不要使用注册表来放置,这样便于保密。
---------------------------------------------------------------
---------------------------------------------------------------
我倒,早就有过这种讨论了,scktsrvr demo 中 TSocketDispatcher 可以独立成一个控件,那样你爱放哪就哪了?
现在的问题是 TSocketDispatcher 不能检测到非法网络中断,比方客户机掉电/拔号断开连接/线路不稳定
---------------------------------------------------------------
-------------------------------------------
让它随server自动启动。(放到启动菜单)
delphi 启动停止windows服务 转的更多相关文章
- Delphi启动/停止Windows服务,启动类型修改为"自动"
unit U_StartServices; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Contr ...
- Web启动,停止Windows服务
When you grow stronger,the world become more dangerous.当你变得越强大,这个世界反而会变得越危险. ServiceModel.cs代码: publ ...
- Linux Systemd——在RHEL/CentOS 7中启动/停止/重启服务
RHEL/CentOS 7.0中一个最主要的改变,就是切换到了systemd.它用于替代红帽企业版Linux前任版本中的SysV和Upstart,对系统和服务进行管理.systemd兼容SysV和Li ...
- bat启动/停止oracle服务
原文:bat启动/停止oracle服务 自己的电脑比较慢,尤其装了oracle10g后,服务开启和关闭用bat文件操作省事点 开启服务 @echo offnet start OracleService ...
- 在CentOS 7中启动/停止/重启服务
RHEL/CentOS 7.0中一个最主要的改变,就是切换到了systemd.它用于替代红帽企业版Linux前任版本中的SysV和Upstart,对系统和服务进行管理.systemd兼容SysV和Li ...
- 注册、启动、停止windows服务
找到本机InstallUtil.exe命令 命令行下注册服务InstallUtil.exe D:\XXXXService.exe 启动服务 net start XXXXService 停止服务net ...
- Windows下使用service.bat安装tomcat服务, 启动停止tomcat服务
在项目开发过程中,以前只是在Eclipse中配置.启动.停止tomcat服务器 如果只想在机器中使用tomcat服务器,而不想安装MyEclipse,可以使用service.bat 将tomcat安装 ...
- 【OF框架】使用OF.WinService项目,添加定时服务,进行创建启动停止删除服务操作
准备 使用框架搭建完成项目,包含OF.WinService项目. 了解Window Service 和定时服务相关知识. 一.添加一个定时服务 第一步:了解项目结构 第二步:创建一个新的Job 第三步 ...
- 【转】启动、停止Windows服务的DOS命令
需要用管理员身份运行 在图形界面中启动.停止服务很方便,但是操作系统有时候会出故障,此时不妨使用原始的DOS命令启动.停止服务,也许会收到意想不到的效果的! 方法/步骤 1 开始→所有程序. 2 附件 ...
随机推荐
- python3操作数据库 借助pycharm快速连接并操作mysql数据库
1.https://blog.csdn.net/qiushi_1990/article/details/78041299
- C#并行计算 Parallel.Foreach&Parallel.For
Parallel.For(int fromInclude, int toExclude, Action<int> body) 栗子: Parallel.For(0, 10, (i) =&g ...
- AF_INET域与AF_UNIX域socket通信原理对比
原文 1. AF_INET域socket通信过程 典型的TCP/IP四层模型的通信过程. 发送方.接收方依赖IP:Port来标识,即将本地的socket绑定到对应的IP端口上,发送数据时,指定对方的 ...
- Linux内核启动流程分析(一)【转】
转自:http://blog.chinaunix.net/uid-25909619-id-3380535.html 很久以前分析的,一直在电脑的一个角落,今天发现贴出来和大家分享下.由于是word直接 ...
- orm 缺点
背景 提起orm,在我开发这几年可是阴魂不散,因为我的开发没人带,全是自己琢磨,好处是很多东西都懂,都理解的透彻,缺点是见得少,接触少.而我一直没用orm,但是又到处听说orm,但我总想不明白有啥用处 ...
- 深度学习框架之TensorFlow的概念及安装(ubuntu下基于pip的安装,IDE为Pycharm)
2015年11月9日,Google发布人工智能系统TensorFlow并宣布开源. 1.TensorFlow的概念 TensorFlow 是使用数据流图进行数值计算的开源软件库.也就是说,Tensor ...
- 小白学习安全测试(二)——httrack的安装和使用
httrack是一款免费的网站镜像程序,简单理解就是可以在网站结构(网页及一些主要信息文件),下载到本地,可离线浏览,我是按照搭建成功后的console直译过来的 下面说下安装: 我都是在Linux环 ...
- PHP中使用OpenSSL生成RSA公钥私钥及进行加密解密示例(非对称加密)
php服务端与客户端交互.提供开放api时,通常需要对敏感的部分api数据传输进行数据加密,这时候rsa非对称加密就能派上用处了,下面通过一个例子来说明如何用php来实现数据的加密解密 先了解一下关于 ...
- 高能天气——团队Scrum冲刺阶段-Day 2
高能天气--团队Scrum冲刺阶段-Day 2 今日完成任务 于欣月:实现滑动界面视图,天气预报UI组件的初步优化 滑动界面 实现代码 //Activity中 //请求新选择城市的天气信息 navBu ...
- java实现最小堆
1.堆:通常通过二叉堆,实为二叉树的一种,分为最小堆和最大堆,具有以下性质: 任意节点小于它的所有后裔,最小元在堆的根上. 堆总是一棵完全树 将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小 ...