14 个解决方案
#2
想简单点就
把Server Name换成你的服务名称
麻烦点就是char szServiceName[]=_T("Server Name")
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);
#3
楼上很强大
#4
膜拜二楼。牛逼啊
#5
谢谢各位,可能我的问题问的不清楚,我再解释一下
首先,我要创建一个服务,这个服务属于自启动类型的服务
但是我发现用CreateService创建完这个服务后,服务立即会被自动启动起来,我不想调用完CreateService就立即自动起来,我希望至少要我自己调用类似StartService这样的命令的时候这个服务才能被启动或者重启机器或者事后手动启动,不知道怎么能能作到?
简单的说就是创建一个自启动类型的服务,当前的状态是没有启动的状态,而且在这期间压根就不要被启动
首先,我要创建一个服务,这个服务属于自启动类型的服务
但是我发现用CreateService创建完这个服务后,服务立即会被自动启动起来,我不想调用完CreateService就立即自动起来,我希望至少要我自己调用类似StartService这样的命令的时候这个服务才能被启动或者重启机器或者事后手动启动,不知道怎么能能作到?
简单的说就是创建一个自启动类型的服务,当前的状态是没有启动的状态,而且在这期间压根就不要被启动
#6
CreateService(); 这个函数的dwStartType参数指定为
SERVICE_DEMAND_START 或者 SERVICE_DISABLED
SERVICE_DEMAND_START //手动启动
SERVICE_DISABL //禁用
#7
我本身希望这个服务就是自启动类型的,但是出于其他目的,我不想让它一被CreateService()创建,就立即启动,我希望第一次是我程序控制或者重启服务器,不是在CreateService()时候就已经被启动了
#8
CreateService仅仅是创建服务,不启动
#9
强大
#10
char szServiceName[]=_T("Server Name") ,szFilePath是服务程序路径.
char szFilePath[_MAX_PATH];
::GetModuleFileName(NULL, szFilePath, sizeof(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;
}
#11
你将CreateService()放到一个线程里, 创建完后就将这个线程睡眠, 然后再将这个
线程唤醒,只不过要设个标志位判断一下服务是否已经创建.
不知道这样行不行! 临时想的. 没试验过. LZ试试吧.
#12
to zyq5945:
你确认CreateService只创建服务不启动吗?我创建的SERVICE_AUTO_START类型的,创建后就自动启动了,没有调用其他的
你确认CreateService只创建服务不启动吗?我创建的SERVICE_AUTO_START类型的,创建后就自动启动了,没有调用其他的
#13
额,我用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);
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);
#14
强大
#1
#2
想简单点就
把Server Name换成你的服务名称
麻烦点就是char szServiceName[]=_T("Server Name")
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);
#3
楼上很强大
#4
膜拜二楼。牛逼啊
#5
谢谢各位,可能我的问题问的不清楚,我再解释一下
首先,我要创建一个服务,这个服务属于自启动类型的服务
但是我发现用CreateService创建完这个服务后,服务立即会被自动启动起来,我不想调用完CreateService就立即自动起来,我希望至少要我自己调用类似StartService这样的命令的时候这个服务才能被启动或者重启机器或者事后手动启动,不知道怎么能能作到?
简单的说就是创建一个自启动类型的服务,当前的状态是没有启动的状态,而且在这期间压根就不要被启动
首先,我要创建一个服务,这个服务属于自启动类型的服务
但是我发现用CreateService创建完这个服务后,服务立即会被自动启动起来,我不想调用完CreateService就立即自动起来,我希望至少要我自己调用类似StartService这样的命令的时候这个服务才能被启动或者重启机器或者事后手动启动,不知道怎么能能作到?
简单的说就是创建一个自启动类型的服务,当前的状态是没有启动的状态,而且在这期间压根就不要被启动
#6
CreateService(); 这个函数的dwStartType参数指定为
SERVICE_DEMAND_START 或者 SERVICE_DISABLED
SERVICE_DEMAND_START //手动启动
SERVICE_DISABL //禁用
#7
我本身希望这个服务就是自启动类型的,但是出于其他目的,我不想让它一被CreateService()创建,就立即启动,我希望第一次是我程序控制或者重启服务器,不是在CreateService()时候就已经被启动了
#8
CreateService仅仅是创建服务,不启动
#9
强大
#10
char szServiceName[]=_T("Server Name") ,szFilePath是服务程序路径.
char szFilePath[_MAX_PATH];
::GetModuleFileName(NULL, szFilePath, sizeof(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;
}
#11
你将CreateService()放到一个线程里, 创建完后就将这个线程睡眠, 然后再将这个
线程唤醒,只不过要设个标志位判断一下服务是否已经创建.
不知道这样行不行! 临时想的. 没试验过. LZ试试吧.
#12
to zyq5945:
你确认CreateService只创建服务不启动吗?我创建的SERVICE_AUTO_START类型的,创建后就自动启动了,没有调用其他的
你确认CreateService只创建服务不启动吗?我创建的SERVICE_AUTO_START类型的,创建后就自动启动了,没有调用其他的
#13
额,我用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);
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);
#14
强大