用 StartService 启动一个服务,但启动没windows自带的服务管理程序快

q332010372 2014-08-05 02:59:04
用 StartService 启动一个服务,启动是启动了,只是要启动完需要很久,用windows自带服务管理程序(控制面板 -> 管理工具 -> 服务)看了一下,启动、停止、暂停、恢复全是灰色。但是如果用windows自带服务管理程序去启动,是非常快的

下面贴代码(实现 mysql 服务重启):

bool TFormCreateCompetitPro::RestartMySQLService()
{
::SC_HANDLE schSCManager,
schService;
SERVICE_STATUS_PROCESS sspStatus;
SERVICE_STATUS ssStatus;
DWORD dwBytesNeeded;
int waitCount = 10;

//打开服务控制管理器,并获得句柄
if ((schSCManager = OpenSCManager(NULL, SERVICES_ACTIVE_DATABASE, SC_MANAGER_CONNECT)) == NULL)
return false;

//打开服务
if ((schService = OpenServiceA(schSCManager, "MySQL", SERVICE_ALL_ACCESS)) == NULL)
{
CloseServiceHandle(schSCManager);
return false;
}

//检查服务状态
if (!QueryServiceStatusEx(
schService, // handle to service
SC_STATUS_PROCESS_INFO, // information level
(LPBYTE) &sspStatus, // address of structure
sizeof(SERVICE_STATUS_PROCESS), // size of structure
&dwBytesNeeded ) ) // size needed if buffer is too small
{
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
return false;
}

//如果服务未启动,则启动服务
if (sspStatus.dwCurrentState == SERVICE_STOPPED)
{
if (!StartService(
schService, // handle to service
0, // number of arguments
NULL) ) // no arguments
{
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
return false;
}

// 等待启动完成
do
{
if (waitCount <= 0)
return false;

::Sleep(1500);

//检查服务状态
if (!QueryServiceStatusEx(
schService, // handle to service
SC_STATUS_PROCESS_INFO, // information level
(LPBYTE) &sspStatus, // address of structure
sizeof(SERVICE_STATUS_PROCESS), // size of structure
&dwBytesNeeded ) ) // size needed if buffer is too small
{
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
return false;
}

waitCount--;
}
while (sspStatus.dwCurrentState != SERVICE_RUNNING);
}
//如果服务正在停止中,则等待完全停止,再启动服务
else if (sspStatus.dwCurrentState == SERVICE_STOP_PENDING)
{
// 等待停止完成
do
{
::Sleep(1500);

//检查服务状态
if (!QueryServiceStatusEx(
schService, // handle to service
SC_STATUS_PROCESS_INFO, // information level
(LPBYTE) &sspStatus, // address of structure
sizeof(SERVICE_STATUS_PROCESS), // size of structure
&dwBytesNeeded ) ) // size needed if buffer is too small
{
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
return false;
}
}
while (sspStatus.dwCurrentState != SERVICE_STOPPED);

//启动服务
if (!StartService(
schService, // handle to service
0, // number of arguments
NULL) ) // no arguments
{
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
return false;
}

// 等待启动完成
do
{
if (waitCount <= 0)
return false;

::Sleep(1500);

//检查服务状态
if (!QueryServiceStatusEx(
schService, // handle to service
SC_STATUS_PROCESS_INFO, // information level
(LPBYTE) &sspStatus, // address of structure
sizeof(SERVICE_STATUS_PROCESS), // size of structure
&dwBytesNeeded ) ) // size needed if buffer is too small
{
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
return false;
}
waitCount--;
}
while (sspStatus.dwCurrentState != SERVICE_RUNNING);
}
// 如果正在运行中,则停止服务,再启动服务
else if (sspStatus.dwCurrentState == SERVICE_RUNNING)
{
//停止服务
if(!ControlService(schService, SERVICE_CONTROL_STOP, &ssStatus))
{
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
return false;
}

// 等待停止完成
do
{
::Sleep(1500);

//检查服务状态
if (!QueryServiceStatusEx(
schService, // handle to service
SC_STATUS_PROCESS_INFO, // information level
(LPBYTE) &sspStatus, // address of structure
sizeof(SERVICE_STATUS_PROCESS), // size of structure
&dwBytesNeeded ) ) // size needed if buffer is too small
{
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
return false;
}
}
while (sspStatus.dwCurrentState != SERVICE_STOPPED);

//启动服务
if (!StartService(
schService, // handle to service
0, // number of arguments
NULL) ) // no arguments
{
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
return false;
}

// 等待启动完成
do
{
if (waitCount <= 0)
return false;

::Sleep(1500);

//检查服务状态
if (!QueryServiceStatusEx(
schService, // handle to service
SC_STATUS_PROCESS_INFO, // information level
(LPBYTE) &sspStatus, // address of structure
sizeof(SERVICE_STATUS_PROCESS), // size of structure
&dwBytesNeeded ) ) // size needed if buffer is too small
{
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
return false;
}

waitCount--;
}
while (sspStatus.dwCurrentState != SERVICE_RUNNING);
}

CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
return true;
}
...全文
169 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
q332010372 2014-08-06
  • 打赏
  • 举报
回复
没人知道吗?

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧