以为以VC6.0开发工具为例, .NET C++是一样的。
可以使用 控制台, WIN32, ATL (.NET 的ATL用的模板,而VC6.0不是)。
程序框架主要由两部分板成, 一个服务主函数(ServiceMain),另一个是用于服务管理控制用的(ServiceControlHandler)。
一、步聚:
1. 注册服务
2.永动服务
二、代码编写
#include "windows.h"
#include "winsvc.h"
SERVER_STATUS g_ServiceStatus; //用于存放当前服务状态, 启动, 停止, 恢复。。。。
SERVICE_STATUS_HANDLER g_ServiceStatusHandler; //控制句柄
void WINAPI ServiceMain(DWORD dwArgc, LPTSTR lpszArgv); //记住要加WINAPI, 为啥原因自己想喽
void WINAPI ServiceControlHandler(DWORD dwOpcode); //状态控制
void InstallService();
void UnInstallService();
int main()
{
SERVICE_TABLE_ENTRY DispatcherTable[] = {{_T("Your Server Name"), NULL}, {NULL, NULL}}; //为啥用两个,国际惯例哈。
StartServiceCtrlDispatcher(DispatcherTable);
}
void WINAPI ServiceMain(DWORD dwArgc, LPTSTR lpszArgv)
{
g_ServiceStatus.dwCurrentState = SERVICE_START_PENDING; //启动状态
g_ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; //为啥用这个参数去看MSDN
g_ServiceStatus.dwControlsAccepted = SERVICE_ACCPET_STOP; //我仅接受停止, 恢得,暂停自己加就行了
g_ServiceStatusHandler = RegisterServiceControlHandler(_T("Your Server Name"), ServiceControlHandler);//注册控制函数啦
if(g_ServiceStatusHandler == (SERVICE_STATUS_HANDLER) 0)
return;
g_ServicveStatus.dwServiceState = SERVICE_RUNNING; //置运行状态
if(!SetServiceStatus(g_ServiceStatusHandler, &g_ServiceStatus))
return;
//这里开始放置你的处理线程或代码了
.....
}
void WINAPI ServiceMain(DWORD dwOpcode)
{
switch(Opcode)
{
case SERVICE_CONTROL_PAUSE:
g_ServiceStatus.dwCurrentState = SERVICE_PAUSED;
break;
case SERVICE_CONTROL_CONTINUE:
g_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
g_bIsRunning = TRUE;
break;
case SERVICE_CONTROL_STOP: //因为我只设了停止
g_ServiceStatus.dwWin32ExitCode = 0;
g_ServiceStatus.dwServiceSpecificExitCode = 0;
g_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(g_ServiceStatusHandler, &g_ServiceStatus);
g_bIsRunning = FALSE;
break;
case SERVICE_CONTROL_INTERROGATE:
break;
}
}
//安装服务
void InstallService()
{
TCHAR szDir[_MAX_PATH];
DWORD dwRet = GetModuleFileName(NULL, szDir, _MAX_PATH);
szDir[dwRet] = _T('/0');
SC_HANDLE hSCM, hService;
hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if(!hSCM)
return;
hService = ::CreateService(hSCM, _T("Your Service Name"), _T("Your Service Name 描述"),
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START,
SERVICE_ERROR_NORMAL,
szDir,
NULL,
NULL,
NULL,
NULL,
NULL);
if(!hService)
return;
}
//缺载服务
void UnInstallService()
{
SC_HANDLE hSCM, hService;
hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if(!hSCM)
return;
hService = ::OpenService(hSCM, _T(”Your Service Name"), SERVICE_ALL_ACCESS);
if(!hService)
return;
::DeleteService(hService);
CloseServiceHandle(hService);
}
代码有通不过的地方,自己改哈, 有啥不正确之处欢迎各位指正。
可以使用 控制台, WIN32, ATL (.NET 的ATL用的模板,而VC6.0不是)。
程序框架主要由两部分板成, 一个服务主函数(ServiceMain),另一个是用于服务管理控制用的(ServiceControlHandler)。
一、步聚:
1. 注册服务
2.永动服务
二、代码编写
#include "windows.h"
#include "winsvc.h"
SERVER_STATUS g_ServiceStatus; //用于存放当前服务状态, 启动, 停止, 恢复。。。。
SERVICE_STATUS_HANDLER g_ServiceStatusHandler; //控制句柄
void WINAPI ServiceMain(DWORD dwArgc, LPTSTR lpszArgv); //记住要加WINAPI, 为啥原因自己想喽
void WINAPI ServiceControlHandler(DWORD dwOpcode); //状态控制
void InstallService();
void UnInstallService();
int main()
{
SERVICE_TABLE_ENTRY DispatcherTable[] = {{_T("Your Server Name"), NULL}, {NULL, NULL}}; //为啥用两个,国际惯例哈。
StartServiceCtrlDispatcher(DispatcherTable);
}
void WINAPI ServiceMain(DWORD dwArgc, LPTSTR lpszArgv)
{
g_ServiceStatus.dwCurrentState = SERVICE_START_PENDING; //启动状态
g_ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; //为啥用这个参数去看MSDN
g_ServiceStatus.dwControlsAccepted = SERVICE_ACCPET_STOP; //我仅接受停止, 恢得,暂停自己加就行了
g_ServiceStatusHandler = RegisterServiceControlHandler(_T("Your Server Name"), ServiceControlHandler);//注册控制函数啦
if(g_ServiceStatusHandler == (SERVICE_STATUS_HANDLER) 0)
return;
g_ServicveStatus.dwServiceState = SERVICE_RUNNING; //置运行状态
if(!SetServiceStatus(g_ServiceStatusHandler, &g_ServiceStatus))
return;
//这里开始放置你的处理线程或代码了
.....
}
void WINAPI ServiceMain(DWORD dwOpcode)
{
switch(Opcode)
{
case SERVICE_CONTROL_PAUSE:
g_ServiceStatus.dwCurrentState = SERVICE_PAUSED;
break;
case SERVICE_CONTROL_CONTINUE:
g_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
g_bIsRunning = TRUE;
break;
case SERVICE_CONTROL_STOP: //因为我只设了停止
g_ServiceStatus.dwWin32ExitCode = 0;
g_ServiceStatus.dwServiceSpecificExitCode = 0;
g_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(g_ServiceStatusHandler, &g_ServiceStatus);
g_bIsRunning = FALSE;
break;
case SERVICE_CONTROL_INTERROGATE:
break;
}
}
//安装服务
void InstallService()
{
TCHAR szDir[_MAX_PATH];
DWORD dwRet = GetModuleFileName(NULL, szDir, _MAX_PATH);
szDir[dwRet] = _T('/0');
SC_HANDLE hSCM, hService;
hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if(!hSCM)
return;
hService = ::CreateService(hSCM, _T("Your Service Name"), _T("Your Service Name 描述"),
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START,
SERVICE_ERROR_NORMAL,
szDir,
NULL,
NULL,
NULL,
NULL,
NULL);
if(!hService)
return;
}
//缺载服务
void UnInstallService()
{
SC_HANDLE hSCM, hService;
hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if(!hSCM)
return;
hService = ::OpenService(hSCM, _T(”Your Service Name"), SERVICE_ALL_ACCESS);
if(!hService)
return;
::DeleteService(hService);
CloseServiceHandle(hService);
}
代码有通不过的地方,自己改哈, 有啥不正确之处欢迎各位指正。