Closed Thread
Results 1 to 4 of 4

Thread: need help C++ program

  1. #1
    statquos is offline Newbie
    Join Date
    Jun 2008
    Posts
    2
    Rep Power
    0

    need help C++ program

    Need a program in C++ which run as service (in the background)

    The program read a txt file where are informations: date/time and task.
    example txt file:
    2008/05/30
    20:00:00
    Go to cinema

    The program check if time (date) is equal of system time (date).
    If is equal, the program should throw a message (put message on screen)-Go to cinema.

    Code:
    #include <process.h>
    #include <iostream>
    #include <time.h>
    #include <fstream>
    #include <string>
    #include <tchar.h>
    #include <stdio.h>
    #include <windows.h>
    #include <winbase.h>
    #include <winsvc.h>
    
    //  Service.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    
    #define        MAX_NUM_OF_PROCESS        4
    /** Window Service **/
    VOID ServiceMainProc();
    VOID Install(char* pPath, char* pName);
    VOID UnInstall(char* pName);
    VOID WriteLog(char* pFile, char* pMsg);
    BOOL KillService(char* pName);
    BOOL RunService(char* pName);
    VOID ExecuteSubProcess();
    VOID ProcMonitorThread(VOID *);
    
    VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv);
    VOID WINAPI ServiceHandler(DWORD fdwControl);
    
    
    /** Window Service **/
    const int nBufferSize = 500;
    CHAR pServiceName[nBufferSize+1];
    CHAR pExeFile[nBufferSize+1];
    CHAR lpCmdLineData[nBufferSize+1];
    CHAR pLogFile[nBufferSize+1];
    BOOL ProcessStarted = TRUE;
    
    CRITICAL_SECTION        myCS;
    SERVICE_TABLE_ENTRY        lpServiceStartTable[] =
    {
        {pServiceName, ServiceMain},
        {NULL, NULL}
    };
    
    LPTSTR ProcessNames[MAX_NUM_OF_PROCESS];
    
    SERVICE_STATUS_HANDLE   hServiceStatusHandle;
    SERVICE_STATUS          ServiceStatus;
    PROCESS_INFORMATION    pProcInfo[MAX_NUM_OF_PROCESS];
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        if(argc >= 2)
            strcpy(lpCmdLineData, argv[1]);
        ServiceMainProc();
        return 0;
    }
    
    VOID ServiceMainProc()
    {
        ::InitializeCriticalSection(&myCS);
        // initialize variables for .exe and .log file names
        char pModuleFile[nBufferSize+1];
        DWORD dwSize = GetModuleFileName(NULL, pModuleFile, nBufferSize);
        pModuleFile[dwSize] = 0;
        if(dwSize>4 && pModuleFile[dwSize-4] == '.')
        {
            sprintf(pExeFile,"%s",pModuleFile);
            pModuleFile[dwSize-4] = 0;
            sprintf(pLogFile,"%s.log",pModuleFile);
        }
        //name of process
        strcpy(pServiceName,"SkyDiver");
    
        if(_stricmp("-i",lpCmdLineData) == 0 || _stricmp("-I",lpCmdLineData) == 0)
            Install(pExeFile, pServiceName);
        else if(_stricmp("-k",lpCmdLineData) == 0 || _stricmp("-K",lpCmdLineData) == 0)
            KillService(pServiceName);
        else if(_stricmp("-u",lpCmdLineData) == 0 || _stricmp("-U",lpCmdLineData) == 0)
            UnInstall(pServiceName);
        else if(_stricmp("-s",lpCmdLineData) == 0 || _stricmp("-S",lpCmdLineData) == 0)
            RunService(pServiceName);
        else
            ExecuteSubProcess();
    }
    
    VOID Install(char* pPath, char* pName)
    {  
        SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
        if (schSCManager==0)
        {
            long nError = GetLastError();
            char pTemp[121];
            sprintf(pTemp, "OpenSCManager failed, error code = %d\n", nError);
            WriteLog(pLogFile, pTemp);
        }
        else
        {
            SC_HANDLE schService = CreateService
            (
                schSCManager,    /* SCManager database      */
                pName,            /* name of service         */
                pName,            /* service name to display */
                SERVICE_ALL_ACCESS,        /* desired access          */
                SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS , /* service type            */
                SERVICE_AUTO_START,      /* start type              */
                SERVICE_ERROR_NORMAL,      /* error control type      */
                pPath,            /* service's binary        */
                NULL,                      /* no load ordering group  */
                NULL,                      /* no tag identifier       */
                NULL,                      /* no dependencies         */
                NULL,                      /* LocalSystem account     */
                NULL
            );                     /* no password             */
            if (schService==0)
            {
                long nError =  GetLastError();
                char pTemp[121];
                sprintf(pTemp, "Failed to create service %s, error code = %d\n", pName, nError);
                WriteLog(pLogFile, pTemp);
            }
            else
            {
                char pTemp[121];
                sprintf(pTemp, "Service %s installed\n", pName);
                WriteLog(pLogFile, pTemp);
                CloseServiceHandle(schService);
            }
            CloseServiceHandle(schSCManager);
        }    
    }
    
    VOID UnInstall(char* pName)
    {
        SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
        if (schSCManager==0)
        {
            long nError = GetLastError();
            char pTemp[121];
            sprintf(pTemp, "OpenSCManager failed, error code = %d\n", nError);
            WriteLog(pLogFile, pTemp);
        }
        else
        {
            SC_HANDLE schService = OpenService( schSCManager, pName, SERVICE_ALL_ACCESS);
            if (schService==0)
            {
                long nError = GetLastError();
                char pTemp[121];
                sprintf(pTemp, "OpenService failed, error code = %d\n", nError);
                WriteLog(pLogFile, pTemp);
            }
            else
            {
                if(!DeleteService(schService))
                {
                    char pTemp[121];
                    sprintf(pTemp, "Failed to delete service %s\n", pName);
                    WriteLog(pLogFile, pTemp);
                }
                else
                {
                    char pTemp[121];
                    sprintf(pTemp, "Service %s removed\n",pName);
                    WriteLog(pLogFile, pTemp);
                }
                CloseServiceHandle(schService);
            }
            CloseServiceHandle(schSCManager);    
        }
        DeleteFile(pLogFile);
    }
    
    
    VOID WriteLog(char* pFile, char* pMsg)
    {
        // write error or other information into log file
        ::EnterCriticalSection(&myCS);
        try
        {
            SYSTEMTIME oT;
            ::GetLocalTime(&oT);
            FILE* pLog = fopen(pFile,"a");
            fprintf(pLog,"%02d/%02d/%04d, %02d:%02d:%02d\n    %s",oT.wMonth,oT.wDay,oT.wYear,oT.wHour,oT.wMinute,oT.wSecond,pMsg);
            fclose(pLog);
        } catch(...) {}
        ::LeaveCriticalSection(&myCS);
    }
    
    BOOL KillService(char* pName)
    {
        // kill service with given name
        SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
        if (schSCManager==0)
        {
            long nError = GetLastError();
            char pTemp[121];
            sprintf(pTemp, "OpenSCManager failed, error code = %d\n", nError);
            WriteLog(pLogFile, pTemp);
        }
        else
        {
            // open the service
            SC_HANDLE schService = OpenService( schSCManager, pName, SERVICE_ALL_ACCESS);
            if (schService==0)
            {
                long nError = GetLastError();
                char pTemp[121];
                sprintf(pTemp, "OpenService failed, error code = %d\n", nError);
                WriteLog(pLogFile, pTemp);
            }
            else
            {
                // call ControlService to kill the given service
                SERVICE_STATUS status;
                if(ControlService(schService,SERVICE_CONTROL_STOP,&status))
                {
                    CloseServiceHandle(schService);
                    CloseServiceHandle(schSCManager);
                    return TRUE;
                }
                else
                {
                    long nError = GetLastError();
                    char pTemp[121];
                    sprintf(pTemp, "ControlService failed, error code = %d\n", nError);
                    WriteLog(pLogFile, pTemp);
                }
                CloseServiceHandle(schService);
            }
            CloseServiceHandle(schSCManager);
        }
        return FALSE;
    }
    
    BOOL RunService(char* pName)
    {
        // run service with given name
        SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
        if (schSCManager==0)
        {
            long nError = GetLastError();
            char pTemp[121];
            sprintf(pTemp, "OpenSCManager failed, error code = %d\n", nError);
            WriteLog(pLogFile, pTemp);
        }
        else
        {
            // open the service
            SC_HANDLE schService = OpenService( schSCManager, pName, SERVICE_ALL_ACCESS);
            if (schService==0)
            {
                long nError = GetLastError();
                char pTemp[121];
                sprintf(pTemp, "OpenService failed, error code = %d\n", nError);
                WriteLog(pLogFile, pTemp);
            }
            else
            {
                // call StartService to run the service
                if(StartService(schService, 0, (const char**)NULL))
                {
                    CloseServiceHandle(schService);
                    CloseServiceHandle(schSCManager);
                    return TRUE;
                }
                else
                {
                    long nError = GetLastError();
                    char pTemp[121];
                    sprintf(pTemp, "StartService failed, error code = %d\n", nError);
                    WriteLog(pLogFile, pTemp);
                }
                CloseServiceHandle(schService);
            }
            CloseServiceHandle(schSCManager);
        }
        return FALSE;
    }
    
    
    VOID ExecuteSubProcess()
    {
        if(_beginthread(ProcMonitorThread, 0, NULL) == -1)
        {
            long nError = GetLastError();
            char pTemp[121];
            sprintf(pTemp, "StartService failed, error code = %d\n", nError);
            WriteLog(pLogFile, pTemp);
        }
        if(!StartServiceCtrlDispatcher(lpServiceStartTable))
        {
            long nError = GetLastError();
            char pTemp[121];
            sprintf(pTemp, "StartServiceCtrlDispatcher failed, error code = %d\n", nError);
            WriteLog(pLogFile, pTemp);
        }
        ::DeleteCriticalSection(&myCS);
    }
    
    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;
    
        hServiceStatusHandle = RegisterServiceCtrlHandler(pServiceName, ServiceHandler);
        if (hServiceStatusHandle==0)
        {
            long nError = GetLastError();
            char pTemp[121];
            sprintf(pTemp, "RegisterServiceCtrlHandler failed, error code = %d\n", nError);
            WriteLog(pLogFile, pTemp);
            return;
        }
    
        // Initialization complete - report running status
        ServiceStatus.dwCurrentState       = SERVICE_RUNNING;
        ServiceStatus.dwCheckPoint         = 0;
        ServiceStatus.dwWaitHint           = 0;  
        if(!SetServiceStatus(hServiceStatusHandle, &ServiceStatus))
        {
            long nError = GetLastError();
            char pTemp[121];
            sprintf(pTemp, "SetServiceStatus failed, error code = %d\n", nError);
            WriteLog(pLogFile, pTemp);
        }
    }
    
    VOID WINAPI ServiceHandler(DWORD fdwControl)
    {
        switch(fdwControl)
        {
            case SERVICE_CONTROL_STOP:
            case SERVICE_CONTROL_SHUTDOWN:
                ProcessStarted = FALSE;
                ServiceStatus.dwWin32ExitCode = 0;
                ServiceStatus.dwCurrentState  = SERVICE_STOPPED;
                ServiceStatus.dwCheckPoint    = 0;
                ServiceStatus.dwWaitHint      = 0;
                break;
            case SERVICE_CONTROL_PAUSE:
                ServiceStatus.dwCurrentState = SERVICE_PAUSED;
                break;
            case SERVICE_CONTROL_CONTINUE:
                ServiceStatus.dwCurrentState = SERVICE_RUNNING;
                break;
            case SERVICE_CONTROL_INTERROGATE:
                break;
    
        };
        if (!SetServiceStatus(hServiceStatusHandle,  &ServiceStatus))
        {
            long nError = GetLastError();
            char pTemp[121];
            sprintf(pTemp, "SetServiceStatus failed, error code = %d\n", nError);
            WriteLog(pLogFile, pTemp);
        }
    }
    
    VOID ProcMonitorThread(VOID *)
    {
        while(ProcessStarted == TRUE)
        {
            //WriteLog(pLogFile, "Write service!!!");        
            FILE *f;
            int tmp;
            char c,time[10],date[10],msg[100];
    
            for(tmp=0;tmp<10;++tmp)
                time[tmp]='\0';
            for(tmp=0;tmp<10;++tmp)
                date[tmp]='\0';
            for(tmp=0;tmp<10;++tmp)
                 msg[tmp]='\0';
        
            tmp=0;
    
            f=fopen("Scheduler.txt","r");
        
            while(1)
            {
                c=getc(f);
                if(c==' ')break;
                time[tmp]=c;
                ++tmp;
            }
            tmp=0;
        
            while(1)
            {
                c=getc(f);
                if(c==' ')break;
                date[tmp]=c;
                ++tmp;
             }
            tmp=0;
        
            while(1)
            {
                c=getc(f);
                if(c==EOF)break;
                msg[tmp]=c;
                ++tmp;
            }
            fclose(f);
    
            MessageBox(NULL,("Time: %s   Date: %s   Message: %s",time,date,msg),"Message window",0);
        }
    }

  2. CODECALL Circuit advertisement
    Join Date
    Always
    Posts
    Many

     
  3. #2
    Join Date
    May 2008
    Posts
    2,126
    Blog Entries
    1
    Rep Power
    33

    Re: need help C++ program

    I'm too lazy to read through your whole prog. What is the issue? And I'll see if I can't tell you what's wrong.

  4. #3
    statquos is offline Newbie
    Join Date
    Jun 2008
    Posts
    2
    Rep Power
    0

    Re: need help C++ program

    this progra is not read and compare system time and date with date which written in file...

  5. #4
    Join Date
    Mar 2008
    Location
    The North Pole
    Posts
    13,174
    Blog Entries
    13
    Rep Power
    114

    Re: need help C++ program

    Do you get any error messages?

    Quote Originally Posted by Jordan View Post
    Good members, like yourself, stick around and post for ages to come!
    Mr. Xav | Blog | Forums

Closed Thread

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Similar Threads

  1. Program for search terms within a program
    By 817moose in forum General Programming
    Replies: 4
    Last Post: 11-03-2010, 01:07 PM
  2. Why do you program/Why are you learning to program?
    By taylerhughes in forum The Lounge
    Replies: 34
    Last Post: 08-11-2010, 12:26 AM
  3. Replies: 9
    Last Post: 03-14-2010, 08:44 PM
  4. Execute a program from within another program
    By gabrielle_l in forum Java Help
    Replies: 4
    Last Post: 02-17-2010, 02:47 PM
  5. Replies: 8
    Last Post: 05-11-2009, 01:41 AM

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts