📄 ntservice.cpp
字号:
ps[2] = pszS3;
int iStr = 0;
for (int i = 0; i < 3; i++) {
if (ps[i] != NULL) iStr++;
}
// Check the event source has been registered and if
// not then register it now
if (!m_hEventSource) {
m_hEventSource = ::RegisterEventSource(NULL, // local machine
m_szServiceName); // source name
}
if (m_hEventSource) {
::ReportEvent(m_hEventSource,
wType,
0,
dwID,
NULL, // sid
iStr,
0,
ps,
NULL);
}
}
//////////////////////////////////////////////////////////////////////////////////////////////
// Service startup and registration
BOOL CNTService::StartService()
{
SERVICE_TABLE_ENTRY st[] = {
{m_szServiceName, ServiceMain},
{NULL, NULL}
};
DebugMsg("Calling StartServiceCtrlDispatcher()");
BOOL b = ::StartServiceCtrlDispatcher(st);
DebugMsg("Returned from StartServiceCtrlDispatcher()");
return b;
}
// static member function (callback)
void CNTService::ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv)
{
// Get a pointer to the C++ object
CNTService* pService = m_pThis;
pService->DebugMsg("Entering CNTService::ServiceMain()");
// Register the control request handler
pService->m_Status.dwCurrentState = SERVICE_START_PENDING;
pService->m_hServiceStatus = RegisterServiceCtrlHandler(pService->m_szServiceName,
Handler);
if (pService->m_hServiceStatus == NULL) {
pService->LogEvent(EVENTLOG_ERROR_TYPE, EVMSG_CTRLHANDLERNOTINSTALLED);
return;
}
// Start the initialisation
if (pService->Initialize()) {
// Do the real work.
// When the Run function returns, the service has stopped.
pService->m_bIsRunning = TRUE;
pService->m_Status.dwWin32ExitCode = 0;
pService->m_Status.dwCheckPoint = 0;
pService->m_Status.dwWaitHint = 0;
pService->Run();
}
// Tell the service manager we are stopped
pService->SetStatus(SERVICE_STOPPED);
pService->DebugMsg("Leaving CNTService::ServiceMain()");
}
///////////////////////////////////////////////////////////////////////////////////////////
// status functions
void CNTService::SetStatus(DWORD dwState)
{
DebugMsg("CNTService::SetStatus(%lu, %lu)", m_hServiceStatus, dwState);
m_Status.dwCurrentState = dwState;
::SetServiceStatus(m_hServiceStatus, &m_Status);
}
///////////////////////////////////////////////////////////////////////////////////////////
// Service initialization
BOOL CNTService::Initialize()
{
DebugMsg("Entering CNTService::Initialize()");
// Start the initialization
SetStatus(SERVICE_START_PENDING);
// Perform the actual initialization
BOOL bResult = OnInit();
// Set final state
m_Status.dwWin32ExitCode = GetLastError();
m_Status.dwCheckPoint = 0;
m_Status.dwWaitHint = 0;
if (!bResult) {
LogEvent(EVENTLOG_ERROR_TYPE, EVMSG_FAILEDINIT);
SetStatus(SERVICE_STOPPED);
return FALSE;
}
LogEvent(EVENTLOG_INFORMATION_TYPE, EVMSG_STARTED);
SetStatus(SERVICE_RUNNING);
DebugMsg("Leaving CNTService::Initialize()");
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////////////////////
// main function to do the real work of the service
// This function performs the main work of the service.
// When this function returns the service has stopped.
void CNTService::Run()
{
DebugMsg("Entering CNTService::Run()");
while (m_bIsRunning) {
DebugMsg("Sleeping...");
Sleep(5000);
}
// nothing more to do
DebugMsg("Leaving CNTService::Run()");
}
//////////////////////////////////////////////////////////////////////////////////////
// Control request handlers
// static member function (callback) to handle commands from the
// service control manager
void CNTService::Handler(DWORD dwOpcode)
{
// Get a pointer to the object
CNTService* pService = m_pThis;
pService->DebugMsg("CNTService::Handler(%lu)", dwOpcode);
switch (dwOpcode) {
case SERVICE_CONTROL_STOP: // 1
pService->SetStatus(SERVICE_STOP_PENDING);
pService->OnStop();
pService->m_bIsRunning = FALSE;
pService->LogEvent(EVENTLOG_INFORMATION_TYPE, EVMSG_STOPPED);
break;
case SERVICE_CONTROL_PAUSE: // 2
pService->OnPause();
break;
case SERVICE_CONTROL_CONTINUE: // 3
pService->OnContinue();
break;
case SERVICE_CONTROL_INTERROGATE: // 4
pService->OnInterrogate();
break;
case SERVICE_CONTROL_SHUTDOWN: // 5
pService->OnShutdown();
break;
default:
if (dwOpcode >= SERVICE_CONTROL_USER) {
if (!pService->OnUserControl(dwOpcode)) {
pService->LogEvent(EVENTLOG_ERROR_TYPE, EVMSG_BADREQUEST);
}
} else {
pService->LogEvent(EVENTLOG_ERROR_TYPE, EVMSG_BADREQUEST);
}
break;
}
// Report current status
pService->DebugMsg("Updating status (%lu, %lu)",
pService->m_hServiceStatus,
pService->m_Status.dwCurrentState);
::SetServiceStatus(pService->m_hServiceStatus, &pService->m_Status);
}
// Called when the service is first initialized
BOOL CNTService::OnInit()
{
DebugMsg("CNTService::OnInit()");
return TRUE;
}
// Called when the service control manager wants to stop the service
void CNTService::OnStop()
{
if(hServerStopEvent)
{
SetEvent(hServerStopEvent);
AddLog("发送消息,准备停止服务%s.\n",szSubServiceName);
}
}
// called when the service is interrogated
void CNTService::OnInterrogate()
{
DebugMsg("CNTService::OnInterrogate()");
}
// called when the service is paused
void CNTService::OnPause()
{
DebugMsg("CNTService::OnPause()");
}
// called when the service is continued
void CNTService::OnContinue()
{
DebugMsg("CNTService::OnContinue()");
}
// called when the service is shut down
void CNTService::OnShutdown()
{
DebugMsg("CNTService::OnShutdown()");
}
// called when the service gets a user control message
BOOL CNTService::OnUserControl(DWORD dwOpcode)
{
DebugMsg("CNTService::OnUserControl(%8.8lXH)", dwOpcode);
return FALSE; // say not handled
}
////////////////////////////////////////////////////////////////////////////////////////////
// Debugging support
void CNTService::DebugMsg(const char* pszFormat, ...)
{
char buf[1024];
sprintf(buf, "[%s](%lu): ", m_szServiceName, GetCurrentThreadId());
va_list arglist;
va_start(arglist, pszFormat);
vsprintf(&buf[strlen(buf)], pszFormat, arglist);
va_end(arglist);
strcat(buf, "\n");
OutputDebugString(buf);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -