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: 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: 10224
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