mysql服务的注册,启动、停止、注销。 [delphi代码实现]
unit Service;
interface
uses Windows,Classes,SysUtils,Winsvc,winsock;
Type
{服务句柄信息}
TScmInfo=Record
HostName :String;
DataBaseName:String;
DesireAccess :DWORD;
End;
{服务信息}
TSvcInfo=Record
HscManager :Integer;
ServerName :String; //服务名
DisplayName :String; //服务的显示名
DesireAccess :DWORD; //
ServiceType :Dword; //服务的类别
StartType :Dword; //服务的启动方式
ErrorControl :Dword; //服务错误控制方式
BinaryPathName :String; //服务执行文件的具体路径
LoadOrderGroup :String;
TagId :Dword;
Dependencies :String; //依赖:有多个依赖的服务时,中间以空格隔开}
ServerStartName :String;
Password :String;
End;
//需要注册的服务信息数组
SvcArray=Array[..] of TSvcInfo;
Type
{服务控制类}
TService=Class(TObject)
Private
Scm_Info :TScmInfo;
Svc_Info :TSvcInfo;
ScmHandle :Integer;
{服务句柄}
SvcHandle :Integer;
Public
Constructor Create();
Destructor Destroy();Override;
Function SetScmInfo():Boolean;
Function OpenScmHandle():Integer;
Function SetServiceInfo(TmpSvc :TsvcInfo):Boolean;
{建立一服务}
Function CreateService0():Boolean;
{删除一服务}
Function Delete_AService(ServiceName :String):Boolean;
{一服务}
Function Open_Service(ServiceName :String):Boolean;
{/////////////////////////////////////////////////////////////////////}
{// 函数名称: IsSvcExists()
{// 函数功能: 判断系统中相关的服务是否存在
{// 参数信息: 需要判断的服务名
{// 返回值: TRUE : WINDOWS 中的服务已存在,FALSE :WINDOWS 中的服务不存在
{//
{/////////////////////////////////////////////////////////////////////}
Function isSvcExists(ServiceName :string):Boolean;
{/////////////////////////////////////////////////////////////////////////}
{// 函数名称: Start_Service() Control_Service
{// 函数功能: 启动相关的服务进程
{// 参数信息: 需要启动的服务名
{// 返回值: TRUE :服务已经启动;FALSE:服务启动失败;
{/////////////////////////////////////////////////////////////////////////}
Function Control_Service(ServiceName : String; controlType :integer):Boolean;
{/////////////////////////////////////////////////////////////////////////}
{// 函数名称: IsServiceStart()
{// 函数功能: 判断服务是否启动
{// 参数信息: 需要判断的服务名
{// 返回值: TRUE :服务已经启动; FALSE :服务已停止
{/////////////////////////////////////////////////////////////////////////}
Function IsServiceStart(ServiceName:String):Boolean;
End;
implementation
{ TService }
constructor TService.Create;
begin
try
ScmHandle :=;
SetScmInfo();
ScmHandle:=OpenSCManager(PChar(Scm_Info.HostName),Nil,Scm_Info.DesireAccess);
Except
End;
end;
{建立一服务}
function TService.CreateService0(): Boolean;
Var i :Integer;
b:SC_HANDLE;
begin
Try
OpenScmHandle();
// svc_info.HscManager := ScmHandle;
svc_info.HscManager:= OpenSCManager(nil,nil,SC_MANAGER_CREATE_SERVICE);
Result :=False;
// SvcHandle:=
b:=CreateService(svc_Info.HscManager,
Pchar(svc_Info.ServerName),
Pchar(Svc_Info.DisplayName),
SERVICE_ALL_ACCESS, // Svc_info.DesireAccess
SERVICE_INTERACTIVE_PROCESS or SERVICE_WIN32_OWN_PROCESS, // svc_INfo.ServiceType,
SERVICE_AUTO_START, // svc_INfo.ServiceType,
SERVICE_ERROR_NORMAL, // Svc_Info.ErrorControl,
pchar(Svc_Info.BinaryPathName),
nil,nil,nil,nil,nil);
{ //原形
b:=CreateService(svc_Info.HscManager,
Pchar(svc_Info.ServerName),
Pchar(Svc_Info.DisplayName),
Svc_info.DesireAccess,
svc_INfo.ServiceType,
Svc_Info.StartType ,
Svc_Info.ErrorControl,
pchar(Svc_Info.BinaryPathName),
pchar(''),
LPDWORD(0),
Pchar(Svc_Info.Dependencies),
Pchar(Svc_info.ServerStartName),
Pchar(Svc_Info.Password)); }
// If SvcHandle <> 0 Then
If b <> Then
Begin
Result :=True;
CloseServiceHandle(SvcHandle);
End ;
I:=i+;
Except
End;
end;
{注销一服务}
function TService.Delete_AService(ServiceName: String): Boolean;
Var RHandle:Integer; rc :Boolean;
begin
Try
OpenScmHandle();
Result :=False;
If ScmHandle<> Then
Begin
RHandle :=OpenService(ScmHandle,PChar(ServiceName),SERVICE_ALL_ACCESS );
If RHandle <> Then
Begin
Rc :=DeleteService(Rhandle);
Result :=Rc;
{关闭句柄}
CloseServiceHandle(RHandle);
End Else Result :=True;
End;
Except
End;
end;
destructor TService.Destroy;
begin
try
CloseServiceHandle(ScmHandle);
Except
End;
end;
{打开数据库的句柄}
function TService.isSvcExists(ServiceName: string): Boolean;
Var RHandle:Integer;
rc :Boolean;
begin
Try
OpenScmHandle();
Result :=False;
If ScmHandle<> Then
Begin
RHandle :=OpenService(ScmHandle,PChar(ServiceName),SERVICE_ALL_ACCESS );
If RHandle <> Then
Begin
Result :=true;
{关闭句柄}
CloseServiceHandle(RHandle);
End;
End;
Except
End;
end;
function TService.OpenScmHandle: Integer;
begin
try
SetScmInfo();
Then CloseServiceHandle(ScmHandle);
ScmHandle := ;
ScmHandle :=OpenSCManager(PChar(Scm_Info.HostName),Nil,Scm_Info.DesireAccess);
then
ScmHandle :=OpenSCManager(PChar(Scm_Info.HostName),Nil,Scm_Info.DesireAccess);
Except
End;
end;
{打开一服务}
function TService.Open_Service(ServiceName: String): Boolean;
Var
SHandle :Integer;
begin
Try
Result :=False;
sHandle := ;
SHandle :=OpenScmHandle();
If SHandle<> Then
Begin
SvcHandle :=OpenService(SHandle,PChar(ServiceName),SERVICE_ALL_ACCESS );
If SvcHandle <> Then Result :=True;
End;
Except
End;
end;
function TService.SetScmInfo(): Boolean;
Var
hostName : ..] of char;
wsdata : TWSAData;
begin
try
WSAStartup ($, wsdata);
Result :=False;
gethostname (hostName,sizeof(hostName));
If HostName ='' Then
Exit;
scm_Info.HostName :=HostName;
Scm_Info.DesireAccess :=SC_MANAGER_ALL_ACCESS;
Except
End;
end;
//设置需要注册的WINDOWS 服务的具体信息
function TService.SetServiceInfo(TmpSvc: TsvcInfo): Boolean;
begin
try
Result :=False;
If ScmHandle > Then
Begin
Svc_Info :=TmpSvc;
Svc_Info.HscManager :=ScmHandle;
Result :=True;
End;
Except
End;
end;
//控制WINDOWS 系统内部的服务
function TService.Control_Service(ServiceName: String;controlType : Integer): Boolean;
Var
RHandle:Integer;
rc :Boolean;
Rec_status :TServiceStatus;
serviceArg :Pchar;
i :Integer;
begin
i :=;
serviceArg := Pchar('');
Try
Result :=False;
If ScmHandle <> Then
Begin
RHandle :=OpenService(ScmHandle,PChar(ServiceName),SERVICE_ALL_ACCESS );
If RHandle <> Then
Begin
Case controlType of
: //启动服务器
Begin
//ControlService(rHandle,SERVICE_CONTROL_START,rec_status);
StartService(rHandle,,servicearg);
i:=;
While i< Do
Begin
QueryServiceStatus(RHandle,Rec_status);
if rec_status.dwCurrentState =SERVICE_RUNNING then
Begin
result :=True;
CloseServiceHandle(RHandle);
Break;
End;
sleep();
i:=i+;
End;
End;
: //暂停服务进程
Begin
ControlService(rHandle,SERVICE_CONTROL_PAUSE,rec_status);
i:=;
While i< Do
Begin
QueryServiceStatus(RHandle,Rec_status);
if rec_status.dwCurrentState =SERVICE_PAUSED then
Begin
result :=true;
CloseServiceHandle(RHandle);
Break;
End;
Sleep();
i:=i+;
End;
End;
: //唤醒服务进程
Begin
ControlService(rHandle,SERVICE_CONTROL_CONTINUE,rec_status);
i:=;
While i< do
Begin
QueryServiceStatus(RHandle,Rec_status);
if rec_status.dwCurrentState =SERVICE_RUNNING then
Begin
result :=True;
CloseServiceHandle(RHandle);
Break;
End;
Sleep();
i:=i+;
End;
End;
: //停止服务进程
begin
ControlService(rHandle,SERVICE_CONTROL_STOP,rec_status);
i:=;
While i< Do
Begin
QueryServiceStatus(RHandle,Rec_status);
if rec_status.dwCurrentState =SERVICE_STOPPED then
Begin
result :=True;
CloseServiceHandle(RHandle);
Break;
End;
Sleep();
i:=i+;
End;
End;
: //关闭服务程序 SERVICE_CONTROL_SHUTDOWN
Begin
rec_status.dwCurrentState :=SERVICE_RUNNING;
ControlService(rHandle,SERVICE_CONTROL_STOP,rec_status);
i:=;
While i< Do
Begin
QueryServiceStatus(RHandle,Rec_status);
if rec_status.dwCurrentState =SERVICE_STOPPED then
Begin
result :=True;
CloseServiceHandle(RHandle);
Break;
End;
Sleep();
i:=i+;
End;
End;
end;
Result :=true;
{关闭句柄}
then
CloseServiceHandle(RHandle);
End;
End;
Except
End;
end;
function TService.IsServiceStart(ServiceName: String): Boolean;
Var
RHandle:Integer;
rc :Boolean;
Rec_status :TServiceStatus;
begin
Try
OpenScmHandle();
Result :=False;
If ScmHandle<> Then
Begin
RHandle := ;
RHandle :=OpenService(ScmHandle,PChar(ServiceName),SERVICE_ALL_ACCESS );
If RHandle <> Then
Begin
QueryServiceStatus(RHandle,Rec_status);
if rec_status.dwCurrentState =SERVICE_RUNNING then
result :=True;
{关闭句柄}
CloseServiceHandle(RHandle);
End;
End;
Except
End;
end;
end.
程序中使用
uses Service;
///***********************************
//注册 必须把my.ini放在 mysqld-nt.exe路径或者 系统windows 下
procedure TForm1.Button1Click(Sender: TObject);
var s:TService;
a:TScmInfo ;
b:TSvcInfo;
begin
s:=TService.Create;
b.ServerName :='mysql';
b.DisplayName :='sdfss';
b.BinaryPathName :='D:\APMXE5\mysql60\bin\mysqld-nt.exe'; //路径和exe文件
s.SetScmInfo ;
s.SetServiceInfo(b);
s.CreateService0;
s.Destroy ;
end;
//******************
//运行
procedure TForm1.Button2Click(Sender: TObject);
var s:TService;
begin
s:=TService.Create;
s.Control_Service() ;
s.Destroy ;
end;
//**************
//停止
var s:TService;
begin
s:=TService.Create;
s.Control_Service() ;
s.Destroy ;
end;
//**********************
注销
procedure TForm1.Button4Click(Sender: TObject);
var s:TService;
begin
s:=TService.Create;
s.Delete_AService('mysql') ;
s.Destroy ;
end;
复制代码
http://www.cnblogs.com/jxgxy/archive/2010/07/23/1783735.html
mysql服务的注册,启动、停止、注销。 [delphi代码实现]的更多相关文章
- MySQL服务使用cmd启动与停止服务
MySQL未设置自动启动,在使用时需要手动打开服务,方法如下 mysql服务的启动: 以管理员的身份运行cmd命令窗口,输入命名 net start mysql 提示:必须使用管理员身份运行cmd 如 ...
- 彻底删除mysql服务(清理注册表)
由于安装某个项目的执行文件,提示要卸载MySQL以便它自身MySQL安装,然后我禁用了MYSQL服务,再把这个文件夹删除后,发现还是提示请卸载MYSQL服务. 解决步骤: 1.以管理员身份运行命令提示 ...
- WAMP中mysql服务突然无法启动 解决方法
wamp的mysql服务前两天还能用,今天突然不能无法启动了,原因可能是近期电脑强行关机,删除wamp\bin\mysql\mysql5.6.17\data目录下的ib_logfile0和ib_log ...
- MariaDB/MySql 服务消失无法启动
今天启动电脑打开数据库发现这么一个错误: 2003 can't connect to mysql server on localhost 10038 无奈去查看了服务,发现mysql服务消失了,猜 ...
- MySQL Install--CentOS 7配置MySQL服务和开启启动
创建MySQL服务 编辑文件: vim /usr/lib/systemd/system/mysql.service 录入下面内容: PS: 注意修改ExecStart脚本 [Unit]Descript ...
- 关于MySQL服务无法正常启动问题
使用mysql的时候,突然查看服务列表也找不到mysql服务 解决办法: 一.首先打开CMD,切换到MySql安装目录的MySql Server →bin目录下 运行如下命令(具体试个人安装的MySq ...
- mysql服务里面没有启动项
解决:5.0版本:开始->运行->cmd,进到mysql安装的bin目录D:\MySQL\bin>mysqld.exe -installService successfully in ...
- windows 下 mysql服务的注册和删除
注册: mysqld --install 服务名 --defaults-file="C:\Mysql\mysql-5.7\my.ini" 删除 sc delete 服务名 停止服务 ...
- windows 服务 安装 删除 启动 停止
一.停止 sc stop 服务名 二.删除 sc delete 服务名 注意:有时删除不了,报什么“服务为删除标识” ,请将服务窗口关掉就好了. 三.创建 sc create XmlcSendServ ...
随机推荐
- sgu Ice-cream Tycoon
题意:供应商提供n块价格为c的冰淇淋,一个学生想买n块冰淇淋,手中的钱数总共有t元,为了不让买n块冰淇淋所花费的钱数不超过t元,先尽可能卖给这个学生便宜的冰淇淋. 如果这个学生不能买到所需要的冰淇淋则 ...
- jQuery对象与DOM对象的互相转换
jQuery对象转换成DOM对象jQuery提供了两种方法将一个jQuery对象转换成DOM对象,即[index]和get(index).1.jQuery对象是一个数组对象,可以通过[index]的方 ...
- Qt自定义带游标的slider,在滑块正上方显示当前值(非常有意思,继承QSlider之后增加一个QLabel,然后不断移动它)
首先自定义QSlider的子类MyCustomSlider,如下所示. mycustomslider.h #ifndef MYCUSTOMSLIDER_H #define MYCUSTOMSLIDER ...
- 继承Object和ContextBoundObject处理效率上的差距
继承Object和ContextBoundObject处理效率上的差距 ContextBoundObject一个很熟悉的对象,它提供对象有处理上下文的能力:通过它能够方便地实现AOP处理机制.它带来好 ...
- eclipsecdt添加自动补全功能
自动代码补全完全是一个改善生活质量的功能呀!cdt拥有自动代码补全功能,只是我们没有打开而已 1. 绑定快捷方式 1. windows -> preferences ->general-& ...
- errno的基本用法
error是一个包含在 perror()和strerrot()函数可以把errno的值转化为有意义的字符输出. #include <stdio.h> #include <stdlib ...
- Visual Studio 2015 使用ODP.net进行EF开发
刚转了新公司,以前公司都是用VS+MSSQL作为开发工具的 现在新公司由于数据库是Oracle,而且新公司比较小规模,开发团队也没有什么规范 访问数据库的方式一直使用ADO.net的DataTable ...
- springMVC3学习(六)--SimpleFormController
SimpleFormController提交表单流程例如以下: login.jsp <form action="login" method="post"& ...
- [Immutable + AngularJS] Use Immutable .List() for Angular array
const stores = Immutable.List([ { name: 'Store42', position: { latitude: 61.45, longitude: 23.11, }, ...
- Android 加速Gradle构建项目
1. 升级gradle 进入项目文件夹$project/gradle/wrapper/gradle-wrapper.properties, 使用最新的gradle. 修改替换为最新的 distribu ...