📄 main.c
字号:
#include "main.h"
/****************************************************************************************/
#define SERVICENAME "TimeServer"
#define SHOWNAME "TimeServer"
/****************************************************************************************/
volatile BOOL g_isStop;
SERVICE_STATUS_HANDLE g_hServiceStatus;
SERVICE_STATUS g_ServiceStatus;
/****************************************************************************************/
VOID WINAPI TimeServerNotifyProc( DWORD dwControl )
{
switch ( dwControl )
{
case SERVICE_CONTROL_STOP:
case SERVICE_CONTROL_SHUTDOWN:
g_isStop = TRUE;
break;
default:
SetServiceStatus( g_hServiceStatus, &g_ServiceStatus);
break;
}
}
/****************************************************************************************/
VOID WINAPI MainThread( DWORD dwArgc, LPTSTR *lpszArgv )
{
// HANDLE hSyncThread;
// DWORD dwThreadID;
UpdateLogFile( "Enter MainThread" );
//#ifndef _DEBUG
g_hServiceStatus = RegisterServiceCtrlHandler( SERVICENAME, TimeServerNotifyProc );
if( !g_hServiceStatus )
return;
memset( &g_ServiceStatus , 0 , sizeof( g_ServiceStatus ) );
g_ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
g_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
g_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
g_ServiceStatus.dwWin32ExitCode = NO_ERROR;
SetServiceStatus( g_hServiceStatus , &g_ServiceStatus );
//#endif
//下面是工作的主体
if( InitServer( ) )
{
g_isStop = FALSE;
while( !g_isStop && ServerHandler( ) );
}
ReleaseServer ();
//#ifndef _DEBUG
g_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus( g_hServiceStatus , &g_ServiceStatus );
//#endif
UpdateLogFile( "Exit MainThread" );
}
/****************************************************************************************/
/****************************************************************************************/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
const SERVICE_TABLE_ENTRY aServiceEntries[] =
{
{ SERVICENAME, MainThread },
{ NULL, NULL }
};
SC_HANDLE hSCManager;
SC_HANDLE hService;
SERVICE_STATUS ServiceStatus;
TCHAR aszBinaryPathName[MAX_PATH];
OSVERSIONINFO VerInfo;
VerInfo.dwOSVersionInfoSize = sizeof VerInfo;
GetVersionEx (&VerInfo);
if (VerInfo.dwMajorVersion <= 4)
{
MessageBox (NULL, "错误的Windows版本,此程序只能在Windows 2000或Windows XP中运行!",
"STOP", MB_OK|MB_ICONSTOP);
return 0;
}
GetVersionEx ((OSVERSIONINFO*)&VerInfo);
if (stricmp (lpCmdLine, "install") == 0)
{
hSCManager = OpenSCManager (NULL, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS);
if (hSCManager)
{
GetModuleFileName (hInstance, aszBinaryPathName, sizeof aszBinaryPathName);
strcat (aszBinaryPathName, " daemon");
hService = CreateService (hSCManager, SERVICENAME, SHOWNAME,
SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
aszBinaryPathName, NULL, NULL, NULL, NULL, NULL);
if (hService)
{
MessageBox (NULL, "Create service successful!", "TimeServer",
MB_OK|MB_ICONINFORMATION);
//if (StartService (hService, 0, NULL))
//MessageBox (NULL, "Start service successful!", "TimeServer",
//MB_OK|MB_ICONINFORMATION);
CloseServiceHandle (hService);
}
CloseServiceHandle (hSCManager);
}
}
else if (stricmp (lpCmdLine, "uninstall") == 0)
{
hSCManager = OpenSCManager (NULL, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS);
if (hSCManager)
{
hService = OpenService (hSCManager, SERVICENAME, SERVICE_ALL_ACCESS);
if (hService)
{
if (DeleteService (hService))
MessageBox (NULL, "Delete service successful!", "TimeServer",
MB_OK|MB_ICONINFORMATION);
CloseServiceHandle (hService);
}
CloseServiceHandle (hSCManager);
}
}
else if (stricmp (lpCmdLine, "start") == 0)
{
hSCManager = OpenSCManager (NULL, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS);
if (hSCManager)
{
hService = OpenService (hSCManager, SERVICENAME, SERVICE_ALL_ACCESS);
if (hService)
{
if (StartService( hService , 0, NULL))
MessageBox (NULL, "Start service successful!", "TimeServer",
MB_OK|MB_ICONINFORMATION);
CloseServiceHandle (hService);
}
CloseServiceHandle (hSCManager);
}
}
else if (stricmp (lpCmdLine, "stop") == 0)
{
hSCManager = OpenSCManager (NULL, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS);
if (hSCManager)
{
hService = OpenService (hSCManager, SERVICENAME, SERVICE_ALL_ACCESS);
if (hService)
{
if (ControlService (hService, SERVICE_CONTROL_STOP, &ServiceStatus))
MessageBox (NULL, "Stop service successful!", "TimeServer",
MB_OK|MB_ICONINFORMATION);
CloseServiceHandle (hService);
}
CloseServiceHandle (hSCManager);
}
}
else if (stricmp (lpCmdLine, "daemon") == 0)
StartServiceCtrlDispatcher (aServiceEntries);
else
MessageBox (NULL, "这是一个服务程序,请控制面板中启动!", "STOP", MB_OK|MB_ICONSTOP);
return 0;
}
/****************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -