如何写NT服务程序?

chenxi 2000-07-12 09:10:00
...全文
175 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
土豆 2000-10-18
  • 打赏
  • 举报
回复
1.服务:
服务是一个可执行文件,注册在系统注册表中,WINNT启动时,如果服务设置为自动启动,则NT会自动启动该服务。

2.安装程序
但是服务写好后,第一次需要安装到系统中,即添加到注册表中,这样才会在控制面板的“服务”窗口中出现,当然不用直接写注册表,因为系统已经提供了API。所以这样就还需要一个安装程序,当然只需要安装一次就行了。在不再需要的时候也可以将服务卸除,这也需要通过API实现。

反正就是需要实现上面两个功能,当然,也可以做在一起,在第一次运行改程序时将自己注册。但从概念是应该有两个程序。
土豆 2000-10-17
  • 打赏
  • 举报
回复

这是一个服务程序的例子。

#include "windows.h"
#include "winsvc.h"

void WINAPI ServiceMain(DWORD dwArgc,LPTSTR * lpszArgv);
void WINAPI Handler(DWORD Opcode);

SERVICE_STATUS_HANDLE ssh;
SERVICE_STATUS ss;

int main(int argc,char * argv[])
{
SERVICE_TABLE_ENTRY ste[2];
ste[0].lpServiceName="ServiceDemo";
ste[0].lpServiceProc=ServiceMain;
ste[1].lpServiceName=NULL;
ste[1].lpServiceProc=NULL;
StartServiceCtrlDispatcher(ste);
return 0;
}

void WINAPI ServiceMain(DWORD dwArgc,LPTSTR * lpszArgv)
{
ssh=RegisterServiceCtrlHandler("ServiceDemo",Handler);

ss.dwServiceType=SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS;
ss.dwCurrentState=SERVICE_START_PENDING;
ss.dwControlsAccepted=SERVICE_ACCEPT_STOP;
ss.dwWin32ExitCode=NO_ERROR;
ss.dwCheckPoint=0;
ss.dwWaitHint=0;

SetServiceStatus(ssh,&ss);
//put your coed here
ss.dwServiceType=SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS;
ss.dwCurrentState=SERVICE_RUNNING;
ss.dwControlsAccepted=SERVICE_ACCEPT_STOP;
ss.dwWin32ExitCode=NO_ERROR;
ss.dwCheckPoint=0;
ss.dwWaitHint=0;

SetServiceStatus(ssh,&ss);
//put your coed here
}

void WINAPI Handler(DWORD Opcode)
{
switch(Opcode)
{
case SERVICE_CONTROL_STOP:
//put your code here
ss.dwCurrentState=SERVICE_STOPPED;
ss.dwWin32ExitCode=0;
ss.dwCheckPoint=0;
ss.dwWaitHint=0;

SetServiceStatus(ssh,&ss);
break;
case SERVICE_CONTROL_INTERROGATE:
SetServiceStatus(ssh,&ss);
break;
}
}
以上是一个完整的服务程序。

服务程序还需要一个安装程序,将它安装(即OnCreate()函数的处理),启动等操作,下面分别是,服务安装一次后就可以了,就已经添加到注册表中,在控制面板的服务中可以看到的,不需要每次都安装的:

OnStart()
{
scm=::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if(scm!=NULL)
{
scv=::OpenService(scm,"ServiceDemo",SERVICE_ALL_ACCESS);
if (scv!=NULL)
{
::StartService(scv,0,NULL);
::CloseServiceHandle(scv);
}
::CloseServiceHandle(scm);
}
}

OnCreate()
{
scm=::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (scm!=NULL)
{
scv=::CreateService(scm,
"ServiceDemo",
"ServiceDemo",
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,
SERVICE_AUTO_START,
SERVICE_ERROR_IGNORE,
"E:\\VC_DEMO\\ServDemo\\Debug\\ServDemo.exe",
NULL,NULL,NULL,NULL,NULL);
if (scv!=NULL)
{
::CloseServiceHandle(scv);
}
else
{
::CloseServiceHandle(scm);
}
}
}


OnDelete()
{
scm=::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (scm!=NULL)
{
scv=::OpenService(scm,"ServiceDemo",SERVICE_ALL_ACCESS);
if (scv!=NULL)
{
::QueryServiceStatus(scv,&ss);
if (ss.dwCurrentState==SERVICE_RUNNING)
{
::ControlService(scv,SERVICE_CONTROL_STOP,&ss);
}
::DeleteService(scv);
::CloseServiceHandle(scv);
}
::CloseServiceHandle(scm);
}
}

OnStop()
{
scm=::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if(scm!=NULL)
{
scv=::OpenService(scm,"ServiceDemo",SERVICE_STOP|SERVICE_QUERY_STATUS);
if (scv!=NULL)
{
::QueryServiceStatus(scv,&ss);
if (ss.dwCurrentState==SERVICE_RUNNING)
{
::ControlService(scv,SERVICE_CONTROL_STOP,&ss);
}
::CloseServiceHandle(scv);
}
::CloseServiceHandle(scm);
}
}
sun2000 2000-07-12
  • 打赏
  • 举报
回复
你可以参见
expert.csdn.net/TopicView.asp?id=14803
geofee 2000-07-12
  • 打赏
  • 举报
回复
www.codeguru.com/system/有剧多的DEMO
你也可以用ATL写

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧