Newsgroup: it.comp.programmare.win32
Titolo: attivo????

Scusate ragazzi aiutatemi.
Ho commissionato un CD dimostrativo per l'associazione di cui faccio parte,
ora il problema e' questo: funziona correttamente solo a 1024x768 altrimenti
impalla tutto. Il tipo che lo ha preparato ci ha mollato perche' con la
risoluzione corretta funziona perfettamente.
Sono riuscito (con il vostro aiuto) a realizzare un programmino che cambi lo
schermo lo porti
a 1024x768 e poi con un bel system("comando");  avviare l'eseguibile del CD.
Ora pensavo di fare una verfica se il programma lanciaato col
system("comando");  in un bel ciclo infinito.
Ho gia cercato su google ma non ho trovato nulla, possibile che non esista
un modo semplice per verificare se un deteminato programma e' attivo?
Per ripristinare anche la vecchia risoluzione al termine.
Vi prego aiutatemi, il programmino dovrebbe funzionare su Win98/Me/Xp.
Ringrazio anticipatamente chiunque possa e vogli darmi una mano.
Ciao

 Ciao
ciao.


Grazie, ma siccome sono un neofita dall' MSDN non ho capito bene quale
parametro dovrei controllare, forse dovrei fare qualche controllo
sull'handle?
Oppure semplicemente setta una variabile da controllare?
Scusa per la domanda che ti sembrera' banale, ma ho iniziato a vedere le API
solo per risolvere questo problemino.
Ciao.
PS uso VC++ 6.0

 Ciao.
ciao.


L'applicazione non attende la chiusura neanche se faccio un controllo in un
ciclo infinito.
Anzi prima chiude il mio eseguibile riportando lo schermo alla
configurazione precedente e poi parte l'eseguibile.
Ti posto il codice sperando che tu possa dirmi dove e' l'errore.
#include "Rvideo.h"
char eseguibile[20]="programma";
bool staus=true;
int WINAPI WinMain( HINSTANCE hInstance,   // Instance
     HINSTANCE hPrevInstance,  // Previous Instance
     LPSTR  lpCmdLine,   // Command Line Parameters
     int   nCmdShow)   // Window Show State
{
[CUT]  // setto e cambio la risoluzione
SHELLEXECUTEINFO start;
   memset (&start, 0, sizeof (start));
   start.cbSize = sizeof (start);
   start.lpVerb = "open";
   start.lpFile = eseguibile;
   start.fMask = SEE_MASK_NOCLOSEPROCESS;
   start.nShow = SW_SHOWDEFAULT;
ShellExecuteEx(&start);
 for(;;)// ciclo infinito per controllo
 {
  controllo(start,status,devOriginalMode);
  if(!status)
   goto stop;
 };
stop:
 return 0;       // Exit The Program
}
// FUNZIONE DI CONTROLLO
bool controllo(SHELLEXECUTEINFO &start, bool &status,DEVMODE
&devOriginalMode)
{
 DWORD code;
 GetExitCodeProcess(start.hInstApp ,&code);
 if(code==STILL_ACTIVE)
  {
   status = true;// l'applicazione è ancora attiva
  }else{
     status = false;//ti ritorna il valore con cui è terminata,quello del
return
   ChangeDisplaySettings( &devOriginalMode, 0 );
   }
 return status;
}

 >
Scusa ho finalmente capito perche' non funziona.
GetExitCodeProcess: sincronizza e compie la verifica solo su NT, mentre il
mio programma dovrebbe girare su Win98/ME/XP
Non esiste un' equivalente?
Ciao.


[cut]
scusa ho scritto un emerita c*****a :-(
bisogna controllare shellexecuteinfo::hProcess
questo l'ho provato e funge:
SHELLEXECUTEINFO info;
 ZeroMemory(&info,sizeof(SHELLEXECUTEINFO));
 info.cbSize=sizeof(SHELLEXECUTEINFO);
 info.fMask=SEE_MASK_NOCLOSEPROCESS;
 info.lpVerb=_T("open");
 info.lpFile=_T("FileMagic.exe");
 info.nShow=SW_SHOW;
 ShellExecuteEx(&info);
 DWORD code=0;
 do
 {
  GetExitCodeProcess(info.hProcess,&code);
 }while(code==STILL_ACTIVE);

  }while(code==STILL_ACTIVE);
ma non fa prima a utilizzare WaitForSingleObject() con INFINITE, invece
del ciclo?
--
Faber

 Faber
ciao.

 volte;non volevo scrivere cretinate,anche se poi .....
Per questo genere di problema, e' bene usare WaitForSingleObject.
L'API in questione consuma poche risorse di sistema ed e' senz'altro
migliore di un "busy wait".
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Grazie ho risolto ciao.