⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myservice.cpp

📁 本程序是实现中国移动中国联通的网关程序.代码比较完整.
💻 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 + -