您的位置:首页 > 其它

Windows下编写系统服务程序的实例

2014-07-23 10:35 477 查看
Windows下编写系统服务程序实例,在 VS2008 下编译测试通过。

代码如下:

#include <windows.h>
#include <stdio.h>
#include <time.h>

#define SLEEP_TIME 3000
#define LOGFILE "E:\\test.txt"
#define SERVICENAME "testNTService"

SERVICE_STATUS g_ServiceStatus;
SERVICE_STATUS_HANDLE g_hStatus;

int WriteLog(const char* str)
{
FILE* log;

log = fopen(LOGFILE, "a+");

if (log == NULL)
return -1;

fprintf(log, "%s\n", str);

fclose(log);

return 0;
}

void ControlHandler(DWORD request)
{
switch(request)
{
case SERVICE_CONTROL_PAUSE:
WriteLog("Pause.");
g_ServiceStatus.dwWin32ExitCode = 0;
g_ServiceStatus.dwCurrentState = SERVICE_PAUSED;
break;
case SERVICE_CONTROL_CONTINUE:
WriteLog("Continue.");
g_ServiceStatus.dwWin32ExitCode = 0;
g_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
break;
case SERVICE_CONTROL_STOP:
WriteLog("Stop.");
g_ServiceStatus.dwWin32ExitCode = 0;
g_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
break;
case SERVICE_CONTROL_SHUTDOWN:
WriteLog("Shutdown.");
g_ServiceStatus.dwWin32ExitCode = 0;
g_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
break;
default:
break;
}

SetServiceStatus (g_hStatus, &g_ServiceStatus);

return;
}

void ServiceMain(int argc, char** argv)
{
g_ServiceStatus.dwServiceType =    SERVICE_WIN32;
g_ServiceStatus.dwCurrentState =    SERVICE_START_PENDING;
g_ServiceStatus.dwControlsAccepted   =     SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE;
g_ServiceStatus.dwWin32ExitCode = 0;
g_ServiceStatus.dwServiceSpecificExitCode = 0;
g_ServiceStatus.dwCheckPoint = 0;
g_ServiceStatus.dwWaitHint = 0;

g_hStatus = RegisterServiceCtrlHandler(SERVICENAME, (LPHANDLER_FUNCTION)ControlHandler);
if (g_hStatus == (SERVICE_STATUS_HANDLE)0)
{
return;
}

g_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus (g_hStatus, &g_ServiceStatus);

char buf[256];
time_t ltime;

while(1)
{
if(g_ServiceStatus.dwCurrentState == SERVICE_RUNNING)
{

time( <ime );
ctime_s( buf, sizeof(buf), <ime );

if( WriteLog(buf) )
{
g_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
g_ServiceStatus.dwWin32ExitCode = -1;
SetServiceStatus(g_hStatus, &g_ServiceStatus);
return;
}
}else if(g_ServiceStatus.dwCurrentState != SERVICE_PAUSED)
{
break;
}

Sleep(SLEEP_TIME);
}

return;
}

int main()
{
SERVICE_TABLE_ENTRY ServiceTable[2];
ServiceTable[0].lpServiceName = SERVICENAME;
ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;

ServiceTable[1].lpServiceName = NULL;
ServiceTable[1].lpServiceProc = NULL;

StartServiceCtrlDispatcher(ServiceTable);

return 0;
}


编译出.exe文件后,用sc命令(参阅《在Windows系统下用命令把应用程序添加到系统服务》文章)把程序加入到服务中,然后就可以测试玩啦。

提示:如果编译时出现“无法从“const char [14]”转换为“LPWSTR””错误,打开工程的属性窗口,把 配置属性->常规->字符集 设置为“使用多字节字符集”后重新编译就好了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: