PDA

Visualizza la versione completa : [C] Creazione e registrazione di un servizio


Salvy95
11-08-2011, 17:37
salve ragazzi, vorrei aggiungere il mio programma alla lista dei servizi!
ho scritto questo codice ma gli handle non restituiscono alcun valore:




BOOL AddAutoStartService(BOOL MsgBox){
SC_HANDLE key;
SC_HANDLE result;
key = OpenSCManager(NULL, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS);
result = CreateService(key, PROCESSNAME, PROCESSNAME, SC_MANAGER_ALL_ACCESS, SERVICE_ADAPTER, SERVICE_INTERACTIVE_PROCESS,
SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, EXEPATH, NULL, NULL, NULL, NULL);
return TRUE;
}



e quindi non succede nulla (Non si aggiungere il servizio aurora alla lista dei servizi) HKEY_LOCAL_MACHINE\System\CurrentControlSet\Servic es

Freax
11-08-2011, 19:14
mai scritto un servizio, ma in C il tipo primitivo BOOL o bool non esiste, tuttavia una variabile di tipo int con valore settato a 1 pu simulare TRUE e se posta a 0 FALSE.

inoltre se non scrivi come hai definito i tipi credo sia impossibile darti una risposta completa.

edit: preciso, il tipo bool definito dal C99 in poi, non definito in tutte le versioni del linguaggio ma solo in alcune.

Salvy95
11-08-2011, 23:33
:confused: sar che io utilizzo il visual C++, ma a me bool ha sempre funzionato... non a caso tutte le mie funzioni all'interno del programma ritornano valori booleani!
temo che il problema sia altrove _

XAlbeX
11-08-2011, 23:54
Non hai specificato che errore ti da la chiamata a OpenSCManager e a CreateService..

A OpenSCManager passa SC_MANAGER_CREATE_SERVICE al posto di SC_MANAGER_ALL_ACCESS, visto che devi solo aggiungere un servizio.

Alla CreateService perch passi SERVICE_ADAPTER? E' un valore riservato! Passa piuttosto SERVICE_WIN32_OWN_PROCESS.

Che SERVICE_INTERACTIVE_PROCESS? Mi sa che ci hai aggiunto un parametro che non richiede..

Ricontrolla tutti i parametri..

XAlbeX
12-08-2011, 00:00
Originariamente inviato da Freax
mai scritto un servizio, ma in C il tipo primitivo BOOL o bool non esiste, tuttavia una variabile di tipo int con valore settato a 1 pu simulare TRUE e se posta a 0 FALSE.

inoltre se non scrivi come hai definito i tipi credo sia impossibile darti una risposta completa.

edit: preciso, il tipo bool definito dal C99 in poi, non definito in tutte le versioni del linguaggio ma solo in alcune.

Nel header windef.h sono dichiarati:


...
..

#ifndef FALSE
#define FALSE 0
#endif

#ifndef TRUE
#define TRUE 1
#endif

...
...

typedef int BOOL;

Freax
12-08-2011, 00:17
Originariamente inviato da XAlbeX
Nel header windef.h sono dichiarati:


...
..

#ifndef FALSE
#define FALSE 0
#endif

#ifndef TRUE
#define TRUE 1
#endif

...
...

typedef int BOOL;



che non mi risulta sia ancora un header del C ( anzi c' pure il copyright Microsoft su quel file ), linguaggio per il quale il nostro amico chiede aiuto, o Visual C++ o C, mettiamoci d'accordo.

XAlbeX
12-08-2011, 00:25
Beh.. se utilizza le API di Windows penso abbia incluso gli header che mette a disposizione Microsoft.. o no?

MItaly
12-08-2011, 01:42
Originariamente inviato da Freax
che non mi risulta sia ancora un header del C ( anzi c' pure il copyright Microsoft su quel file ), linguaggio per il quale il nostro amico chiede aiuto, o Visual C++ o C, mettiamoci d'accordo.
C con le librerie di Windows (roba del Platform SDK), come chiaro dai tipi e dalle funzioni utilizzate (e dal fatto che vuole creare un servizio, oggetto che il C standard ovviamente non menziona).

Comunque... dopo aver sistemato i parametri (come specificato correttamente da XAlbeX), inserisci dopo ciascuna chiamata una GetLastError per verificare esattamente quale codice di errore ottieni.

Salvy95
12-08-2011, 10:33
Ok, adesso funziona ma... una volta creata la chiave nel registro, questa non avvia il programma, come se l'esecuzione automatica fosse disabilitata!

Edit: Porto ulteriori info: il servizio compare all'interno della lista dei servizi, ma lo status quello di "Interrotto"

misterx
12-08-2011, 11:46
Originariamente inviato da Salvy95
Ok, adesso funziona ma... una volta creata la chiave nel registro, questa non avvia il programma, come se l'esecuzione automatica fosse disabilitata!

Edit: Porto ulteriori info: il servizio compare all'interno della lista dei servizi, ma lo status quello di "Interrotto"


vanno settati i privilegi di esecuzione?

Loading