Precedente :: Successivo |
Autore |
Messaggio |
er maximo Semidio
Registrato: 15/01/08 17:16 Messaggi: 268
|
Inviato: 08 Gen 2014 00:56 Oggetto: applicazione aperta da batch impedisce la modifica di un fil |
|
|
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 |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11566 Residenza: Tokelau
|
Inviato: 08 Gen 2014 09:37 Oggetto: |
|
|
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 |
|
|
er maximo Semidio
Registrato: 15/01/08 17:16 Messaggi: 268
|
Inviato: 09 Gen 2014 02:34 Oggetto: |
|
|
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 |
|
Top |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11566 Residenza: Tokelau
|
Inviato: 09 Gen 2014 10:25 Oggetto: |
|
|
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... |
|
Top |
|
|
er maximo Semidio
Registrato: 15/01/08 17:16 Messaggi: 268
|
Inviato: 10 Gen 2014 00:11 Oggetto: |
|
|
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 |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11566 Residenza: Tokelau
|
Inviato: 10 Gen 2014 09:42 Oggetto: |
|
|
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"); |
|
|
Top |
|
|
er maximo Semidio
Registrato: 15/01/08 17:16 Messaggi: 268
|
Inviato: 11 Gen 2014 03:17 Oggetto: |
|
|
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 |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11566 Residenza: Tokelau
|
Inviato: 12 Gen 2014 19:36 Oggetto: |
|
|
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 |
|
|
er maximo Semidio
Registrato: 15/01/08 17:16 Messaggi: 268
|
Inviato: 13 Gen 2014 13:18 Oggetto: |
|
|
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
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 |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11566 Residenza: Tokelau
|
Inviato: 13 Gen 2014 14:14 Oggetto: |
|
|
(... 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... (oppure winnosent.exe è un programma che è stato scritto apposta per leggere quel file di testo?) |
|
Top |
|
|
er maximo Semidio
Registrato: 15/01/08 17:16 Messaggi: 268
|
Inviato: 14 Gen 2014 00:53 Oggetto: |
|
|
\" 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 |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11566 Residenza: Tokelau
|
Inviato: 14 Gen 2014 10:14 Oggetto: |
|
|
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 |
|
|
er maximo Semidio
Registrato: 15/01/08 17:16 Messaggi: 268
|
Inviato: 15 Gen 2014 19:56 Oggetto: |
|
|
grazie tante, quando modificherò il programma ti farò sapere com'è andata!!
Grazie ancora! |
|
Top |
|
|
er maximo Semidio
Registrato: 15/01/08 17:16 Messaggi: 268
|
Inviato: 22 Gen 2014 11:42 Oggetto: |
|
|
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
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 |
|
|
|