msdn中有个非常简单的例子,名字就叫simple
msdn光盘\Samples\VC98\sdk\winbase\winnt\service

解决方案 »

  1.   

    只有nt下面才有服务,9x没有的。
    msdn里有一个详细的例子,搜索service sample就可以找到!!
      

  2.   

    //在服务控制管理器数据库中注册后台服务线程
    void CmdRegisterService()
    {
      SCHANDLE  schService;
      SCHANDLE  schSCManager;
      TCHAR szPath[512];
      //获得后台服务进程执行路径
      if(GetModuleFileName(NULL,szPath,512)==0)
      {tprintf(TEXT(“Unable to install %s - %s\n"),
      TEXT(“Service Example"), GetLastErrorText(szErr, 256));
       return;
      }
      //打开服务控制管理器数据库
      schSCManager=OpenSCManager(
             NULL,   //本地机器
             NULL,   //默认数据库
             SCMANAGERALLACCESS //访问权限
             );
      //在此数据库中创建后台服务线程对象
      if(schSCManager)
      { schService=CreateService(
        schSCManager, //服务控制管理器数据库
        TEXT(“ServiceExample"), //后台服务名称
        TEXT(“Service Example"),//在服务控制面板中显示的//服务名称
        SERVICE_ALL_ACCESS, //访问权限
        SERVICE_WIN32_OWN_PROCESS, //服务类型
        SERVICE_AUTO_START, //启动类型,随系统自动//加载
        SERVICE_ERROR_NORMAL,
        szPath,
        NULL,
        NULL,
    TEXT(“"),
    NULL,  //本地系统帐号
    NULL);// 没有口令
      //在这里可以创建多个后台服务线程对象,完成不同的
    //后台任务
      if(schService)
       {tprintf(TEXT(“%s installed.\n"),TEXT(“Service Example")); 
        CloseServiceHandle(schService);
       }
       else
       {tprintf(TEXT(“CreateService failed-%s\n"),
       GetLastErrorText(szErr, 256));
       }
       CloseServiceHandle(schSCManager);
      }
      else
       tprintf(TEXT(“OpenSCManager failed - %s\n"),
    GetLastErrorText(szErr,256));
    }
    //定义后台服务线程入口表
    SERVICETABLEENTRY MyServiceTable[]=
    {
       {
       TEXT(“ServiceExample"),//后台服务线程的名称
       (LPSERVICEMAINFUNCTION)MyServiceMain//后台服//务线程入口点
       },
       {NULL, NULL }   //标志表的结束
    };
    //服务线程入口函数
    void WINAPI MyServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)
    {
      //注册服务控制处理函数
    sshStatusHandle=RegisterServiceCtrlHandler(TEXT(“ServiceExample"), Servi ceControlHandler);
      if(!sshStatusHandle)
    goto cleanup;
      //服务类型
      ssStatus.dwServiceType=SERVICE_WIN32_OWN_PROCESS; 
      //指定的出错代码
      ssStatus.dwServiceSpecificExitCode=0;
      //启动自己定义的后台服务
      ServiceStart();
    cleanup:
      if(sshStatusHandle)
    (VOID)ReportStatusToSCMgr(
    SERVICESTOPPED,dwErr,0);
      return;
    }//服务控制处理函数:负责接收和处理服务控制管理器发出的
    //命令
    VOID WINAPI ServiceControlHandler(DWORD dwCtrlCode)
    {
      switch(dwCtrlCode)
      {
       //停止服务之前,应首先向服务控制管理器回送状态信息
       case SERVICE_CONTROLSTOP:
        ReportStatusToSCMgr(SERVICE_STOP_PENDING,NOE RROR, 0);
        ServiceStop();
        return;
       //更新服务状态
       case SERVICE_CONTROL_INTERROGATE:
        break;
       default:
        break;
      }
      //向服务控制面板管理器回送状态信息
      ReportStatusToSCMgr(ssStatus.dwCurrentState, NOERROR, 0); 
    }//设置当前服务状态并将状态信息回送到服务控制管理器
    BOOL ReportStatusToSCMgr(DWORD dwCurrentState,DWORD
    dwWin32ExitCode,WORD dwWaitHint)
    {
      static DWORD dwCheckPoint=1;
      BOOL fResult=TRUE;
      if(dwCurrentState==SERVICESTARTPENDING)
       ssStatus.dwControlsAccepted=0;
      else
       ssStatus.dwControlsAccepted=SERVICE_ACCEPT_STOP;
      //设置状态信息
      ssStatus.dwCurrentState=dwCurrentState;
      ssStatus.dwWin32ExitCode=dwWin32ExitCode;
      ssStatus.dwWaitHint=dwWaitHint;
      if((dwCurrentState==SERVICE_RUNNING )‖
       (dwCurrentState==SERVICE_STOPPED))
       ssStatus.dwCheckPoint=0;
      else
       ssStatus.dwCheckPoint=dwCheckPoint++;
      //将状态信息回送到服务控制管理器
      if(!(fResult=SetServiceStatus(sshStatusHandle,&ssStatus))){
       AddToMessageLog(TEXT(“SetServiceStatus"));//向NT事//件管理器报告出错消息
       }
       return fResult;
    }//服务进程入口
    voidCRTAPI1 main(int argc, char **argv)
    {
      if((argc>1)&&((*argv[1]==‘-')‖(*argv[1]==‘/')) )
      {
       if(stricmp(“register", argv[1]+1)==0)
        CmdRegisterService(); //注册后台服务线程对象
       else
        goto dispatch;
       exit(0);
      }
      dispatch:
       //启动服务控制分配器,建立主线程与服务控制面板的
    //连接
       if(StartServiceCtrlDispatcher(MyServiceTable))
        AddToMessageLog(TEXT (“StartServiceCtrlDispatcher success."));
    }void ServiceStart()
    {
      //向服务控制管理器报告服务正在启动
      if(!ReportStatusToSCMgr(
    SERVICE_START_PENDING, //service state
    NOERROR,
    dwWaitHint))
    return;
      //下面是线程的初始化代码(注意:初始化代码执行时间
    //不应超过设定的nWaitHi nt,否则服务控制管理器会认
    //为服务线程已经没有响应
      //向服务控制管理器报告服务已经启动
      if(!ReportStatusToSCMgr(
    SERVICE_RUNNING,  //service state
    NOERROR,   //exit code
    0))    //wait hint
       return;
    //开始执行服务
    }
    //停止后台服务线程
    void ServiceStop()
    {
      //添加结束服务线程代码
    }