📄 myservice.cpp
字号:
// myservice.cpp
#include "NTServApp.h"
#include "myservice.h"
CMyService::CMyService()
:CNTService(SZMAINSERVICENAME)
{
m_iStartParam = 0;
m_iIncParam = 1;
m_iState = m_iStartParam;
strcpy(m_szSubName,SZSUBSERVICENAME);
}
CMyService::CMyService(char* szName,char* szSubName)
:CNTService(szName)
{
m_iStartParam = 0;
m_iIncParam = 1;
m_iState = m_iStartParam;
strcpy(m_szSubName,szSubName);
}
BOOL CMyService::OnInit()
{
// Read the registry parameters
// Try opening the registry key:
// HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<AppName>\Parameters
HKEY hkey;
char szKey[1024];
strcpy(szKey, "SYSTEM\\CurrentControlSet\\Services\\");
strcat(szKey, m_szServiceName);
strcat(szKey, "\\Parameters");
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
szKey,
0,
KEY_QUERY_VALUE,
&hkey) == ERROR_SUCCESS) {
// Yes we are installed
DWORD dwType = 0;
DWORD dwSize = sizeof(m_iStartParam);
RegQueryValueEx(hkey,
"Start",
NULL,
&dwType,
(BYTE*)&m_iStartParam,
&dwSize);
dwSize = sizeof(m_iIncParam);
RegQueryValueEx(hkey,
"Inc",
NULL,
&dwType,
(BYTE*)&m_iIncParam,
&dwSize);
RegCloseKey(hkey);
}
// Set the initial state
m_iState = m_iStartParam;
return TRUE;
}
void CMyService::Run()
{
SC_HANDLE schService;
SC_HANDLE schSCManager;
SERVICE_STATUS ssStatus; // current status of the service
schSCManager = OpenSCManager(
NULL, // machine (NULL == local)
NULL, // database (NULL == default)
SC_MANAGER_ALL_ACCESS // access required
);
if(schSCManager)
{
schService = OpenService(schSCManager, TEXT(m_szSubName), SERVICE_ALL_ACCESS);
if(!schService)
{
AddLog("打开子服务%s失败.\n\t退出主服务%s.\n",
m_szSubName,m_szServiceName);
return;
}
}else
{
AddLog("打开服务管理器失败.\n\t退出主服务.\n");
return;
}
hServerStopEvent = CreateEvent(
NULL, // no security attributes
TRUE, // manual reset event
FALSE, // not-signalled
NULL); // no name
if ( hServerStopEvent == NULL)
goto cleanup;
AddLog("开始运行服务管理程序%s.\n",m_szServiceName);
while ( 1 )
{
switch(WaitForSingleObject(hServerStopEvent,3000))
{
case WAIT_FAILED:
case WAIT_TIMEOUT:
//check the status of the sub service
QueryServiceStatus(schService, &ssStatus);
if (ssStatus.dwCurrentState == SERVICE_STOPPED)
{
AddLog(TEXT("%s 停止.\n"),TEXT(m_szSubName));
AddLog(TEXT("重新启动 %s .\n"),TEXT(m_szSubName));
//rerun the child service
if(::StartService(schService,0,NULL))
{
while(QueryServiceStatus(schService, &ssStatus ) )
{
if(ssStatus.dwCurrentState==SERVICE_START_PENDING)
{
AddLog(TEXT(".\n"));
Sleep(500);
}
else break;
}
if ( ssStatus.dwCurrentState == SERVICE_RUNNING)
AddLog(TEXT("%s 重新启动.\n"), TEXT(m_szSubName) );
else
AddLog(TEXT("%s重新启动失败.\n"), TEXT(m_szSubName));
}//if control
else
{
AddLog("启动服务失败.\n");
}
}//if stoped
break;
case WAIT_OBJECT_0:
AddLog("响应消息,退出管理程序%s.\n",m_szServiceName);
goto cleanup;
break;
}
}
cleanup:
AddLog("退出服务管理程序%s.\n",m_szServiceName);
if (hServerStopEvent)CloseHandle(hServerStopEvent);
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
m_iState += m_iIncParam;
}
// Process user control requests
BOOL CMyService::OnUserControl(DWORD dwOpcode)
{
switch (dwOpcode) {
case SERVICE_CONTROL_USER + 0:
// Save the current status in the registry
SaveStatus();
return TRUE;
default:
break;
}
return FALSE; // say not handled
}
// Save the current status in the registry
void CMyService::SaveStatus()
{
DebugMsg("Saving current status");
// Try opening the registry key:
// HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<AppName>\...
HKEY hkey = NULL;
char szKey[1024];
strcpy(szKey, "SYSTEM\\CurrentControlSet\\Services\\");
strcat(szKey, m_szServiceName);
strcat(szKey, "\\Status");
DWORD dwDisp;
DWORD dwErr;
DebugMsg("Creating key: %s", szKey);
dwErr = RegCreateKeyEx( HKEY_LOCAL_MACHINE,
szKey,
0,
"",
REG_OPTION_NON_VOLATILE,
KEY_WRITE,
NULL,
&hkey,
&dwDisp);
if (dwErr != ERROR_SUCCESS) {
DebugMsg("Failed to create Status key (%lu)", dwErr);
return;
}
// Set the registry values
DebugMsg("Saving 'Current' as %ld", m_iState);
RegSetValueEx(hkey,
"Current",
0,
REG_DWORD,
(BYTE*)&m_iState,
sizeof(m_iState));
// Finished with key
RegCloseKey(hkey);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -