windows 7 后台服务程序开发
2012-04-19 19:33
405 查看
一个小型电脑的项目,需要开发一个windows7下后台运行的服务程序,参考网上一些资料后。试着写了一个很简单的服务,编译后能正常运行并记录相关信息。记录代码如下,方便以后参考:
// service_test.cpp : Defines the entry point for the console application. #include "stdafx.h" #include <windows.h> #include <iostream> #include <stdio.h> BOOL IsInstalled(); BOOL Install(); BOOL Uninstall(); void LogEvent(LPCTSTR pszFormat, ...); void WINAPI ServiceStrl(DWORD dwOpcode); TCHAR szServiceName[] = _T("ServiceTest"); BOOL bInstall; SERVICE_STATUS_HANDLE hServiceStatus; SERVICE_STATUS status; DWORD dwThreadID; SERVICE_STATUS ServiceStatus; SERVICE_STATUS_HANDLE hStatus; void ServiceMain(int argc, char** argv); void ControlHandler(DWORD request); int InitService(); #define SLEEP_TIME 5000 #define LOGFILE "C:\\MyServices\\memstatus.txt" int _tmain(int argc, _TCHAR* argv[]) { SERVICE_TABLE_ENTRY ServiceTable[2]; ServiceTable[0].lpServiceName = "MemoryStatus"; ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain; ServiceTable[1].lpServiceName = NULL; ServiceTable[1].lpServiceProc = NULL; // start the service control dispatcher StartServiceCtrlDispatcher(ServiceTable); } int WriteToLog(char* str) { FILE* log; log = fopen(LOGFILE, "a+"); if (log == NULL) return -1; fprintf(log, "%s\n", str); fclose(log); return 0; } // initialize the service int InitService() { int result; result = WriteToLog("This is test service routine. Memory monitoring started."); return(result); } void ServiceMain(int argc, char** argv) { int error; ServiceStatus.dwServiceType = SERVICE_WIN32; ServiceStatus.dwCurrentState = SERVICE_START_PENDING; ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN; ServiceStatus.dwWin32ExitCode = 0; ServiceStatus.dwServiceSpecificExitCode = 0; ServiceStatus.dwCheckPoint = 0; ServiceStatus.dwWaitHint = 0; hStatus = RegisterServiceCtrlHandler( "MemoryStatus", (LPHANDLER_FUNCTION)ControlHandler); if (hStatus == (SERVICE_STATUS_HANDLE)0) { // Registering Control Handler failed return; } // Initialize Service error = InitService(); if (error) { // Initialization failed ServiceStatus.dwCurrentState = SERVICE_STOPPED; ServiceStatus.dwWin32ExitCode = -1; SetServiceStatus(hStatus, &ServiceStatus); return; } // We report the running status to SCM. ServiceStatus.dwCurrentState = SERVICE_RUNNING; SetServiceStatus (hStatus, &ServiceStatus); MEMORYSTATUS memory; // The worker loop of a service while (ServiceStatus.dwCurrentState == SERVICE_RUNNING) { char buffer[16]; GlobalMemoryStatus(&memory); sprintf(buffer, "%d", memory.dwAvailPhys); int result = WriteToLog(buffer); if (result) { ServiceStatus.dwCurrentState = SERVICE_STOPPED; ServiceStatus.dwWin32ExitCode = -1; SetServiceStatus(hStatus, &ServiceStatus); return; } Sleep(SLEEP_TIME); } return; } void ControlHandler(DWORD request) { switch(request) { case SERVICE_CONTROL_STOP: WriteToLog("This is test service routine. Memory monitoring stopped."); ServiceStatus.dwWin32ExitCode = 0; ServiceStatus.dwCurrentState = SERVICE_STOPPED; SetServiceStatus (hStatus, &ServiceStatus); return; case SERVICE_CONTROL_SHUTDOWN: WriteToLog("This is test service routine. Memory monitoring stopped."); ServiceStatus.dwWin32ExitCode = 0; ServiceStatus.dwCurrentState = SERVICE_STOPPED; SetServiceStatus (hStatus, &ServiceStatus); return; default: break; } // Report current status SetServiceStatus (hStatus, &ServiceStatus); return; }
相关文章推荐
- 本地打印后台处理程序服务没有运行和windows无法连接到打印机拒绝访问
- WindowsService服务程序开发笔记
- [开发笔记]-WindowsService服务程序开发
- [导入]C#开发Windows服务程序指南.
- C++后台服务程序开发模式
- C++后台服务程序开发模式
- c#开发Windows服务程序及部署
- .Net下的Windows服务程序开发指南.
- 解决WINDOWS无法打开“添加打印机”,本地后台打印程序服务没有运行
- VS2005开发的Windows服务程序实例
- Delphi开发Windows服务程序
- Delphi开发的后台服务程序也可以7x24小时长时间稳定运行
- [转].Net下的Windows服务程序开发指南.
- C#Windows服务程序开发实例浅析
- .Net下的Windows服务程序开发指南.
- .Net下的Windows服务程序开发指南.
- 编写一个带管理界面(对话框)的windows后台服务程序
- C#Windows服务程序开发实例浅析
- 后台服务程序开发(完整版)
- c#开发Windows服务程序指南