[ DART_VEJDER @ 22.08.2006. 09:42 ] @
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....??
[ itf @ 22.08.2006. 09:46 ] @
Prilikom pokretanja možeš i pregledati listu aktivnih procesa...
[ X Files @ 22.08.2006. 14:27 ] @
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; 

}
[ DART_VEJDER @ 22.08.2006. 15:35 ] @
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...
[ pcaca @ 22.08.2006. 16:50 ] @
DART_VEJDER jel ti radis neki virus?
Tri teme koje si otvorio asociraju me na ponasanje virusa
[ Nothingman @ 22.08.2006. 20:58 ] @
Citat:
pcaca: DART_VEJDER jel ti radis neki virus? :D
Tri teme koje si otvorio asociraju me na ponasanje virusa ;) :D


Indeed ;)
[ DART_VEJDER @ 22.08.2006. 23:22 ] @
:-) :-)

Ma kakav virus....

Po meni - uzaludno trosenje vremena...

radim program, pa mi treba vasa pomoc...
[ vaske71 @ 22.08.2006. 23:43 ] @
Program jeste pokrenut !!!
[ itf @ 23.08.2006. 07:52 ] @
Citat:
DART_VEJDER: Pa dobro, ali ja to trebam odraditi kodom u programu...
Znaci da program vidi, a ne ja...
To sam i mislio :)
[ savkic @ 23.08.2006. 14:30 ] @
> 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.
[ X Files @ 23.08.2006. 16:56 ] @
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...
[ DART_VEJDER @ 24.08.2006. 09:25 ] @
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]
[ bzero @ 24.08.2006. 10:16 ] @
Ovde imas kompletan kod sa objasnjenjem kako to uraditi:

http://support.microsoft.com/kb/q243953/
[ X Files @ 24.08.2006. 11:24 ] @
Č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?

[ DART_VEJDER @ 24.08.2006. 15:13 ] @
Izvinjavam se ako nisam najbolje objasnio, ali zelim ono prvo...

Mislio sam da ste shvatili to...

Da, ja sam autor i jednog i drugog....
[ X Files @ 25.08.2006. 10:08 ] @
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 );
}