如果生成windows的一个自启动服务,但是让他先不用自动启动?

xzou 2009-10-14 03:31:23
用CreateService创建一个windows services,dwStartType设置为自动启动SERVICE_AUTO_START,可是好像创建完服务以后都会自动启动这个服务,能不能创建时设置这个服务为自动启动,但是创建完服务以后不要立即启动?第一次要靠手动启动或者重启机器启动服务?是不是CreateService做不到这一点,有其他API可以实现这一要求吗?
...全文
321 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xzou 2009-10-16
  • 打赏
  • 举报
回复
to zyq5945:
你确认CreateService只创建服务不启动吗?我创建的SERVICE_AUTO_START类型的,创建后就自动启动了,没有调用其他的
yorkzjy 2009-10-16
  • 打赏
  • 举报
回复
强大
zyq5945 2009-10-16
  • 打赏
  • 举报
回复
额,我用CreateService 仅仅是创建了服务,服务不会自己启动,需添加启动代码.
SC_HANDLE hService = ::CreateService(hSCM,
m_szServiceName,
m_szServiceName,
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START, // start condition
SERVICE_ERROR_NORMAL,
szFilePath, //file path
NULL,
NULL,
NULL,
NULL,
NULL);
love514425 2009-10-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xzou 的回复:]
我本身希望这个服务就是自启动类型的,但是出于其他目的,我不想让它一被CreateService()创建,就立即启动,我希望第一次是我程序控制或者重启服务器,不是在CreateService()时候就已经被启动了
[/Quote]

你将CreateService()放到一个线程里, 创建完后就将这个线程睡眠, 然后再将这个
线程唤醒,只不过要设个标志位判断一下服务是否已经创建.
不知道这样行不行! 临时想的. 没试验过. LZ试试吧.
zyq5945 2009-10-15
  • 打赏
  • 举报
回复
char szServiceName[]=_T("Server Name") ,szFilePath是服务程序路径.
char szFilePath[_MAX_PATH];
::GetModuleFileName(NULL, szFilePath, sizeof(szFilePath));
BOOL CNTService::Install()
{
// Open the Service Control Manager
SC_HANDLE hSCM = ::OpenSCManager(NULL, // local machine
NULL, // ServicesActive database
SC_MANAGER_ALL_ACCESS); // full access
if (!hSCM) return FALSE;

// Get the executable file path
char szFilePath[_MAX_PATH];
::GetModuleFileName(NULL, szFilePath, sizeof(szFilePath));

// Create the service
SC_HANDLE hService = ::CreateService(hSCM,
m_szServiceName,
m_szServiceName,
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START, // start condition
SERVICE_ERROR_NORMAL,
szFilePath, //file path
NULL,
NULL,
NULL,
NULL,
NULL);
if (!hService) {
::CloseServiceHandle(hSCM);
return FALSE;
}
// tidy up
::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);
return TRUE;
}
hurryboylqs 2009-10-15
  • 打赏
  • 举报
回复
强大
zyq5945 2009-10-15
  • 打赏
  • 举报
回复
CreateService仅仅是创建服务,不启动
xzou 2009-10-14
  • 打赏
  • 举报
回复
我本身希望这个服务就是自启动类型的,但是出于其他目的,我不想让它一被CreateService()创建,就立即启动,我希望第一次是我程序控制或者重启服务器,不是在CreateService()时候就已经被启动了
love514425 2009-10-14
  • 打赏
  • 举报
回复

CreateService(); 这个函数的dwStartType参数指定为
SERVICE_DEMAND_START 或者 SERVICE_DISABLED

SERVICE_DEMAND_START //手动启动
SERVICE_DISABL //禁用
xzou 2009-10-14
  • 打赏
  • 举报
回复
谢谢各位,可能我的问题问的不清楚,我再解释一下
首先,我要创建一个服务,这个服务属于自启动类型的服务
但是我发现用CreateService创建完这个服务后,服务立即会被自动启动起来,我不想调用完CreateService就立即自动起来,我希望至少要我自己调用类似StartService这样的命令的时候这个服务才能被启动或者重启机器或者事后手动启动,不知道怎么能能作到?

简单的说就是创建一个自启动类型的服务,当前的状态是没有启动的状态,而且在这期间压根就不要被启动
ele7enjr 2009-10-14
  • 打赏
  • 举报
回复
膜拜二楼。牛逼啊
chenzhp 2009-10-14
  • 打赏
  • 举报
回复
楼上很强大
zyq5945 2009-10-14
  • 打赏
  • 举报
回复
想简单点就
system("net start \"Server Name\"");

把Server Name换成你的服务名称

麻烦点就是char szServiceName[]=_T("Server Name")
	SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

if (hSCM == NULL)
{
MessageBox(_T("无法打开服务管理器"), szServiceName, MB_OK);
return;
}

SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_ALL_ACCESS);

if (hService == NULL)
{
::CloseServiceHandle(hSCM);
MessageBox( _T("无法打开指定服务,请检查服务是否安装"), szServiceName, MB_OK);
return;
}
//SERVICE_STATUS status;
BOOL b=StartService(hService, 0, NULL );

//删除服务
//BOOL bDelete = ::DeleteService(hService);
::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);

if (b)
{
MessageBox( _T("成功启动服务"), szServiceName, MB_OK);
return;
}

//LogEvent(_T("Service could not be deleted"));
MessageBox( _T("无法启动服务,请检查服务是否已经运行"), szServiceName, MB_OK);
zyq5945 2009-10-14
  • 打赏
  • 举报
回复

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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