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

xzou 2009-10-14 03:31:23
用CreateService创建一个windows services,dwStartType设置为自动启动SERVICE_AUTO_START,可是好像创建完服务以后都会自动启动这个服务,能不能创建时设置这个服务为自动启动,但是创建完服务以后不要立即启动?第一次要靠手动启动或者重启机器启动服务?是不是CreateService做不到这一点,有其他API可以实现这一要求吗?
...全文
250 点赞 收藏 14
写回复
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日
发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告