Indice del forum Olimpo Informatico
I Forum di Zeus News
Leggi la newsletter gratuita - Attiva il Menu compatto
 
 FAQFAQ   CercaCerca   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati 
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

    Newsletter RSS Facebook Twitter Contatti Ricerca
applicazione aperta da batch impedisce la modifica di un fil
Nuovo argomento   Rispondi    Indice del forum -> Programmazione
Precedente :: Successivo  
Autore Messaggio
er maximo
Semidio
Semidio


Registrato: 15/01/08 17:16
Messaggi: 268

MessaggioInviato: 08 Gen 2014 00:56    Oggetto: applicazione aperta da batch impedisce la modifica di un fil Rispondi citando

Salve a tutti... mi riferisco ai moderatori: NON SO CHE TITOLO METTERE... magari cambiatelo in modo più appropriato..

Spero possiate aiutarmi.. espongo il mio problema:

Ho creato un'app in c++ la quale non fa altro che copiare un file da una cartella condivisa, per metterlo in una cartella conosciuta.

Il programma legge il file copiato e controlla se ci sono istruzioni da eseguire o meno.
..gnio tot secondi fa questo.

Se non ci sono istruzioni, allora il file copiato viene eliminato e ricopiato dalla fonte originale per ricontrollare per eventuali aggiornamenti (quindi lo fa a loop finchè non trova un'istruzione da eseguire)

Quando trova l'istruzione, la esegue.. quindi il file originale viene ripristinato e cancellata la copia per poi ricominciare tutto da capo.

Fin qua, tutto liscio come l'olio..

MA.

Ho aggiunto una istruzione che mi permette di eseguire due operazioni una dopo l'altra (senza quindi dover aspettare l'esecuzione di un'istruzione precedente e rimodificare il file per quella successiva).

Va bene anche questa tranne nella sezione in cui io chiedo che venga aperto il file WINSENT (programma che permette lo scambio di messagggi tra pc di una stessa rete) e venga scritto un messaggio usando, quindi, la funzione che mi permette di eseguire due operazioni contemporaneamente.

Se le prendo singolarmente funzionano ma se le uso tramite la funzione DOPPIA ESECUZIONE, non va bene.

Il motivo è che IN QUALCHE MODO A ME SCONSCIUTO il programma winsent tiene impegnato il file copiato tramite il quale verificare la presenza di istruzioni... questo implica che l'istruzione successiva alle esecuzioni, cioè l'eleminazione del file copiato e la sua sostituzione con il file aggiornato (e quindi sterile da ogni istruzione) non avviene in quanto non è possibile eliminarlo perchè usato dal programma winsent.

Spero di essere stato chiaro....

ecco il codice del programma:

Codice:
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include <fstream>
#define azzera {shut.close(); system("Azzera_flash.bat");} //quando non è richiesta una multioperazione (o quando è l'ultima operazione della multioperazione
//"azzera flash" ripristina il file originale modificato, una volta eseguita l'istruzione.
#define nove {shut>>check; case9=false; goto casenove;} //utilizzata quando è richiesta una multioperazione
using namespace std;

const int dim=20;
int main(){
   
ifstream shut;
ofstream out;
int check;
char mex[dim];
bool case9=false;

system("copia.bat"); //elimina la vecchia e fa una nuova copia il file tramite cui scivere
                     //le istruzioni cosi da metterlo in una cartella in cui sia possibile leggerlo.
shut.open("shutcopy.txt"); //verifica dell'esistenza del suddetto file da leggere (una volta copiato), all'avvio del prograMMA
  if(shut.fail()) exit(1);
shut.close();

do{

   shut.open("Shutcopy.txt"); //riapre il suddetto file da leggere e verifica se c'è un'istruzione
   shut>>check; 
   if (check==0){ shut.close(); } //se nn c'è istruzione, il file viene chiuso e dopo TOT secondi viene cancellato e copiato di nuovo per ricontrollare
      else {//nel caso ci sia un istruzione da fare
           casenove:
           switch (check){
                   case 1: if (case9==false)azzera //chiude il pc
                              system("shutdown.bat");
                              if(case9==true) nove;
                           exit(1);
                           break;
                   case 2: if (case9==false)azzera //chiude i browsers
                              system("2_Chiudi_Internet.bat");
                              if(case9==true) nove ;                             
                           break;
                   case 3: if (case9==false)azzera //chiude il monitor
                               system("3_Chiudi_Monitor.bat");
                               if(case9==true) nove;                               
                           break;
                   case 4: if (case9==false)azzera //chiude winnsent
                              system("4_Chiudi_messenger.bat");
                              if(case9==true) nove;                             
                           break;
                   case 5: if (case9==false)azzera //apre winnsent
                              system("5_Apri_messenger.bat");
                              if(case9==true) nove;                             
                           break;
                   case 6: if (case9==false)azzera //chiude questo programma
                              system("6_Chiudi_Shut.bat");
                              if(case9==true) nove;                             
                           exit(1);
                           break;
                   case 7: out.open("7_mex.bat");   //lascia un messaggio a video a chi sta al pc tramite "winnsent"
                           out<<"@echo off\n@sent /u:%username% \"";
                           shut>>mex;
                              while (mex[0]!='*'){
                                  out<<mex<<" ";
                                  shut>>mex;
                                  };
                           out<<"\"\n@del 7_mex.bat \n @exit";
                           out.close();
                           if (case9==false) azzera
                              system("7_mex.bat");
                              if(case9==true) nove;
                           break;
                   case 8: out.open("8_utile.bat"); //avvia un file .bat scritto al momento
                           shut>>mex;
                              while (mex[0]!='*'){
                                    if (!strcmp(mex, "nline"))
                                       out<<"\n";
                                    else
                                         out<<mex<<" ";
                                    shut>>mex;
                                    };
                           out<<"\n@del 8_utile.bat";
                           out.close();
                           if (case9==false) azzera
                              system("8_utile.bat");
                              if(case9==true) nove;                             
                           break;
                   case 9: shut>>check; //permette due operazioni contemporaneamente. [ Esempio: 9 3 9 5 7 ciao * ]  cioè si chiude il monitor poi viene aperto il programma winnsent e inviato il messaggio.
                           case9=true;                           
                           goto casenove;
                           break;
                   }//end switch
           }// end if else
   
                   
   system("copia.bat");
   Sleep(2000);
   system("cls");
   
   
   } while (check!=1); //end do while

}//end main


BATCH CHE APRE WINSENT

Codice:
@echo off
@start "" "C:\Program Files (x86)\Winsent Messenger\winsent.exe"
@exit


BATCH CHE elimina il vecchio file e copia il nuovo, aggiornato

Codice:
@echo off

@cd /d d:
@del shutcopy.txt /f
@copy "D:\Icchembus\Programmi\Pc\Shut project\shut\shut.txt" "D:\Icchembus\Programmi\Pc\Shut project\"
@ren shut.txt shutcopy.txt


BATCH che ripristina il file originale una volta svolta l'istruzione.

Codice:
@echo off

@cd /d d:
@cd "D:\Icchembus\Programmi\Pc\Shut project\Shut\"
@echo 0 > shut.txt
@echo *>> shut.txt
@echo ----- >> shut.txt
@echo "0 - aperto" >> shut.txt
@echo "1 - chiude" >> shut.txt
@echo "2 - ie" >> shut.txt
@echo "3 - monitor" >> shut.txt
@echo "4 - messenger OFF" >> shut.txt
@echo "5 - messenger ON" >> shut.txt
@echo "6 - no shut" >> shut.txt
@echo "7 - mex" >> shut.txt
@echo "8 - 8_utile" >> shut.txt
@echo "9 - 9 4 9 5 7 ciao * " >> shut.txt
exit



QUINDI LA MIA DOMANDA.. è PERCHè WINSENT TIENE IMPEGNATO IL FILE SHUTCOPY.TXT SE NON ENTRANO MAI IN CONTATTO DIRETTAMENTE?!?!

se lo fa solo con la sezione DOPPIA ISTRUZIONE forse è dovuta alla dinamica effettuata per ottenere la doppia istruzione... PERCHè!!!!!!?!?!?!?!?!!?!?!?

Grazie a chiunque legga e a chi ci ha provato!!!
Top
Profilo Invia messaggio privato MSN
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 10225
Residenza: Tokelau

MessaggioInviato: 08 Gen 2014 09:37    Oggetto: Rispondi citando

non è che abbia capito molto, però mi colpisce che dentro il bat '7_mex' metti la cancellazione di se stesso (del 7_mex.bat) e mi sembra che questo è improbabile che avvenga...
Ti conviene evitare la cancellazione del bat, semplicemente riscrivilo da capo ogni volta che ti serve...
Top
Profilo Invia messaggio privato HomePage
er maximo
Semidio
Semidio


Registrato: 15/01/08 17:16
Messaggi: 268

MessaggioInviato: 09 Gen 2014 02:34    Oggetto: Rispondi citando

Grazie per la risposta!!

Cerco di spiegare meglio:

Qusta applicazione mi permette di effettuare operazioni prestabilite, non fa altro che controllare, ciclicamente, un file di testo: se il file riporta come primo carattere '0' allora non succede nulla.. se invece riporta un altro numero a cui è associata una operazione allora, appunto, l'operazione viene eseguita e il file viene ri-azzerato ('0') e comincia di nuovo a controllare le varie modifiche.

Una delle operazioni prestabilite mi permette di usare più funzioni prestabilite nell'unica modifica del file.. cioè posso chiedere l'operazione "3" e "4" modificando solo una volta il file.

Il problema sorge SOLO quando chiedo si effettuare l'opeazione "5" e "x" (x=num qualsiasi) perchè il programma va a loop ripetendo sempre le due operazioni.

So anche la causa:

Il file che viene letto, non può essere modificato, e quindi non può essere azzerato.. quindi finite le operazioni, il programma troverà sempre quelle due istruzioni da fare perchè, appunto, non viene azzerato in quanto non può essere modificato.
Il motivo è che l'operazione 5, chiama un bat che apre un programma, winsent.
Non so per quale assurdo motivo ma winsent "tiene impegnato" il file che deve essere azzerato rendendolo così immune alle modifiche.. (so che è così perchè usando il programma "unlocker" ho scoperto che è proprio winsent il colpevole).

Da dire, però, che winsent se chiamato senza l'operatore che mi permette di chiamare più operazioni prestabilite (quindi se è solo lui come istruzione da eseguire), funziona regolarmente, senza darmi problemi.

Quindi l'errore è per forza di cose nel codice.. ma non lo vedo...

(winsent è un programma che permette lo scambio di messagggi tra pc di una stessa rete... XP lo ha gia come funzione predefinita del sistema operativo, mentre per 7 c'è bisogno di un'applicazione esterna, appunto, WINSENT)
---------

Grazie per la diritta del bat
--------


Attendo notizie, spero positive.. grazie ancora Smile
Top
Profilo Invia messaggio privato MSN
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 10225
Residenza: Tokelau

MessaggioInviato: 09 Gen 2014 10:25    Oggetto: Rispondi citando

e se invece di creare un bat temporaneo che lancia con start un altro processo che lancia a sua volta winsent non puoi lanciare direttamente winsent? Magari semplificando funziona... Rolling Eyes
Top
Profilo Invia messaggio privato HomePage
er maximo
Semidio
Semidio


Registrato: 15/01/08 17:16
Messaggi: 268

MessaggioInviato: 10 Gen 2014 00:11    Oggetto: Rispondi citando

il system("C:\XX\XX\XX\PROG.EXE"); non va bene...

come posso fare per fargli accettare un percorso in una determinata cartella!??!
(per questo ho creato il bat..)
Top
Profilo Invia messaggio privato MSN
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 10225
Residenza: Tokelau

MessaggioInviato: 10 Gen 2014 09:42    Oggetto: Rispondi citando

e perché non dovrebbe andare?
(nota: occhio che in C tutti i caratteri \ nelle stringhe vanno 'raddopiati', dato che il carattere \ è il carattere di "escape" di stringa)
quindi prova con
Codice:
system("C:\\XX\\XX\\XX\\PROG.EXE");


Ciao
Top
Profilo Invia messaggio privato HomePage
er maximo
Semidio
Semidio


Registrato: 15/01/08 17:16
Messaggi: 268

MessaggioInviato: 11 Gen 2014 03:17    Oggetto: Rispondi citando

Sono riuscito a far funzionare system("\042C:\\XX\\XX\\XX\\PROG.EXE\042"); (con l'aggiunta di \042 che rappresenta le virgolette in ottale, grazie alle quali posso inserire un percordo contenete spazi).

Il lato negativo è che aprendo un applicazione dal programma scritto in c++ impedisce il proseguimento del codice stesso finchè il programma aperto non viene chiuso.

Il positivo è che usando la funzione MULTIOPERAZIONE non ho intoppi... questo significa che i qualche modo è il bat che da problemi.... CREDO...
Top
Profilo Invia messaggio privato MSN
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 10225
Residenza: Tokelau

MessaggioInviato: 12 Gen 2014 19:36    Oggetto: Rispondi citando

ok, per rendere il programma chiamato 'asincrono' rispetto al tuo, penso tu possa riuscirci con
Codice:
system("start \042C:\\XX\\XX\\XX\\PROG.EXE\042");
(il comando start serve proprio a creare un processo separato senza lasciare in attesa di risposta il chiamante)
Top
Profilo Invia messaggio privato HomePage
er maximo
Semidio
Semidio


Registrato: 15/01/08 17:16
Messaggi: 268

MessaggioInviato: 13 Gen 2014 13:18    Oggetto: Rispondi citando

system("start \042\042 \042C:\Program Files (x86)\Winsent Innocenti\winnosent.exe\042")
(la parte in blu era necessaria perchè a quanto pare senza un titolo lìaplicazione non parte e il prompt resta aperto senza mai chiudersi).

La stringa va bene.. ma il problema non cambia:
"shotcopy.txt" resta ancora legata al programma "winnosent.exe" e quindi non può essere cancellata.

..riflettendo le mie osservazioni del post precedente era sbagliate in quanto bloccandosi il programma, chiamato da system();, io DOVEVO chiunderlo per far continuare il codice quindi è implicito che il ".txt" venissere "rilasciato" e quindi con la possibilità di essere soggetto a modifiche.. era una mera illuzione.

A questo punto il problema sta nel codice:
perchè se chiamo winnosent senza usare il "case 9" dello switch allora funziona; mentre se uso il "case 9" (e una delle operazioni è appunto chiamare "winnosent") allora il .txt viene bloccato e le istruzioni ripetute a loop.

Ho provato anche con il debuging del DEV e le istruzioni vanno come devono... forse mi sfugge qualche regola/bug del compilatore(?).. anche se motlo più probabile è il codice che fa difetto..

Vedi nulla di sbagliato nel codice?

Grazie per il tempo che mi dedichi Cool

P.S. alla fine ho seguito il tuo consiglio di non cancellare i file 7 e 8 .bat tanto alla fine, come hai detto, vengono riscritti.

Riposto il codice:

Codice:

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include <fstream>
#define azzera {shut.close(); system("Azzera_flash.bat");} //quando non è richiesta una multioperazione
                                                           //(o quando è l'ultima operazione della multioperazione
                                                           //"azzera flash" ripristina il file originale modificato
                                                           //una volta eseguita l'istruzione.
#define nove {shut>>check; case9=false; goto casenove;} //utilizzata quando è richiesta una multioperazione
using namespace std;

const int dim=20;
int main(){
   
ifstream shut;
ofstream out;
int check;
char mex[dim];
bool case9=false;


system("copia.bat"); //elimina la vecchia e fa una nuova copia il file tramite cui scivere
                     //le istruzioni cosi da metterlo in una cartella in cui sia possibile leggerlo.
shut.open("shutcopy.txt"); //verifica dell'esistenza del suddetto file da leggere (una volta copiato), all'avvio del prograMMA
  if(shut.fail()) exit(1);
shut.close();

do{

   shut.open("Shutcopy.txt"); //riapre il suddetto file da leggere e verifica se c'è un'istruzione
   shut>>check; 
   if (check==0){ shut.close(); } //se nn c'è istruzione, il file viene chiuso e dopo TOT secondi viene cancellato e copiato di nuovo per ricontrollare
      else {//nel caso ci sia un istruzione da fare
           casenove:
           switch (check){
                   case 1: if (case9==false)azzera //chiude il pc
                              system("shutdown.bat");
                              if(case9==true) nove;
                           exit(1);
                           break;
                   case 2: if (case9==false)azzera //chiude i browsers
                              system("2_Chiudi_Internet.bat");
                              if(case9==true) nove ;                             
                           break;
                   case 3: if (case9==false)azzera //chiude il monitor
                               system("3_Chiudi_Monitor.bat");
                               if(case9==true) nove;                               
                           break;
                   case 4: if (case9==false)azzera //chiude winnsent
                              system("4_Chiudi_messenger.bat");
                              if(case9==true) nove;                             
                           break;
                   case 5: if (case9==false)azzera //apre winnsent
                              //system("5_Apri_messenger.bat");
                              system("start \042\042 \042C:\\Program Files (x86)\\Winsent Messenger\\winsent.exe\042");
                              if(case9==true) nove;                             
                           break;
                   case 6: if (case9==false)azzera //chiude questo programma
                              system("6_Chiudi_Shut.bat");
                              if(case9==true) nove;                             
                           exit(1);
                           break;
                   case 7: out.open("7_mex.bat");   //lascia un messaggio a video a chi sta al pc tramite "winnsent"
                           out<<"@echo off\n@sent /u:%username% \"";
                           shut>>mex;
                              while (mex[0]!='*'){
                                  out<<mex<<" ";
                                  shut>>mex;
                                  };
                           out<<"\"\n@exit";
                           //out<<"\"\n@del 7_mex.bat \n @exit";
                           out.close();
                           if (case9==false) azzera
                              system("7_mex.bat");
                              if(case9==true) nove;
                           break;
                   case 8: out.open("8_utile.bat"); //avvia un file .bat scritto al momento
                           shut>>mex;
                              while (mex[0]!='*'){
                                    if (!strcmp(mex, "nline"))
                                       out<<"\n";
                                    else
                                         out<<mex<<" ";
                                    shut>>mex;
                                    };
                           //out<<"\n@del 8_utile.bat";
                           out.close();
                           if (case9==false) azzera
                              system("8_utile.bat");
                              if(case9==true) nove;                             
                           break;
                   case 9: shut>>check; //permette + operazioni contemporaneamente. [ Esempio: 9 3 9 5 7 ciao * ]
                                        //"3" si chiude il monitor "5" poi viene aperto il programma
                                        // winnsent e "7" inviato il messaggio.
                           case9=true;                           
                           goto casenove;
                           break;
                  case 10: if (case9==false)azzera //crea uno screenshot del presente computer e lo mette nella cartella condivisa
                              system("10_screenshot");
                              if(case9==true) nove;
                           break;
                  case 11: if (case9==false)azzera //elimina lo screenhot creato da case10
                              system("11_elimina_screenshot");
                              if(case9==true) nove;
                           break;
                   }//end switch
           }// end if else
   
                   
   system("copia.bat");
   Sleep(2000);
   system("cls");
   
   
   } while (check!=1); //end do while

}//end main
Top
Profilo Invia messaggio privato MSN
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 10225
Residenza: Tokelau

MessaggioInviato: 13 Gen 2014 14:14    Oggetto: Rispondi citando

(... a parte che al posto di \042 puoi comunque mettere \" che è più leggibile secondo me...)
in ogni caso non mi è chiaro come il programma winnosent.exe possa mandare un messaggio se non gli passi i parametri da linea di comando... e poi non mi è chiaro perché dovrebbe accedere al file .txt con cui ha nulla a che fare... Confused (oppure winnosent.exe è un programma che è stato scritto apposta per leggere quel file di testo?)
Top
Profilo Invia messaggio privato HomePage
er maximo
Semidio
Semidio


Registrato: 15/01/08 17:16
Messaggi: 268

MessaggioInviato: 14 Gen 2014 00:53    Oggetto: Rispondi citando

\" non funzionava quando ci ho provato.. dopo con l'aggiunta di doppioslash non ho pensato a ritorare sulla strada facile

winnsent è un programma che permette lo scambio di messaggi tra diversi compter collegati alla stessa rete.
XP, ha questo comando gia nel sistema stesso. Infatti basta digitare nel prompt net send nomedelpccolelgatoallarete MESSAGGIO.
Vista e successivi non hanno questa opzione.
Ricorro quindi a questo programma che "integra nel prompt" l'operazione.
Grazie a winnosent si possono inviare e ricevere i messaggi (ma deve essere aperto per ricevere).

Winnosent non si collega a nessun file, ha solo l'obbiettivo di inviare e ricevere messaggi attraverso la rete locale.
Non so perchè si collega al "shutcopy.txt", l'unicio collegamento con il file che ha è tramite il programma c++.


Come faccio funzionare winnosent
per inviare e messaggi devi digitae da prompt la seguente sintassi:
sent /u: nomedelcompuetercollegatoallarete "messaggio" (il file .bat lo scrivo volta per volta tramite il "case 7"


Ecco come va:

- come singola operazione apro il programma:

io, persona fisica, modifico un file di testo (shut.txt) che viene copiato periodicamente e rinominato "shutcopy.txt".
"shutcopy.txt" viene aperto ( shut.open("Shutcopy.txt"); ) dal programma in c++, viene letto. se non vi sono operazioni allora il file viene chiuso ( shut.close(); ).
Passa tot tempo.
Viene cancellato e sostiuito con una copia più aggiornata.
Viene aperto , questa volta abbiamo un istruzione: quella di aprire winnosent.
Il programma va nella sezione delle operazioni dedite a quell'istruzione e come prima cosa viene chiuso il file e viene ripristinato il file "shut.txt" (quello originale, fonte delle copie).
Di seguito viene aperto winnosent.
Finite le operazioni si ricomincia.. dopo tot tempo il file shutcopy viene cancellato e risostituito per verificare operazioni da fare....

- come multi operazione apro il programma e avvio un bat qualsiasi (mettiamo un bat che mi crea una certella sul desktop):

Modifico il file shut.txt, quandi la sua versione aggiorata viene copiata.
Il file "shutcopy.txt" viene aperto dal prog c++.
Prima operazione è mettere su TRUE un bool che mi avvisa che ci sono due operazioni da fare.
Segue quindi l'avvio della prima operazione, winnosent viene aperto (la differenza è che adesso (rispetto alla singola operazione ), shutcopy.txt è ancora aperto).
Essendo l'operazione succssiva da effettuare l'ultima, allora viene chiuso il shutcopy.txt, azzerato shut.txt e avviata l'ultima operazione.

ricomincia da capo (con lìhandcap di non poter modificare shutcopy perchè occupato..quindi loop)

---------------
Con un nuovo Debuging fatto, noto che quando il file è aperto (shut.open() ) e si apre anche winnsent allora "winnsent lo trova aperto e se ne impadronisce anche lui".. mentre se il file viene chiuso shut.close() prima di aprire winnsent, allora non viene visto e non viene occupato.

Adesso..dalle nuove delucidazioni dovrei modificare il programma affinchè salvi il contenuto dello shutcopy in un char[xx] e dopo chiuderlo, il file. Evito così il problema.

MA.. il dubbio resta, perchè winsent fa suo il file aperto da shut.open() se lo trova aperto.... questo è il BUG del compilatore di cui parlavo prima allora... oppure ci sono "forze" dietro che non conosco..

grazie del tempo dedicatomi e di tutti i consigli per una migliore scrittura del codice..


spero di averti dato un quadro chiaro.. diciamo che il problema è "risolto"..resta solo quella domanda sulla quale c'è dell'odio coltivato e maturato.
Top
Profilo Invia messaggio privato MSN
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 10225
Residenza: Tokelau

MessaggioInviato: 14 Gen 2014 10:14    Oggetto: Rispondi citando

ok, allora direi che potresti evitare anche il file batch per lanciare il comando 'sent' e fare direttamente qualcosa del tipo
Codice:
system("start \"\" sent /u: nomedelcompuetercollegatoallarete \"messaggio\"");

così ti togli di torno un altro bat inutile...
Top
Profilo Invia messaggio privato HomePage
er maximo
Semidio
Semidio


Registrato: 15/01/08 17:16
Messaggi: 268

MessaggioInviato: 15 Gen 2014 19:56    Oggetto: Rispondi citando

grazie tante, quando modificherò il programma ti farò sapere com'è andata!!

Grazie ancora!
Top
Profilo Invia messaggio privato MSN
er maximo
Semidio
Semidio


Registrato: 15/01/08 17:16
Messaggi: 268

MessaggioInviato: 22 Gen 2014 11:42    Oggetto: Rispondi

Ho provato a fare le modifiche affinche il file restasse aperto solo il tempo necessario per passare tutto su una stringa.
Fatto ciò il programma funzionava "egregiamente" ma andando a fare piccole modifiche di qua e di la per migliorare, sono incappato in un errore che non dovrebbe esserci..

Codice:
#include <iostream> // gianluca
#include <stdlib.h>
#include <windows.h>
#include <fstream>
#include "D:\Programmi\Dev\Carminefunz.cpp"
#define azzera {shut.close(); system("Azzera_Gianluca.bat"); }
#define nove { case9=false; goto casenove;}
#define terminatore "*fine*"
#define acapo "nline"

using namespace std;

const int dimacapo=5; //dimensione operatore per traduzione da "acapo"->"\n"
const int dim=500;// grandezza random
const int dimex=500; //grandezzaa massmi carattere da copiare

int main(){
   
ifstream shut;
ofstream out;
int dimeffettivamex;
int indicemex=0, check=0, unita=0;
char *mex=new char[dimex];
char *numchar=new char[dimex];
bool case9=false;

system("copia.bat");
system("cls");
shut.open("Shutcopy.txt");
  if(shut.fail()) exit(1);
shut.close();

do{
system("pause");

   delete[] mex;
   mex=new char[dimex];
   indicemex=0; unita=0;
   shut.open("Shutcopy.txt");
   shut>>mex;
   
   
   
   if (mex[0]=='0' || mex[0]==0){ shut.close();}
      else {// inizio else, si chiude alle fine
                               //copio le istruzioni del file in una stringa, fino al terminatore
           char *temp=new char[dim];
           while(true){//inizio while

               temp[0]=' '; temp[1]='\0'; //inizializza temp per dare uno spazio
               strcat(mex, temp);//aggiungendolo alla stringa
               shut>>temp;
               strcat(mex, temp);
               if (!strcmp(temp, terminatore)){
                  delete [] temp;
                  break;
                  }   
               }//fine while

           dimeffettivamex=strlen(mex);   
           azzera             //chiude il file e lo resetta

           casenove:
           unita=0;
         
          {//inizio blocco
          //viene cercata la prima istruzione richiesta
          char *u=new char; bool *enne=new bool; *enne=1; int *conto=new int; *conto=0;

           for (int i=0; *enne && mex[indicemex]!='\0' && dimeffettivamex>=indicemex ; i++){//inizio for
               *u=mex[indicemex+i];
               if (*u=='0'|| *u=='1'|| *u== '2' ||*u== '3'|| *u== '4'|| *u== '5'|| *u== '6'|| *u== '7'|| *u== '8'|| *u== '9') //if (*u>=0 && *u<=9)
                  unita++;
               else
                  if (unita==0 && *u==' ') *conto++;
                  else *enne=0;
               }//fine for
           indicemex+=*conto;
           delete enne; delete conto; delete u;
           }//fine blocco
           
           delete []numchar;
           numchar=new char[unita+1]; 
/*---------------------------------------------------------------*/
/*----------------------- P R O B L E M A -----------------------*/
/*---------------------------------------------------------------*/
           /*for (int i=0; i<unita; i++)
               numchar[i]=mex[indicemex+i];*/
           strncpy(numchar, mex, unita); //numchar racchiude il numero dell'istruzione (in caratteri) trovata
cout<<"\nNUMCHAR STRLEN:"<<strlen(numchar)<<endl;
/*---------------------------------------------------------------*/
/*------anche se "unita" è 1, numchar è sempre di 3 unita--------*/
/*---------------------------------------------------------------*/

//cout<<"\nNumchar:"<<numchar<<"\nMex:"<<mex<<"\nunita:"<<unita<<endl;

           switch (MioNS::conv_numchar_num(numchar)){ //converte i numeri di caratteri, in interi
                                                      //entra una stringa, ne viene letta la dimensione
                                                      //(quindi in base alla quantità di unità che posside, il numero viene convertito)
                   case 1: indicemex+=2; 
                           system("shutdown.bat");
                           if(case9==true) {nove};
                           break;
                           
                   case 2: indicemex+=2;
                           system("2_Chiudi_Internet.bat");
                           if(case9==true) {nove};
                           break;
                           
                   case 3: indicemex+=2;
                           system("3_Chiudi_Monitor.bat");
                           if(case9==true) {nove};
                           break;
                   /*
                   case 4: if (case9==false){ azzera}                  \\non c'è bisogno di messenger su XP
                           system("4_Chiudi_messenger.bat");
                           if(case9==true) {nove};
                           break;
                   case 5: if (case9==false){ azzera}
                           system("5_Apri_messenger.bat");
                           if(case9==true) {nove};
                           break;
                           */
                   case 6: indicemex+=2;
                           system("6_Chiudi_Shut.bat");
                           if(case9==true) {nove};
                           exit(1);
                           break;
                   case 7: out.open("7_mex.bat");
                           out<<"@echo off\n@net send %computername% ";
                           indicemex++;
                           while (mex[indicemex]!='*'){
                                  out<<mex[indicemex];
                                  indicemex++;
                                  };
                           out.close();
                           indicemex+=2;
                           system("7_mex.bat");
                           if(case9==true) {nove};
                           break;
                   case 8: out.open("8_utile.bat");
                           indicemex+=2;
//cout<<"\nindic:"<<indicemex<<endl;
                           {char *temp=new char[dimacapo+1];//inizio blocco
//cout<<"\nmex[ind]:"<<mex[indicemex]<<endl;
                              while (mex[indicemex]!='*'){//inizio while
                                    for (int i=0 ; i<dimacapo; i++)
                                        temp[i]=mex[indicemex+i];
                                    if (strncmp(temp, acapo, dimacapo)==0) //acapo -> #define
                                       {
                                       out<<"\n";
                                       indicemex+=dimacapo+1;
                                       }
                                    else {
                                         out<<mex[indicemex];
                                         indicemex++;
                                         }
                                    };//end while
                              delete[] temp;
                              }//end blocco
                           out.close();
//cout<<"\noutcloese:"<<endl;
                           indicemex+=2;// "*" e " "
                           system("8_utile.bat");
//cout<<"\nsyst:"<<endl;
                           if(case9==true) {nove};
                           break;
                   case 9: indicemex++;
                           case9=true;
                           goto casenove;
                           break;
                  case 10:
                           indicemex+=3;
                           system("10_screenshot.bat");
                           if(case9==true) {nove};
                           break;
                  case 11:
                           indicemex+=3;
                           system("11_elimina_screenshot.bat");
                           if(case9==true) {nove};
                           break;
                  case 12:
                           indicemex+=3;
                           out.open("12_screenshot_loop.bat");
                           out<<"@echo off\n@nircmdc.exe loop ";
                           {//inizio blocco
                           bool *enne=new bool; *enne=true; char *u=new char;
                           for (int j=0; j<2; j++){//inzio for
                             *enne=1;
                             while(*enne){//inizio while 2
                               *u=mex[indicemex];
                               if (*u=='0'|| *u=='1'|| *u== '2' ||*u== '3'|| *u== '4'|| *u== '5'|| *u== '6'|| *u== '7'|| *u== '8'|| *u== '9')
                                  out<<mex[indicemex];
                               else {*enne=0; out<<" ";}
                               indicemex++;
                               }//end while
                             }//end for
                             delete enne;
                             delete u;
                             }//end blocck
                           out<<"savescreenshot \"\\\\%computername%\\shut\\scr~$currdate.MM_dd_yyyy$ - ~$currtime.HH_mm_ss$.png\"";
                           out.close();
                           indicemex++; //solo 1 perchpù prima è gia andato avanti
                           system("12_screenshot_loop.bat");
                           if(case9==true) {nove};
                           break;
                  default: //system("Azzera_Gianluca.bat");
                           indicemex++;
                           cout<<"\n DEAFAUL \n";
                           break;
//                  case 13: RITARTDO

                   }//end switch
           }// end if else
   
   

   system("copia.bat");
  // system("cls");
   Sleep(3000);

   } while (1);//end do while

}//end main


La sezione evidenziata con "problema", è il problema Rolling Eyes

Quella variabile dinamica serve a contenere i numeri sottoforma di char al fine di essere trasformati in interi.

Ha sempre funzionato ma da quste modiche (fatte un po ovunque, quindi non saprei dire dove si trova l'errore) mi resta costantemente di 3 unita..

non so il perchè....
dealloco la vecchia, alloco la nuova (con dimensione delle unità+1) ma niente...
Top
Profilo Invia messaggio privato MSN
Mostra prima i messaggi di:   
Nuovo argomento   Rispondi    Indice del forum -> Programmazione Tutti i fusi orari sono GMT + 1 ora
Pagina 1 di 1

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi