用 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;
}
...全文
268 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
q332010372 2014-08-06
  • 打赏
  • 举报
回复
没人知道吗?
内容概要:本报告基于寻汇与万事达卡在2026年联合发布的《超越自动化:定义智能体驱动的全球支付》白皮书,系统分析了AI智能体在B2B跨境支付领域的应用与发展。报告指出,传统跨境支付存在效率低、人工干预多、合规风险高等问题,当前正从数字化、数据化迈向“自主化”新阶段。AI智能体可在授权下自主完成支付、换汇、合规审核、对账等全流程操作,核心技术包括深度强化学习、自然语言处理和图神经网络,用于路径优化、合规解析与异常检测。报告揭示了决策可解释性不足、跨系统协同标准缺失、安全审计机制缺位三大研究空白,并探讨了法律责任归属、监管碎片化、数据主权与技术可靠性四大现实挑战。寻汇与万事达卡的合作构建了“智能体编排引擎”与全球合规决策网络,首次提出L0-L5的智能体自主化等级框架,推动行业标准化。预计2026至2027年将实现首批大规模商业部署,提升支付效率超30%。; 适合人群:金融科技研究人员、AI技术开发者、跨境支付行业从业者、企业财资管理人员及政策监管机构相关人员。; 使用场景及目标:①理解AI智能体在跨境支付中的技术架构与应用场景;②把握自主化支付的演进趋势与商业化前景;③为金融机构和技术公司布局AI驱动型支付系统提供战略参考;④助力监管机构制定适应智能体时代的合规框架。; 阅读建议:本报告兼具技术深度与产业视野,建议结合白皮书原文及相关技术文献对照研读,重点关注智能体决策逻辑、合规实现机制与跨系统集成方案,并关注后续试点项目的实际成效与监管反馈。

16,550

社区成员

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

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

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