zoukankan      html  css  js  c++  java
  • VC 创建NT服务程序

    VC 创建NT服务程序

    #include "Windows.h" 
    #include "Winsvc.h" 
    #include "time.h" 
    #include "stdio.h" 
    SERVICE_STATUS m_ServiceStatus; 
    SERVICE_STATUS_HANDLE m_ServiceStatusHandle; 
    BOOL bRunning=true; 
    void WINAPI ServiceMain(DWORD argc, LPTSTR *argv); 
    void WINAPI ServiceCtrlHandler(DWORD Opcode); 
    BOOL InstallService(); 
    BOOL DeleteService(); 
    void DoTask() 
    { 
    //    do something here; 
    } 
    void WINAPI ServiceMain(DWORD argc, LPTSTR *argv) 
    { 
    //     DWORD status;  
    //     DWORD specificError;  
          m_ServiceStatus.dwServiceType          = SERVICE_WIN32;  
          m_ServiceStatus.dwCurrentState         = SERVICE_START_PENDING;  
          m_ServiceStatus.dwControlsAccepted     = SERVICE_ACCEPT_STOP;  
          m_ServiceStatus.dwWin32ExitCode        = 0;  
          m_ServiceStatus.dwServiceSpecificExitCode = 0;  
          m_ServiceStatus.dwCheckPoint           = 0;  
          m_ServiceStatus.dwWaitHint             = 0;  
    //m_ServiceStatus.dwServiceType     = SERVICE_AUTO_START; 
    
          m_ServiceStatusHandle = RegisterServiceCtrlHandler("Service2",ServiceCtrlHandler);   
          if (m_ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)  
          {  
              return;  
          }      
          m_ServiceStatus.dwCurrentState         = SERVICE_RUNNING;  
          m_ServiceStatus.dwCheckPoint           = 0;  
          m_ServiceStatus.dwWaitHint             = 0;   
          if (!SetServiceStatus (m_ServiceStatusHandle, &m_ServiceStatus))  
          {  
          }  
    
    bRunning=true; 
    while(bRunning) 
    {    
        Sleep(3000); 
        //Place Your Code for processing here....   
        DoTask(); 
        //Sleep(60*1000); 
    } 
          return;  
    } 
    
    void WINAPI ServiceCtrlHandler(DWORD Opcode) 
    { 
          switch(Opcode)  
          {  
              case SERVICE_CONTROL_PAUSE:  
                  m_ServiceStatus.dwCurrentState = SERVICE_PAUSED;  
                  break;  
    
              case SERVICE_CONTROL_CONTINUE:  
                  m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;  
                  break;  
    
              case SERVICE_CONTROL_STOP:  
                  m_ServiceStatus.dwWin32ExitCode = 0;  
                  m_ServiceStatus.dwCurrentState    = SERVICE_STOPPED;     
                  m_ServiceStatus.dwCheckPoint      = 0;  
                  m_ServiceStatus.dwWaitHint        = 0;     
                  SetServiceStatus (m_ServiceStatusHandle,&m_ServiceStatus); 
         bRunning=false; 
         break; 
    
              case SERVICE_CONTROL_INTERROGATE:  
                  break;  
          }       
          return;  
    } 
    BOOL InstallService() 
    { 
    char strDir[1024]; 
    HANDLE schSCManager,schService; 
    GetCurrentDirectory(1024,strDir); 
    strcat(strDir,"\\Debug\\servicetest.exe");  
    schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);   
    
    if (schSCManager == NULL)  
        return false; 
          LPCTSTR lpszBinaryPathName=strDir; 
    
          schService = CreateService((struct SC_HANDLE__ *)schSCManager,"Service2","MB Service",             // service name to display  
              SERVICE_ALL_ACCESS,          // desired access  
              SERVICE_WIN32_OWN_PROCESS, // service type  
              SERVICE_DEMAND_START,        // start type  
              SERVICE_ERROR_NORMAL,        // error control type  
              lpszBinaryPathName,          // service's binary  
              NULL,                        // no load ordering group  
              NULL,                        // no tag identifier  
              NULL,                        // no dependencies  
              NULL,                        // LocalSystem account  
              NULL);                       // no password  
    
          if (schService == NULL)  
              return false;   
    
          CloseServiceHandle((struct SC_HANDLE__ *)schService);  
    return true; 
    } 
    
    BOOL DeleteService() 
    { 
    HANDLE schSCManager; 
    SC_HANDLE hService; 
    schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); 
    
    if (schSCManager == NULL)  
        return false;  
    hService=OpenService((struct SC_HANDLE__ *)schSCManager,"Service2",SERVICE_ALL_ACCESS); 
    if (hService == NULL)  
        return false; 
    if(DeleteService(hService)==0) 
        return false; 
    if(CloseServiceHandle(hService)==0) 
        return false; 
    else 
        return true; 
    } 
    
    int main(int argc, char* argv[]) 
    { 
    if(argc>1) 
    { 
        if(strcmp(argv[1],"-i")==0) { 
         if(InstallService()) 
          printf("\nMB Service Installed Sucessfully\n"); 
         else 
          printf("\nMB Service has been installed\n"); 
        } else if(strcmp(argv[1],"-d")==0) { 
         if(DeleteService()) 
          printf("\nMB Service UnInstalled Sucessfully\n"); 
         else 
          printf("\nInstalled Easin Central Service Not Found\n"); 
        } else { 
         printf("\nUnknown Switch Usage\nFor Install use Servicetest -i\nFor UnInstall use Servicetest -d\n"); 
        } 
    } 
    else 
    { 
        SERVICE_TABLE_ENTRY DispatchTable[]={{"Service2",ServiceMain},{NULL,NULL}};   
        StartServiceCtrlDispatcher(DispatchTable);  
    } 
    return 0; 
    }
    

  • 相关阅读:
    apue-ubuntu环境搭建
    visualgdb 调试arm
    CMake速记
    umask
    转换函数conversion function
    c++ hex string array 转换 串口常用
    tcp与串口透传(select)
    sqlite3数据库修复SQLite-database disk image is malformed
    container_of宏
    shell 入门学习
  • 原文地址:https://www.cnblogs.com/mars9/p/2159318.html
Copyright © 2011-2022 走看看