Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C] Da applicazione c a servizio windows

    Ragazzi qualcuno sa come a partire da un'applicazione c sia possibile rendere quest'ultima un servizio di windows?
    Grazie a tutti

  2. #2
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Ci sono programmini tipo SrvAny che cercano di eseguire un programma come servizio Windows, visto che i servizi sono "oggetti delicati" ed andrebbero programmati appositamente il mio consiglio è quello di riscrivere il codice da zero.
    "Se riesci a passare un pomeriggio assolutamente inutile in modo assolutamente inutile, hai imparato a vivere."

  4. #4
    Ragazzi vi prego aiutatemi

    E' questo il codice che utilizzo per creare un servizio

    Non badate al fatto che in questo caso il servizio non faccia niente di utile
    La cosa che non riesco a spiegarmi è che fino alla creazione del servizio va tutto ok
    quando lancio il servizio mi esce il messaggio di errore:
    "Prova Servizio sarà terminato inviare comunicazione a microsoft.... e via di seguito"

    La stessa cosa non si verifica se commento questa porzione di codice

    fscanf(fileCfg,"%s",nomeDbDati);
    fscanf(fileCfg,"%s",nomeDbCfg);
    fclose(fileCfg);

    c'è qualcosa che mi sfugge...
    anche se facessi solo la fscanf o l'fclose ho problemi


    con il solo fopen no

    Vi prego aiutatemi sono disperato




    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <windows.h>
    #include <process.h>
    #include <winsock.h>
    #include <time.h>
    #include "Winsvc.h"
    
    
    SERVICE_STATUS m_ServiceStatus;
    SERVICE_STATUS_HANDLE m_ServiceStatusHandle;
    BOOL bRunning=1;
    void WINAPI ServiceMain(DWORD argc, LPTSTR *argv);
    void WINAPI ServiceCtrlHandler(DWORD Opcode);
    BOOL InstallService();
    BOOL DeleteService2();
    
    int main(int argc, char* argv[])
    {
      if(argc>1)
      {
    	printf("%s\n",argv[1]);
    
        if(strcmp(argv[1],"-i")==0)
        {
    	printf("%s\n",argv[1]);
          if(InstallService())
            printf("\n\nService Installed Sucessfully\n");
          else
            printf("\n\nError Installing Service\n");
        }
        if(strcmp(argv[1],"-d")==0)
        {
          if(DeleteService2())
            printf("\n\nService UnInstalled Sucessfully\n");
          else
            printf("\n\nError UnInstalling Service\n");
        }
        else
        {
          printf("\n\nUnknown Switch Usage\n\nFor Install use Srv1 -i\n\nFor UnInstall use Srv1 -d\n");
        }
      }
      else
      {
        SERVICE_TABLE_ENTRY DispatchTable[]=
                    {{"Service1",ServiceMain},{NULL,NULL}};
        StartServiceCtrlDispatcher(DispatchTable);
      }
      return 0;
    }
    
    void WINAPI ServiceMain(DWORD argc, LPTSTR *argv)
    {
     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_ServiceStatusHandle = RegisterServiceCtrlHandler("service6", 
                                                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=1;
      while(bRunning)
      {
    
    	FILE *fileCfg;
    
    	char nomeDbDati[500];
    	char nomeDbCfg[500];
    
    	Sleep(3000);
    
    	fileCfg=fopen("cfg/db_cfg.ini", "r");//apro il file di configurazione
    
    	if(feof(fileCfg)==0)
    		{
    		fscanf(fileCfg,"%s",nomeDbDati);
    		fscanf(fileCfg,"%s",nomeDbCfg);
    		fclose(fileCfg);
    		}	
    
      }
      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=0;
          break;
        case SERVICE_CONTROL_INTERROGATE:
          break; 
      }
      return;
    }
    
    BOOL InstallService()
    {
      char strDir[1024];
      LPCTSTR lpszBinaryPathName;
      HANDLE schSCManager,schService;
      GetCurrentDirectory(1024,strDir);
      printf("%s\n",strDir);
      strcat(strDir,"\\provaservizio.exe"); 
      schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
    
      if (schSCManager == NULL) 
        return 0;
      lpszBinaryPathName=strDir;
    
      schService = CreateService(schSCManager,"service6", 
            "service6", // 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 0; 
    
      CloseServiceHandle(schService);
      return 1;
    }
    
    BOOL DeleteService2()
    {
      HANDLE schSCManager;
      SC_HANDLE hService;
      schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
    
      if (schSCManager == NULL)
        return 0;
      hService=OpenService(schSCManager,"service6",SERVICE_ALL_ACCESS);
      if (hService == NULL)
        return 0;
      if(DeleteService(hService)==0)
        return 0;
      if(CloseServiceHandle(hService)==0)
        return 0;
    
    return 1;
    }

  5. #5
    ecco il link al progetto per poterlo testare..

    aiuto vi prego

    http://www.mediafire.com/?19jxnyj0ylt

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Un servizio e' "ospitato" dal svchost.exe che e' un processo di sistema appositamente in esecuzione a partire dalla cartella C:\Windows\System32.

    Quando viene eseguito il servizio ha come riferimento questa cartella, non quella dove sta l'eseguibile del servizio ...

    Il file

    db_cfg.ini

    deve stare quindi nella cartella

    cfg

    a sua volta posta nella cartella C:\Windows\System32
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.