通过vc 中Windows application 工程创建Windows service程序
2010-01-28 18:51
453 查看
实现步骤:
1. 注册service程序到系统服务管理器函数Install的实现,主要是以下两个api的调用。
OpenSCManager
CreateService
2. 在window application的入口函数中实现StartServiceCtrlDispatcher的调用。
如果是利用我给的文件则只要在_tWinMain 中追加以下下内容就可以
/***************************Start************************/
TCHAR* lpCmdLine = GetCommandLine();
TCHAR* pParam = _tcschr(lpCmdLine , ' ');
if (pParam != NULL)
{
pParam++;
}
InitService(pParam);
return 0;
/***************************End************************/
InitService实际上就是执行以下部分内容:
SERVICE_TABLE_ENTRY st[] =
{
{
szServiceName /*你的服务名称,和CreateService中的服务名称应该一致*/,
(LPSERVICE_MAIN_FUNCTION)ServiceMain /*ServiceMain 是你的service入口函数*/
} , {
NULL, NULL
}
};
if (!::StartServiceCtrlDispatcher(st))
{
//Error
}
3. 第二步用到的service入口函数ServiceMain的实现。
ServiceMain的原型:
void WINAPI ServiceMain(DWORD argc, LPTSTR *argv);
所有以上三步追加好以后就可以进行service程序的追加,启动了。
步骤1, 启动程序,执行第一步的Install,这时候就可以在service窗体中看到你追加的服务名称【应该是你设定的服务名称】
步骤2.启动或停止你的服务。
手动操作方法: window键 + R 启动 运行对话框,输入 services.msc 启动服务管理,查找你的
服务,选中并点右键选择 开始/停止。
代码事项:执行StartService,具体看cpp文件的注释部分。
其他:可以追加你要执行的相应操作,也可以添加卸载操作。查看Uninstall函数。
*通过以上操作和以下文件的应用,执行生成的文件
参数说明:
exe文件 /install 加载自己的service到服务管理列表中
exe文件 /uninstall 卸载加载的程序
以上是实现的简单说明,看实例可以更好的理解。
以下是头文件和实现文件的全部内容,文件名称是:CommFile
/*****************.h文件 Start*******************************/
#ifndef COMM_FILE_
#define COMM_FILE_
void Init();
BOOL IsInstalled();
BOOL Install();
BOOL Uninstall();
void LogEvent(LPCTSTR pszFormat, ...);
void WINAPI ServiceMain(DWORD argc, LPTSTR *argv);
void WINAPI ServiceStrl(DWORD dwOpcode) ;
void FormatMsg(DWORD errCode, TCHAR Msg[]);
static TCHAR szServiceName[] = _T("Temp3");
static BOOL bInstall;
static SERVICE_STATUS_HANDLE hServiceStatus;
static SERVICE_STATUS status;
static DWORD dwThreadID;
static SC_HANDLE hScm ;
static SC_HANDLE hService ;
static TCHAR szFilePath[MAX_PATH];
#define MSG_LEN 1024
#define InitService(lpCmdLine) /
{ /
Init(); /
dwThreadID = ::GetCurrentThreadId(); /
SERVICE_TABLE_ENTRY st[] = /
{ /
{ /
szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain /
} , { /
NULL, NULL /
} /
}; /
if (wcsicmp(lpCmdLine, _T("/install")) == 0) { /
if(Install()) { /
LogEvent(_T("Install Success!")); /
} else { /
LogEvent(_T("Install Failed!")); /
}; /
} else if (wcsicmp(lpCmdLine, _T("/uninstall")) == 0) { /
if(Uninstall()) { /
LogEvent(_T("Uninstall Success!")); /
} else { /
LogEvent(_T("Uninstall Failed!")); /
}; /
} else { /
LogEvent(_T("StartServiceCtrlDispatcher Start")); /
if (!::StartServiceCtrlDispatcher(st)) /
{ /
DWORD errCode = GetLastError(); /
TCHAR tchrTemp[MSG_LEN]; /
TCHAR errMsg[MSG_LEN]; /
FormatMsg(errCode, tchrTemp); /
wsprintf(errMsg, _T("Code = %d ErrorMessage = %s"), errCode, tchrTemp); /
LogEvent(errMsg); /
} /
} /
}
#endif
/*****************.h文件 End*******************************/
/*****************.Cpp文件 Start*******************************/
#include "stdafx.h"
#include "stdio.h"
#include "CommFile.h"
#include "tchar.h"
void LogEvent(LPCTSTR pszFormat, ...)
{
SYSTEMTIME sysTem;
//GetSystemTime(&sysTem);
GetLocalTime(&sysTem);
char chrMultl[MSG_LEN];
BOOL bFlg;
LPSTR ptcsDot = NULL;
char logFile[MAX_PATH];
memset(logFile, 0, MAX_PATH);
WideCharToMultiByte(CP_ACP, NULL, pszFormat, wcslen(pszFormat) * sizeof(wchar_t) , chrMultl, MSG_LEN, "", &bFlg);
WideCharToMultiByte(CP_ACP, NULL, szFilePath, MAX_PATH, logFile, MAX_PATH, "", &bFlg);
ptcsDot = strrchr(logFile, '.');
*ptcsDot = 0;
strcat(logFile, ".log");
FILE* hfile = fopen(logFile, "a+");
if (hfile != NULL) {
char chrMsg[MSG_LEN];
memset(chrMsg, 0, MSG_LEN);
sprintf(chrMsg, "%04d/02%02d/%02d %02d:%02d:%02d-%03d %s",
sysTem.wYear,
sysTem.wMonth,
sysTem.wDay,
sysTem.wHour,
sysTem.wMinute,
sysTem.wSecond,
sysTem.wMilliseconds,
chrMultl);
fprintf(hfile, "%s/n", chrMsg);
fclose(hfile);
}
}
void FormatMsg(DWORD errCode, TCHAR Msg[])
{
LPVOID lpMsgBuf;
TCHAR tchrTemp_utf8[256];
memset(Msg, 0, sizeof(Msg));
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, errCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL);
lstrcat(Msg, (TCHAR*)lpMsgBuf);
}
void WINAPI ServiceStrl(DWORD dwOpcode)
{
LogEvent(_T("ServiceStrl Start"));
DWORD Opcode = dwOpcode;
switch(Opcode)
{
case SERVICE_CONTROL_PAUSE:
LogEvent(_T("SERVICE_CONTROL_PAUSE"));
// Do whatever it takes to pause here.
status.dwCurrentState = SERVICE_PAUSED;
break;
case SERVICE_CONTROL_CONTINUE:
LogEvent(_T("SERVICE_CONTROL_CONTINUE"));
// Do whatever it takes to continue here.
status.dwCurrentState = SERVICE_RUNNING;
break;
case SERVICE_CONTROL_STOP:
LogEvent(_T("SERVICE_CONTROL_STOP"));
// Do whatever it takes to stop here.
status.dwWin32ExitCode = 0;
status.dwCurrentState = SERVICE_STOPPED;
status.dwCheckPoint = 0;
status.dwWaitHint = 0;
if (!SetServiceStatus (hServiceStatus, &status))
{
LogEvent(_T("SetServiceStatus Error[SERVICE_CONTROL_STOP]"));
}
case SERVICE_CONTROL_INTERROGATE:
LogEvent(_T("SERVICE_CONTROL_INTERROGATE"));
// Fall through to send current status.
return ;
break;
default:
// LogEvent(_T("default"));
return;
break;
}
// Send current status.
if (!SetServiceStatus(hServiceStatus, &status))
{
LogEvent(_T("SetServiceStatus Error"));
}
LogEvent(_T("ServiceStrl End"));
return;
}
void Init() {
hServiceStatus = NULL;
status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
status.dwCurrentState = SERVICE_START_PENDING;
status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
status.dwWin32ExitCode = 0;
status.dwServiceSpecificExitCode = 0;
status.dwCheckPoint = 0;
status.dwWaitHint = 0;
memset(szFilePath, 0, sizeof(szFilePath));
GetModuleFileName(NULL, szFilePath, sizeof(szFilePath));
}
BOOL Install() {
hScm = OpenSCManager(NULL,
NULL,
SC_MANAGER_ALL_ACCESS);
//create server
hService = ::CreateService(
hScm,
szServiceName,
szServiceName,
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START,
SERVICE_ERROR_NORMAL,
szFilePath,
NULL,
NULL,
NULL,
NULL,
NULL);
wchar_t szPath[1][MAX_PATH];
lstrcpy(szPath[0], szFilePath);
/*if(StartService(hService, 0, NULL) == FALSE) {
LogEvent(_T("StartService Err"));
TCHAR Msg[MSG_LEN];
TCHAR errMsg[MSG_LEN];
DWORD dwErrCode = GetLastError();
FormatMsg(dwErrCode, Msg);
wsprintf(errMsg, _T("Code = %d ErrorMsg = %s"),
dwErrCode,
Msg);
LogEvent(errMsg);
::CloseServiceHandle(hService);
::CloseServiceHandle(hScm);
return FALSE;
}*/
::CloseServiceHandle(hService);
::CloseServiceHandle(hScm);
return TRUE;
}
BOOL Uninstall()
{
hScm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
hService = OpenService(hScm, szServiceName, SERVICE_STOP | DELETE);
ControlService(hService, SERVICE_CONTROL_STOP, &status);
DeleteService(hService);
::CloseServiceHandle(hService);
::CloseServiceHandle(hScm);
return TRUE;
}
void WINAPI ServiceMain(DWORD argc, LPTSTR *argv)
{
//Register the control requeset handler
hServiceStatus = RegisterServiceCtrlHandler(szServiceName, ServiceStrl);
if (hServiceStatus == (SERVICE_STATUS_HANDLE)0) {
LogEvent(_T("Handler not installed"));
return ;
}
status.dwServiceType = SERVICE_WIN32;
status.dwCurrentState = SERVICE_START_PENDING;
status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
status.dwWin32ExitCode = 0;
status.dwServiceSpecificExitCode = 0;
status.dwCheckPoint = 0;
status.dwWaitHint = 0;
SetServiceStatus(hServiceStatus, &status);
//LogEvent(_T("Start MySelf Server "));
status.dwServiceType = SERVICE_WIN32;
status.dwCurrentState = SERVICE_RUNNING;
status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
status.dwWin32ExitCode = 0;
status.dwServiceSpecificExitCode = 0;
status.dwCheckPoint = 0;
status.dwWaitHint = 0;
SetServiceStatus(hServiceStatus, &status);
LogEvent(_T("ServiceMain End"));
}
/*****************.Cpp文件 End*******************************/
1. 注册service程序到系统服务管理器函数Install的实现,主要是以下两个api的调用。
OpenSCManager
CreateService
2. 在window application的入口函数中实现StartServiceCtrlDispatcher的调用。
如果是利用我给的文件则只要在_tWinMain 中追加以下下内容就可以
/***************************Start************************/
TCHAR* lpCmdLine = GetCommandLine();
TCHAR* pParam = _tcschr(lpCmdLine , ' ');
if (pParam != NULL)
{
pParam++;
}
InitService(pParam);
return 0;
/***************************End************************/
InitService实际上就是执行以下部分内容:
SERVICE_TABLE_ENTRY st[] =
{
{
szServiceName /*你的服务名称,和CreateService中的服务名称应该一致*/,
(LPSERVICE_MAIN_FUNCTION)ServiceMain /*ServiceMain 是你的service入口函数*/
} , {
NULL, NULL
}
};
if (!::StartServiceCtrlDispatcher(st))
{
//Error
}
3. 第二步用到的service入口函数ServiceMain的实现。
ServiceMain的原型:
void WINAPI ServiceMain(DWORD argc, LPTSTR *argv);
所有以上三步追加好以后就可以进行service程序的追加,启动了。
步骤1, 启动程序,执行第一步的Install,这时候就可以在service窗体中看到你追加的服务名称【应该是你设定的服务名称】
步骤2.启动或停止你的服务。
手动操作方法: window键 + R 启动 运行对话框,输入 services.msc 启动服务管理,查找你的
服务,选中并点右键选择 开始/停止。
代码事项:执行StartService,具体看cpp文件的注释部分。
其他:可以追加你要执行的相应操作,也可以添加卸载操作。查看Uninstall函数。
*通过以上操作和以下文件的应用,执行生成的文件
参数说明:
exe文件 /install 加载自己的service到服务管理列表中
exe文件 /uninstall 卸载加载的程序
以上是实现的简单说明,看实例可以更好的理解。
以下是头文件和实现文件的全部内容,文件名称是:CommFile
/*****************.h文件 Start*******************************/
#ifndef COMM_FILE_
#define COMM_FILE_
void Init();
BOOL IsInstalled();
BOOL Install();
BOOL Uninstall();
void LogEvent(LPCTSTR pszFormat, ...);
void WINAPI ServiceMain(DWORD argc, LPTSTR *argv);
void WINAPI ServiceStrl(DWORD dwOpcode) ;
void FormatMsg(DWORD errCode, TCHAR Msg[]);
static TCHAR szServiceName[] = _T("Temp3");
static BOOL bInstall;
static SERVICE_STATUS_HANDLE hServiceStatus;
static SERVICE_STATUS status;
static DWORD dwThreadID;
static SC_HANDLE hScm ;
static SC_HANDLE hService ;
static TCHAR szFilePath[MAX_PATH];
#define MSG_LEN 1024
#define InitService(lpCmdLine) /
{ /
Init(); /
dwThreadID = ::GetCurrentThreadId(); /
SERVICE_TABLE_ENTRY st[] = /
{ /
{ /
szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain /
} , { /
NULL, NULL /
} /
}; /
if (wcsicmp(lpCmdLine, _T("/install")) == 0) { /
if(Install()) { /
LogEvent(_T("Install Success!")); /
} else { /
LogEvent(_T("Install Failed!")); /
}; /
} else if (wcsicmp(lpCmdLine, _T("/uninstall")) == 0) { /
if(Uninstall()) { /
LogEvent(_T("Uninstall Success!")); /
} else { /
LogEvent(_T("Uninstall Failed!")); /
}; /
} else { /
LogEvent(_T("StartServiceCtrlDispatcher Start")); /
if (!::StartServiceCtrlDispatcher(st)) /
{ /
DWORD errCode = GetLastError(); /
TCHAR tchrTemp[MSG_LEN]; /
TCHAR errMsg[MSG_LEN]; /
FormatMsg(errCode, tchrTemp); /
wsprintf(errMsg, _T("Code = %d ErrorMessage = %s"), errCode, tchrTemp); /
LogEvent(errMsg); /
} /
} /
}
#endif
/*****************.h文件 End*******************************/
/*****************.Cpp文件 Start*******************************/
#include "stdafx.h"
#include "stdio.h"
#include "CommFile.h"
#include "tchar.h"
void LogEvent(LPCTSTR pszFormat, ...)
{
SYSTEMTIME sysTem;
//GetSystemTime(&sysTem);
GetLocalTime(&sysTem);
char chrMultl[MSG_LEN];
BOOL bFlg;
LPSTR ptcsDot = NULL;
char logFile[MAX_PATH];
memset(logFile, 0, MAX_PATH);
WideCharToMultiByte(CP_ACP, NULL, pszFormat, wcslen(pszFormat) * sizeof(wchar_t) , chrMultl, MSG_LEN, "", &bFlg);
WideCharToMultiByte(CP_ACP, NULL, szFilePath, MAX_PATH, logFile, MAX_PATH, "", &bFlg);
ptcsDot = strrchr(logFile, '.');
*ptcsDot = 0;
strcat(logFile, ".log");
FILE* hfile = fopen(logFile, "a+");
if (hfile != NULL) {
char chrMsg[MSG_LEN];
memset(chrMsg, 0, MSG_LEN);
sprintf(chrMsg, "%04d/02%02d/%02d %02d:%02d:%02d-%03d %s",
sysTem.wYear,
sysTem.wMonth,
sysTem.wDay,
sysTem.wHour,
sysTem.wMinute,
sysTem.wSecond,
sysTem.wMilliseconds,
chrMultl);
fprintf(hfile, "%s/n", chrMsg);
fclose(hfile);
}
}
void FormatMsg(DWORD errCode, TCHAR Msg[])
{
LPVOID lpMsgBuf;
TCHAR tchrTemp_utf8[256];
memset(Msg, 0, sizeof(Msg));
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, errCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL);
lstrcat(Msg, (TCHAR*)lpMsgBuf);
}
void WINAPI ServiceStrl(DWORD dwOpcode)
{
LogEvent(_T("ServiceStrl Start"));
DWORD Opcode = dwOpcode;
switch(Opcode)
{
case SERVICE_CONTROL_PAUSE:
LogEvent(_T("SERVICE_CONTROL_PAUSE"));
// Do whatever it takes to pause here.
status.dwCurrentState = SERVICE_PAUSED;
break;
case SERVICE_CONTROL_CONTINUE:
LogEvent(_T("SERVICE_CONTROL_CONTINUE"));
// Do whatever it takes to continue here.
status.dwCurrentState = SERVICE_RUNNING;
break;
case SERVICE_CONTROL_STOP:
LogEvent(_T("SERVICE_CONTROL_STOP"));
// Do whatever it takes to stop here.
status.dwWin32ExitCode = 0;
status.dwCurrentState = SERVICE_STOPPED;
status.dwCheckPoint = 0;
status.dwWaitHint = 0;
if (!SetServiceStatus (hServiceStatus, &status))
{
LogEvent(_T("SetServiceStatus Error[SERVICE_CONTROL_STOP]"));
}
case SERVICE_CONTROL_INTERROGATE:
LogEvent(_T("SERVICE_CONTROL_INTERROGATE"));
// Fall through to send current status.
return ;
break;
default:
// LogEvent(_T("default"));
return;
break;
}
// Send current status.
if (!SetServiceStatus(hServiceStatus, &status))
{
LogEvent(_T("SetServiceStatus Error"));
}
LogEvent(_T("ServiceStrl End"));
return;
}
void Init() {
hServiceStatus = NULL;
status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
status.dwCurrentState = SERVICE_START_PENDING;
status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
status.dwWin32ExitCode = 0;
status.dwServiceSpecificExitCode = 0;
status.dwCheckPoint = 0;
status.dwWaitHint = 0;
memset(szFilePath, 0, sizeof(szFilePath));
GetModuleFileName(NULL, szFilePath, sizeof(szFilePath));
}
BOOL Install() {
hScm = OpenSCManager(NULL,
NULL,
SC_MANAGER_ALL_ACCESS);
//create server
hService = ::CreateService(
hScm,
szServiceName,
szServiceName,
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START,
SERVICE_ERROR_NORMAL,
szFilePath,
NULL,
NULL,
NULL,
NULL,
NULL);
wchar_t szPath[1][MAX_PATH];
lstrcpy(szPath[0], szFilePath);
/*if(StartService(hService, 0, NULL) == FALSE) {
LogEvent(_T("StartService Err"));
TCHAR Msg[MSG_LEN];
TCHAR errMsg[MSG_LEN];
DWORD dwErrCode = GetLastError();
FormatMsg(dwErrCode, Msg);
wsprintf(errMsg, _T("Code = %d ErrorMsg = %s"),
dwErrCode,
Msg);
LogEvent(errMsg);
::CloseServiceHandle(hService);
::CloseServiceHandle(hScm);
return FALSE;
}*/
::CloseServiceHandle(hService);
::CloseServiceHandle(hScm);
return TRUE;
}
BOOL Uninstall()
{
hScm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
hService = OpenService(hScm, szServiceName, SERVICE_STOP | DELETE);
ControlService(hService, SERVICE_CONTROL_STOP, &status);
DeleteService(hService);
::CloseServiceHandle(hService);
::CloseServiceHandle(hScm);
return TRUE;
}
void WINAPI ServiceMain(DWORD argc, LPTSTR *argv)
{
//Register the control requeset handler
hServiceStatus = RegisterServiceCtrlHandler(szServiceName, ServiceStrl);
if (hServiceStatus == (SERVICE_STATUS_HANDLE)0) {
LogEvent(_T("Handler not installed"));
return ;
}
status.dwServiceType = SERVICE_WIN32;
status.dwCurrentState = SERVICE_START_PENDING;
status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
status.dwWin32ExitCode = 0;
status.dwServiceSpecificExitCode = 0;
status.dwCheckPoint = 0;
status.dwWaitHint = 0;
SetServiceStatus(hServiceStatus, &status);
//LogEvent(_T("Start MySelf Server "));
status.dwServiceType = SERVICE_WIN32;
status.dwCurrentState = SERVICE_RUNNING;
status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
status.dwWin32ExitCode = 0;
status.dwServiceSpecificExitCode = 0;
status.dwCheckPoint = 0;
status.dwWaitHint = 0;
SetServiceStatus(hServiceStatus, &status);
LogEvent(_T("ServiceMain End"));
}
/*****************.Cpp文件 End*******************************/
相关文章推荐
- 1,windows系统中创建一个node命令行程序、2,node标准工程目录
- VC2010 编写windows service 服务程序
- VC 创建Windows服务程序2
- 用vc6写windows service程序
- VC2008中编写Windows服务(Windows Service)程序
- .net Windows服务程序和安装程序制作图解 及 VS 2010创建、安装、调试 windows服务(windows service)
- 通过Windows Service启动外部程序
- VS2010 创建 windows service 程序
- 通过Windows Service启动外部程序
- VC 创建Windows服务程序2
- VC++创建一个Windows窗口程序
- 出现“无法通过windows installer服务安装此安装程序包。您必须安装带有更新版本Windows Installer服务的Windows Service Pack”提示如何解决?
- C#中级-通过注册表读取Windows Service程序执行路径
- vs2013创建、安装、调试Windows Service程序
- 用 vs2013 创建 windows service 程序
- 创建一个Windows Service 程序
- VC创建工程时,不能与Winodows系统关键程序同名
- VC 创建Windows服务程序
- VC编程进行windows NT 服务程序的创建,删除,启动,停止 【NT Service编程】
- C#Windows Service程序的创建安装与卸载