Da li je program vec pokrenut - vase misljenje

  • 15 odgovora
  • 4.208 pregleda
Da li je program vec pokrenut - vase misljenje 22.08.2006. u 09:42 · pre 245 meseci #1
Pozdrav svima:

Zelim da provjerim da li je program npr. ( "ime_programa.exe") vec pokrenut...

Ja sam to uradio ovako:

if( ::FindWindow(NULL, "ime_programa")==0) // <-- znaci da nije pokrenut

Mene interesuje sta mislite o ovom nacinu, i imate li neko bolje rijesenje....??
Potpis
kod žorža ti je ka' u banku!!
oko? sto ce ti oko??
Re: Da li je program vec pokrenut - vase misljenje 22.08.2006. u 14:27 · pre 245 meseci #3
Moze i sa Mutex-ima (posroje neki razlozi zbog kojih je taj nacin bolji):

Code:

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) 
{ 
     AnsiString progName = ExtractFileName( Application->ExeName ); 
     HANDLE hMutex = CreateMutex( NULL, true, progName.c_str()); 

     if( hMutex != NULL ) 
     { 
         if( GetLastError() == ERROR_ALREADY_EXISTS ) 
         { 
             //* Or replace this by bringing 
             //* the other program forward. 
             Application->MessageBox( "Program Running!", 
                 progName.c_str(), MB_OK ); 
         } 
         else 
         { 
             try 
             { 
                 Application->Initialize(); 
                 Application->Title = progName; 
                 Application->CreateForm(__classid(TFormMain),&FormMain); 
                 Application->Run(); 
             } 
             catch (Exception &exception) 
             { 
                 Application->ShowException(&exception); 
             } 
         } 
         CloseHandle( hMutex ); 
     } 
     return 0; 

}
Re: Da li je program vec pokrenut - vase misljenje 22.08.2006. u 15:35 · pre 245 meseci #4
Citat:
Prilikom pokretanja možeš i pregledati listu aktivnih procesa...


Pa dobro, ali ja to trebam odraditi kodom u programu...
Znaci da program vidi, a ne ja...
Potpis
kod žorža ti je ka' u banku!!
oko? sto ce ti oko??
Re: Da li je program vec pokrenut - vase misljenje 22.08.2006. u 20:58 · pre 245 meseci #6
Citat:
pcaca: DART_VEJDER jel ti radis neki virus? :D
Tri teme koje si otvorio asociraju me na ponasanje virusa ;) :D


Indeed ;)
Potpis
Q: Are there really any systems where
void main() doesn't work?
A: It has been reported that programs using void main() can crash.
Q: The book I've been using, _C Programing for the Compleat Idiot_,
always uses void main().
A: Perhaps its author counts himself among the target audience.
Re: Da li je program vec pokrenut - vase misljenje 22.08.2006. u 23:22 · pre 245 meseci #7
:-) :-)

Ma kakav virus....

Po meni - uzaludno trosenje vremena...

radim program, pa mi treba vasa pomoc...
Potpis
kod žorža ti je ka' u banku!!
oko? sto ce ti oko??
Re: Da li je program vec pokrenut - vase misljenje 23.08.2006. u 14:30 · pre 245 meseci #10
> Zelim da provjerim da li je program npr. ( "ime_programa.exe") vec pokrenut...

> if( ::FindWindow(NULL, "ime_programa")==0) // <-- znaci da nije pokrenut
> Mene interesuje sta mislite o ovom nacinu, i imate li neko bolje rijesenje....??

FindWindow i FindWindowEx nisu previše pouzdane metode, bolje je koristiti neku od metoda za enumeraciju svih procesa u sistemu. Pogledaj CreateToolhelp32Snapshot i EnumProcesses, dati su i primeri u MSDNu. Ako imaš kontrolu nad oba programa onda je najlakše da koristiš mutexe, kao što je neko već napisao.
Potpis
Do not be a help vampire (http://slash7.com/pages/vampires), use the google.

How to ask questions the smart way:
http://www.catb.org/~esr/faqs/smart-questions.html
http://solair.eunet.rs/~fangor...stions/smart-questions.sr.html
Re: Da li je program vec pokrenut - vase misljenje 23.08.2006. u 16:56 · pre 245 meseci #11
Mutexi su elegantno resenje, pogotovo sto mnogi Installer-i imaju mogucnost
da iskoriste Mutex (najobicniji string) vaseg programa da vas obavesti da "je program
vec pokrenut, i da morate uklnoniti sve njegove instance pre nastavka instalacije".

FindWindow (koliko se secam), zaista ima neke probleme kod Borlanda, a mozda i sire...
Re: Da li je program vec pokrenut - vase misljenje 24.08.2006. u 09:25 · pre 245 meseci #12
Hmmm.. pokusao sam tako, ali mi samo prvi put fino radi...tj. ako program nije pokrenut - on ga pokrene...

To sam uradio na ovaj nacin (vjerovatno grijesim negdje??)

Code:




     AnsiString progName = "Neki_program";
     HANDLE hMutex = CreateMutex( NULL, true, progName.c_str());

     if( hMutex != NULL )
     {
         if( GetLastError() == ERROR_ALREADY_EXISTS )
         return;
         else
         {
         String FN= NEKI_PATH + "Neki_program";
         String Ac="open";
         ShellExecute(0,Ac.c_str(),FN.c_str(),"","",1);
         }
   }   




Da li ste ovako mislili nesto??

[Ovu poruku je menjao DART_VEJDER dana 24.08.2006. u 11:30 GMT+1]
Potpis
kod žorža ti je ka' u banku!!
oko? sto ce ti oko??
Re: Da li je program vec pokrenut - vase misljenje 24.08.2006. u 11:24 · pre 245 meseci #14
Čekaj, nisam te razumeo:

Da li želiš da iz JEDNOG programa vidiš da li je DRUGI pokrenut (pa ako nije
da ga pokreneš), ili želiš da ograničiš svoj program na samo jednu instancu?


P.S. Ako je u pitanju ono prvo, da li si ti autor tog DRUGOG programa ili je to
neki "strani" program?

Re: Da li je program vec pokrenut - vase misljenje 24.08.2006. u 15:13 · pre 245 meseci #15
Izvinjavam se ako nisam najbolje objasnio, ali zelim ono prvo...

Mislio sam da ste shvatili to...

Da, ja sam autor i jednog i drugog....
Potpis
kod žorža ti je ka' u banku!!
oko? sto ce ti oko??
Re: Da li je program vec pokrenut - vase misljenje 25.08.2006. u 10:08 · pre 245 meseci #16
Ma ne... Ti si se dobro izrazio, nego ja nisam dobro citao :)

Evo ti deo nekog mog starog programa, pa probaj nesto da uklopis.
Dakle, ja sam imao neki program (bio je servis) koji treba da u nekom
trenutku pokrene neki drugi program (ako nije pokrenut), ili da ga
maksimizuje i postavi na vrh, ako je bio spusten.

Valjda nisam nesto 'ispustio'...

--- PROGRAM KOJI POZIVA ---

--- CPP ---

Code:

HANDLE lanmsg = FindWindow( C(IDS_SER_MAIN_NT_SERVICE_INVOKING_CLASS).c_str(), NULL );

// dakle, ti samo zameni string (kao prosli put)
//   IDS_SER_MAIN_NT_SERVICE_INVOKING_CLASS,
//      "TLanMsgMainForm"; // <--- OVO TI JE NAZIV KLASE, A NE EXE-A, ONOG PROGRAMA KOGA POZIVAS, POGLEDAJ HELP  !!!

// Ako je program vec pokrenut - podigni ga i postavi u prvi plan!
if ( lanmsg != NULL )
{ 
   PostMessage ( lanmsg, WM_USER + 1010, 0, 0 );// < --- POSTOJAO JE NEKI RAZLOG ZASTO SAM SVE OVO RAZLOZIO U TRI KORAKA, A NE SAMO U JEDAN !!!
   PostMessage ( lanmsg, WM_USER + 1011, 0, 0 ); 
   PostMessage ( lanmsg, WM_USER + 1012, 0, 0 );
}
// ako nije pokrenut - pokreni ga!
else
{
   AnsiString Exe = ExtractFilePath( ParamStr(0) ) + C(IDS_SER_MAIN_NT_SERVICE_INVOKING_EXE_FILE);

   // IDS_SER_MAIN_NT_SERVICE_INVOKING_EXE_FILE,
   //    "lanmsg.exe";

   STARTUPINFO StartInfo;
   PROCESS_INFORMATION ProcInfo;
   memset(&ProcInfo, 0, sizeof(ProcInfo));
   memset(&StartInfo, 0 , sizeof(StartInfo));
   StartInfo.cb = sizeof(StartInfo);
   if ( ! CreateProcess( Exe.c_str(),NULL, NULL, NULL, NULL, NULL, NULL, NULL, // <--- POSTOJAO JE RAZLOG ZASTO NISAM KORISTIO ShellExecute(), mozda zatosto 
                         &StartInfo, &ProcInfo ) )
   {
      // ovo izbaci, jer je deo nekog mog starog programa
      // SystemOk = false;
      // GoSendMessageToLog( SERVICE_CREATE_PROCESS_FAILED );
   }
}


--- PROGRAM KOJI SE POKRECE/PODIZE ---

--- H ---
Code:

private:    // User declarations
        // ...
        void __fastcall WndProc( TMessage & );
        // ...


--- CPP ---
Code:

void __fastcall TLanMsgMainForm::WndProc( TMessage &Msg )
{
   switch ( Msg.Msg )
   {
      // ...
      case   WM_USER + 1010:
         ReloadView(); // <--- OVO JE BILO SPECIFICNO ZA MOJ PROGRAM, PA MOZES IZBACITI CEO case BLOK
         break;

      case   WM_USER + 1011:
         Application->Restore();
         break;

      case   WM_USER + 1012:
         Application->BringToFront();
         break;
      // ...
   }
   TForm::WndProc( Msg );
}

Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme