zoukankan      html  css  js  c++  java
  • 一个简单的服务程序

    //////////////////////////////////////////////////////////////////////////////////////
    //                                                                                    //
    // 日期:    2007/08/10                                                                //
    // 作者:    冷风                                                                    //
    // 说明:    服务程序框架 请改写mainfun函数                                                            //
    // 联系:    QQ 121121606                                             //
    //////////////////////////////////////////////////////////////////////////////////////

    #include 
    <windows.h>
    #include 
    <tlhelp32.h>
    #include 
    <winsvc.h>
    #include 
    <stdio.h>
    #include 
    <winsock.h>
    #include 
    "stdafx.h"
    #include 
    <iostream>
    #include 
    <windows.h>
    #pragma comment (lib,"ws2_32")                        //加载库函数

    SERVICE_STATUS          ServiceStatus;
    SERVICE_STATUS_HANDLE   hStatus;


    VOID    WINAPI ServiceMain( DWORD dwArgc, LPTSTR 
    *lpszArgv );
    VOID    WINAPI ServiceHandler( DWORD fdwControl );
    DWORD    WINAPI mainfun(LPVOID lpParam);



    void EmptyPipe(HANDLE hReadPipe1)
    {
        BOOL ret;
        DWORD bytesRead;
        
    char *buffer=new char [1024];
        
    while(true)
        {
            memset(buffer,
    0,1024);
            ret
    =PeekNamedPipe(hReadPipe1,buffer,1024,&bytesRead,0,0);
            
    if (bytesRead==0||!ret)
            {
                delete buffer;
                
    return;
            }
            ReadFile(hReadPipe1,buffer,bytesRead,
    &bytesRead,0);
        }



    int main(int argc,char *argv[])
    {   
        SERVICE_TABLE_ENTRY ServiceTable[
    2];
        ServiceTable[
    0].lpServiceName = "IIS Angent";
        ServiceTable[
    0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
        ServiceTable[
    1].lpServiceName = NULL;
        ServiceTable[
    1].lpServiceProc = NULL;
        StartServiceCtrlDispatcher(ServiceTable);     
    // 启动服务的控制分派机线程
        
        
    return 0;
    }



    VOID WINAPI ServiceHandler(DWORD fdwControl) 

        
    switch(fdwControl)
        {
        
    case SERVICE_CONTROL_PAUSE:
            ServiceStatus.dwCurrentState 
    = SERVICE_PAUSED;
            
    break;
            
        
    case SERVICE_CONTROL_CONTINUE:
            ServiceStatus.dwCurrentState 
    = SERVICE_RUNNING;
            
    break;
            
        
    case SERVICE_CONTROL_STOP: 
        
    case SERVICE_CONTROL_SHUTDOWN:
            ServiceStatus.dwCurrentState  
    = SERVICE_STOPPED;
            ServiceStatus.dwWin32ExitCode 
    = 0;
            ServiceStatus.dwCheckPoint    
    = 0;
            ServiceStatus.dwWaitHint      
    = 0;
            SetServiceStatus(hStatus,
    &ServiceStatus);
            
    return ;
            
        
    case SERVICE_CONTROL_INTERROGATE:
            
    break;
            
        
    default:
            
    break;
        }
        
        SetServiceStatus(hStatus,
    &ServiceStatus);
        
    return ;
    }

    VOID WINAPI ServiceMain( DWORD dwArgc, LPTSTR 
    *lpszArgv )
    {
        DWORD   status 
    = 0
        DWORD   specificError 
    = 0xfffffff
        
        ServiceStatus.dwServiceType        
    = SERVICE_WIN32; 
        ServiceStatus.dwCurrentState       
    = SERVICE_START_PENDING; 
        ServiceStatus.dwControlsAccepted   
    = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE; 
        ServiceStatus.dwWin32ExitCode      
    = 0
        ServiceStatus.dwServiceSpecificExitCode 
    = 0
        ServiceStatus.dwCheckPoint         
    = 0
        ServiceStatus.dwWaitHint           
    = 0
        
        hStatus 
    = RegisterServiceCtrlHandler("IIS Angent",(LPHANDLER_FUNCTION)ServiceHandler); 
        
    if (hStatus==0
            
    return
        
        
    // Handle error condition 
        status = GetLastError(); 
        
    if (status!=NO_ERROR) 
        { 
            ServiceStatus.dwCurrentState       
    = SERVICE_STOPPED; 
            ServiceStatus.dwCheckPoint         
    = 0
            ServiceStatus.dwWaitHint           
    = 0
            ServiceStatus.dwWin32ExitCode      
    = status; 
            ServiceStatus.dwServiceSpecificExitCode 
    = specificError; 
            SetServiceStatus(hStatus, 
    &ServiceStatus); 
            
    return
        } 
        
        
    // Initialization complete - report running status 
        ServiceStatus.dwCurrentState       = SERVICE_RUNNING; 
        ServiceStatus.dwCheckPoint         
    = 0
        ServiceStatus.dwWaitHint           
    = 0;  
        SetServiceStatus(hStatus, 
    &ServiceStatus);
        
        
    //do my job
        HANDLE hThread=CreateThread(NULL,0,mainfun,NULL,0,NULL);
        
    if(hThread==NULL)
            
    return;
        WaitForSingleObject(hThread,INFINITE);
    }


    DWORD WINAPI mainfun(LPVOID lpParam)
    {

      
    ////你想要实现功能的代码填入即可
            return 0;
    }

    安装服务程序:

    #include <windows.h>
    #include 
    <winsvc.h>
    #include 
    <stdio.h>
    main()
    {
        
    char name[100];
        
    char info[200];
        
    char path[300];
        printf(
    "请输入服务名\n\n");
        scanf (
    "%s",&name);
        printf(
    "请输入服务描述\n\n");
        scanf (
    "%s",&info);
        printf(
    "请输入程序路径\n\n");
        scanf (
    "%s",&path);
        SC_HANDLE manager
    =NULL;
        SC_HANDLE service
    =NULL;
        
    if((manager=OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE))==NULL)
        {
            printf(
    "OpenSCManager Error");
        }
        service
    =CreateService(
                manager,name,info, 
                SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, 
                SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
                path, 
    00000 );
        
    if(service)
        printf(
    "服务创建成功\n\n");
        
    else
        printf(
    "服务创建失败\n\n");
        CloseServiceHandle(service);
        CloseServiceHandle(manager);
    }

    删除服务程序:

    #include <windows.h>
    #include 
    <winsvc.h>
    #include 
    <stdio.h>
    void main()
    {
        
    char name[100];
        SC_HANDLE scm;
            SC_HANDLE service;
        SERVICE_STATUS status;
        printf(
    "请输入要删除的服务名\n\n");
        scanf (
    "%s",&name);

        
    if((scm=OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE))==NULL)
        {
            printf(
    "OpenSCManager Error\n");
        }
        service
    =OpenService(scm,name,SERVICE_ALL_ACCESS|DELETE);
        
    if (!service)
        {
            printf(
    "OpenService error!\n");
            
    return;
        }
            BOOL isSuccess
    =QueryServiceStatus(service,&status);
        
    if (!isSuccess)
        {
            printf(
    "QueryServiceStatus error!\n");
            
    return;
        }
           
    if ( status.dwCurrentState!=SERVICE_STOPPED )
        {
            isSuccess
    =ControlService(service,SERVICE_CONTROL_STOP,&status);
            
    if (!isSuccess )
            printf(
    "Stop Service error!\n");
            Sleep( 
    500 );
        }
        isSuccess
    =DeleteService(service);
        
    if (!isSuccess)
             printf(
    "删除服务失败!\n");
        
    else
             printf(
    "删除服务成功!\n");
        CloseServiceHandle(service );
        CloseServiceHandle(scm);
    }


     /Files/tt_mc/0712-diy666666.rar

  • 相关阅读:
    [HAOI2015]树上染色 [树形dp]
    【luogu1052】 过河 [动态规划]
    【luogu4819】 [中山市选]杀人游戏 [tarjan 缩点]
    【luogu4185】 [USACO18JAN]MooTube [并查集]
    [国家集训队]墨墨的等式 [差分约束]
    【RMQ】
    [USACO05DEC] 布局 [差分约束]
    [SCOI2011]糖果 [差分约束]
    【POJ 1201】Intervals
    【luogu1993】 小K的农场 [差分约束]
  • 原文地址:https://www.cnblogs.com/tt_mc/p/1655958.html
Copyright © 2011-2022 走看看