昨天一同学入职考核,需要用C/C++写一个服务程序,从XML读取配置,定期运行指定程序/脚本/命令……
同学无解。。向我求助,然后我也没写过windows服务程序,于是琢磨了一下,弄出一个很简单的DEMO。
先从网上掏了一个VC6的程序叫 memorystatus ,其功能主要为启动一个服务定期向文件内写入当前剩余内存。
然后看了一下windows自带一个sc.exe 用于管理服务。
再掏了个轻量级的XML解析器“Markup”,貌似是基于MFC的,没仔细看。。直接include用。
于是基于这三个玩意改改。。 就成这样了……
#include "Markup.h"
#include <stdio.h>
#include <string>
using namespace std;
#define SLEEP_TIME 5000 //间隔时间
#define LOGFILE "C:\\test\\log.txt" //日志文件路径
#define XMLFILE "C:\\test\\test.xml" //xml文件路径
SERVICE_STATUS ServiceStatus;
SERVICE_STATUS_HANDLE hStatus;
void ServiceMain(int argc, char** argv);
void ControlHandler(DWORD request);
int InitService();
int WriteToLog(const char* str);
//读XML文件
string LoadXMLFile()
{
//具体如果需要修改的话,到网上搜CMarkup类的用法
string filepath;
CMarkup xml;
xml.Load(XMLFILE);
if(xml.FindElem("PATH"))
{
filepath = xml.GetData();
}
WriteToLog(filepath.c_str());
return filepath;
}
//写日志文件
int WriteToLog(const char* str)
{
FILE* log;
log = fopen(LOGFILE, "a+");
if (log == NULL){
return -1;
}
fprintf(log, "%s\n", str);
fclose(log);
return 0;
}
//执行应用程序
void Run()
{
string filepath = LoadXMLFile();
WinExec(filepath.c_str(),SW_HIDE);
}
int InitService()
{
int result;
result = WriteToLog("Monitoring started.");
return(result);
}
// Control Handler
void ControlHandler(DWORD request)
{
switch(request)
{
case SERVICE_CONTROL_STOP:
WriteToLog("Monitoring stopped.");
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus (hStatus, &ServiceStatus);
return;
case SERVICE_CONTROL_SHUTDOWN:
WriteToLog("Monitoring stopped.");
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus (hStatus, &ServiceStatus);
return;
default:
break;
}
// Report current status
SetServiceStatus (hStatus, &ServiceStatus);
return;
}
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);
// The worker loop of a service
while (ServiceStatus.dwCurrentState ==
SERVICE_RUNNING)
{
Run();//执行应用程序
Sleep(SLEEP_TIME);
}
return;
}
void main(int argc, char* 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 control dispatcher thread for our service
StartServiceCtrlDispatcher(ServiceTable);
}
test.xml这么写:
<PATH>C:\test\test.bat</PATH>
这里都是用的绝对定位,服务程序默认工作目录 windows/system32,然后看了一下。。没找到C/C++怎么找服务程序的启动目录。。只找到C#的方法。。懒得管他了。
分享到:
相关推荐
VC编写Windows服务程序.pdf
总的来说,通过学习和实践这个VC编写的Windows服务程序,你可以了解到Windows服务的架构、服务的创建与控制过程,以及如何在VC6环境中进行开发。这对于提升你的系统编程技能,特别是理解Windows操作系统底层机制,将...
使用VC编写Windows服务程序主要涉及以下几个步骤: 1. 创建项目:在VC环境中新建一个Win32 Console Application项目,选择“服务应用程序”模板。 2. 引入库:添加必要的库文件,如Advapi32.lib,这是Windows API的...
在本文中,我们将深入探讨如何使用Visual C++ (VC++) 编写Windows Service服务,并结合提供的源程序进行分析。Windows Service是一种特殊的后台应用程序,它在没有用户界面的情况下运行,通常用于执行系统级任务,如...
在本教程中,我们将探讨如何使用Visual C++(简称VC)来创建一个Windows服务程序。 首先,我们需要理解Windows服务的基本概念。服务具有独立于用户的启动、暂停、停止和自动恢复的能力,它们可以由系统自动启动,...
开发环境Windows XP,用VC++6.0,编写的Windows服务例子,用微软的ATL开发框架生成主体程序框架。在主程序里加了个定时器,每隔5秒往日志文件里添加一个记录。可以修改程序代码,轻松实现其他想要实现的功能。
在本文中,我们将深入探讨如何使用C/C++在Windows平台上创建服务程序,特别是基于Visual C++(VC)的实现。Windows服务是一种特殊的后台应用程序,它可以在用户登录或未登录时运行,提供持续的系统功能。这里提供的...
《VC6.0实现Windows计算器程序详解》 在软件开发领域,模拟常见应用程序是一种常见的学习实践方式,这有助于深入理解编程语言和操作系统的工作原理。本文将详细探讨如何使用微软的Visual C++ 6.0(简称VC6.0)开发...
《使用VC编写练习打字程序的深度解析》 在信息技术高速发展的今天,打字技能已成为人们日常生活和工作中不可或缺的一部分。为了提升打字效率,各种打字练习软件应运而生。其中,用VC(Visual C++)编写的练习打字...
【标题】"VC编写的代理服务器程序"是一个基于Visual C++(VC)开发的网络应用程序,主要用于实现代理服务器的功能。代理服务器在计算机网络中扮演着重要角色,它充当客户端与目标服务器之间的中介,允许用户通过它来...
学习如何编写Windows Service 服务程序的很好例子,可以直接在例子的基础上修改并编译运行,实用性很强. 运行环境: Windows NT/2000/XP 例子程序示例了如何在Windows NT/2000/XP系统中create, start, stop, 和 delete ...
Windows 服务被设计用于需要在后台运行的应用程序以及实现没有用户交互的任务。为了学习这种控制台应用程序的基础知识,C(不是C++)是最佳选择。...最后,你可以用所学知识编写自己的 Windows 服务。
总之,通过学习和实践这个“vc编写的一个模拟时钟的程序”,你可以深入了解VC开发环境,掌握Windows API和MFC库的使用,以及图形用户界面的设计与事件驱动编程。这个项目不仅可以帮助你提升编程技能,还能培养解决...
MAPI(Messaging Application Programming Interface)是一种应用程序编程接口,用于在 Windows 平台上编写电子邮件客户端程序。MAPI 有三种形式:SMAPI、Simple MAPI 和完整的 MAPI。其中,SMAPI 是最基本的电子...
【VC编写的计算程序】 本程序是利用Microsoft Visual C++(简称VC)开发的一个计算剂量的应用。VC是一款强大的集成开发环境,它集成了C++语言的编译、调试、资源编辑等多种功能,使得开发者能够方便地创建Windows...
在本文中,我们将深入探讨如何使用Visual C++ 6.0(简称VC6.0)开发Windows服务,并了解服务的安装和卸载过程。Windows服务是操作系统中的一个重要组成部分,它们通常在后台运行,独立于用户界面,用于执行特定的...
标题中的"C语言在vc下编写的Windows窗口小程序 小小计算器"揭示了这是一个使用C语言编程,通过Visual C++(通常简称为VC)环境开发的Windows应用程序。这个小程序是一个简单的计算器,展示了如何在Windows操作系统...
【标题】: "用VC编写的摄像头程序" 这个标题揭示了我们即将探讨的核心内容,即使用Microsoft Visual C++(VC)开发的用于访问和操作摄像头的应用程序。VC是微软提供的一种集成开发环境,特别适合创建Windows平台上的...
首先,我们要了解的是Windows编程的基础,包括Win32 API,这是微软为Windows操作系统提供的应用程序接口,用于开发原生的Windows程序。VC6.0主要就是基于这个API进行开发的,它提供了丰富的函数库和工具,帮助开发者...