使用C语言编写windows服务一般框架

原文:使用C语言编写windows服务一般框架

   编写windows服务和编写windows应用程序一样,有一些回调函数必须填写且向windows 服务管理器(service manager)进行注册,否则会导致服务启动失败。因近期写个服务,其中遇到一些有问题,有部分内容想和大家分享一下,请大家指正。
        windows服务一般框架代码如下:

#include <Windows.h>
#include <tchar.h>

VOID WINAPI ServiceHandler(DWORD dwControl)

{

switch (dwControl)

{

case SERVICE_CONTROL_STOP:

{

ExitProcess(0);

}

break;

}

}

DWORD WINAPI ThreadFunc(PVOID pv)

{

Sleep(2*1000);

return TerminateProcess(GetCurrentProcess(),1);

}

VOID WINAPI ServiceMain(DWORD  dwNumServicesArgs,PSTR *ppcServiceArgVectors)

{

SERVICE_STATUS_HANDLE hService = NULL;

  //如果下面不初始化,导致service manager无法收到消息

SERVICE_STATUS SrvStatus = {0};

OutputDebugStringA("service main.....");

hService= RegisterServiceCtrlHandlerA("winservice",ServiceHandler);

SrvStatus.dwServiceType  = SERVICE_WIN32_OWN_PROCESS;

SrvStatus.dwCurrentState= SERVICE_RUNNING;

 //服务接受停止的控制,如果你不想让别人停止你的服务,下面这行代码可以删除

SrvStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP; 

SetServiceStatus(hService,&SrvStatus);

 //这句话也很重要,我刚开始就是没这句话,导致服务不能启动

CreateThread(0,0,ThreadFunc,0,0,0);//线程只是一个示例,2S后,服务启动后自动退出

return;

}

int _tmain(int argc, _TCHAR* argv[])

{

SERVICE_TABLE_ENTRYA scArrTable[] = 

{

{"winservice",ServiceMain},

{NULL,NULL}

};

StartServiceCtrlDispatcherA(scArrTable);

return 0;

}
以上实例,仅供参考。
大家可以将编译后的exe使用如下命令行进行服务的注册:
 sc create "windowsservice" binPath= "windowssrv.exe"           //“binPath=”这个等于符号后有个空格,否则无法注册服务,请将windowssrv.exe改为你自己EXE所在全路径。

时间: 2024-09-17 10:29:41

使用C语言编写windows服务一般框架的相关文章

C#编写Windows服务的基本过程

  编写Windows服务是一种比较高级的编程技术,内部使用了很多Windows操作系统的核心功能,但微软.NET框架已经很好的封装了这些技术细节,使得我们可以很方便的使用C#编写自己的Windows服务,其基本过程一般为 1.创建C#工程.创建一个EXE工程,可以是WinForm或者命令行格式的.添加对System.ServiceProcess.dll和System.Configuration.Install.dll的引用. 2. 创建服务类.新增一个类,该类型继承System.Service

C语言编写Windows服务程序

原文:C语言编写Windows服务程序 #include <Windows.h> #include <stdio.h> #define SLEEP_TIME 5000 // 间隔时间 #define LOGFILE "C:\\memstatus.txt" // 信息输出文件 SERVICE_STATUS ServiceStatus; // 服务状态 SERVICE_STATUS_HANDLE hStatus; // 服务状态句柄 void ServiceMain

用托管C++编写Windows服务

多年以来,只要提到编写Windows服务,就会想到用Visual C++编写,同时,这也是其中一件C++程序员可以做,而VB程序员不可以做的事情.以前,我们只称其为"服务"或"NT服务",现在,它们被命名为"Windows服务",而且用VB.NET或C#也可以很容易地编写. 但是,如果你想用托管C++来编写呢?毕竟,大多数有经验的Visual C++程序员都会写过一两个服务,也会知道怎样完成一个类似的工程.假设你有一个必须要一直运行以提供服务的程

link环境下使用cidefirst制作的《网盘软件》,每日备份需要编写windows服务?

问题描述 link环境下使用cidefirst制作的<网盘软件>,每日备份需要编写windows服务? link环境下使用cidefirst制作的<网盘软件>,每日备份需要编写windows服务,是什么意思? 解决方案 说的是,如果你要实现一个日常备份,你可以把程序写在一个windows 服务里.

用ATL编写Windows服务

有时候,我们需要自己写的程序在没有用户登陆的情况下,只要Windows系统启动就运行,那我们可以把我们的程序写成一个Windows服务. 服务是能够为各种用户(包括本地用户和远程用户)所用的,拥有用户授权级进行管理的能力,并且不论用户是否物理的与正在运行该应用程序的计算机相连都能正常执行. 下面,我将用一个简单的例子说明如何用ATL来编写Windows服务程序. 首先,我们新建一个Project.如图一所示,选择 "ATL COM AppWizard",工程名为:ServiceDemo

Windows服务编写(Windows Service,system权限)程序显示界面与用户交互(xp,win7通用)_C#教程

1.VC2008中编写"Windows服务"(Windows Service)程序 源码资源下载:/201604/yuanma/TestService_jb51.rar vc2008下新建一个 ATL 项目-> 选择创建一个"服务"类型的ATL 项目TestService,将生成如下代码, class CTestServiceModule : public CAtlServiceModuleT< CTestServiceModule, IDS_SERVI

玩转Windows服务系列&amp;mdash;&amp;mdash;Debug、Release版本的注册和卸载,及其原理

原文:玩转Windows服务系列--Debug.Release版本的注册和卸载,及其原理 Windows服务Debug版本 注册 Services.exe -regserver 卸载 Services.exe -unregserver Windows服务Release版本 注册 Services.exe -service 卸载 Services.exe -unregserver 原理 Windows服务的Debug.Release版本的注册和卸载方式均已明确.但是为什么要这么做呢. 最初我在第一

windows-C# Windows服务调用第三方dll

问题描述 C# Windows服务调用第三方dll C# Windows 服务中要调用第三方dll中的方法,添加引用第三方dll,用InstallUtil.exe安装服务后,总是无法加载第三方dll,求高手解决,我知道服务的运行目录是C:WindowsSystem32,难道也要将第三方dll拷贝到服务目录下? 解决方案 起码要放到系统缺省目录,不然就找不到dll 解决方案二: 服务的运行目录爱在哪儿都行,工作目录一般是system32,所以理论上把dll放到服务的同一个目录下就行了 解决方案三:

我用批处理写的windows服务启动不了哪位大神知道怎么解决不

问题描述 我用批处理写的windows服务启动不了哪位大神知道怎么解决不,提示本地计算机上的服务启动后停止.某些服务在未由其他服务或程序使用时将自动停止 解决方案 解决方案二:你试试手动启动指定的服务解决方案三:应该是你的服务报错了啊,加一些诊断log看看------------------------------------------------------------------------------------------------解决方案四:记录你的程序执行了哪些步骤的程序之后才跳