Windows下编写系统服务程序的实例
2014-07-23 10:35
477 查看
Windows下编写系统服务程序实例,在 VS2008 下编译测试通过。
代码如下:
编译出.exe文件后,用sc命令(参阅《在Windows系统下用命令把应用程序添加到系统服务》文章)把程序加入到服务中,然后就可以测试玩啦。
提示:如果编译时出现“无法从“const char [14]”转换为“LPWSTR””错误,打开工程的属性窗口,把 配置属性->常规->字符集 设置为“使用多字节字符集”后重新编译就好了。
代码如下:
#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””错误,打开工程的属性窗口,把 配置属性->常规->字符集 设置为“使用多字节字符集”后重新编译就好了。
相关文章推荐
- Delphi编写Windows系统服务程序【转帖】
- (02)C++ builder之WINDOWS系统服务编写与WINDOWS桌面程序调用
- Windows系统中使用C#编写蓝牙通信程序的简单实例
- 用 C 语言编写 Windows 服务程序的五个步骤
- 用C编写Windows服务程序的五个步骤
- 用C编写Windows服务程序的五个步骤
- windows系统服务程序的开发
- 用C语言编写Windows服务程序的五个步骤
- 用C语言编写Windows服务程序的五个步骤
- 使用Java Service Wrapper 把Java程序作为Windows系统服务
- WINDOWS后台服务程序编写
- C编写Windows服务程序详细介绍
- Windows环境下注册Java程序为系统服务
- 编写一个Windows服务程序,定时从数据库中拿出记录发送邮件
- (转)用C语言编写Windows服务程序的五个步骤
- [老文章转载]将Java程序变成Windows系统服务
- 用 C 语言编写 Windows 服务程序的五个步骤
- 编写有图形界面的 Windows 服务程序
- 用C语言编写Windows服务程序的五个步骤
- 使用Java Service Wrapper 把Java程序作为Windows系统服务