Ermitteln ob EXE aktiv ist



  • Hallo,

    ich habe folgendes Problem.
    Ich möchte das Funktionieren meiner Anwendung_B vom Aktivsein der
    Anwendung_A abhängig machen.
    Frage: Wie frage ich ab, ob meine *.exe von Anwendung_A aktiv ist (läuft)??

    mfg
    Traugott



  • Ich würde sagen FindWindow() oder per Mutex...



  • Hallo,

    Hab schon im Forum (FAQ) gestöbert. Hier finde ich nur Code zum Abschalten einer *.exe.(Pfad vorgegeben)
    Ich aber möchte nur Prüfen ob die von mir benannte *.exe aktiv ist oder nicht.
    Deshalb wäre es für mich sehr hilfreich, wenn vieleicht ein Codeschnipsel dabei wäre.(oder Link)

    mfg
    Traugott



  • Das Programm, dass laufen muss:

    // Bei Programmstart
    HANDLE kdg_mutex = OpenMutex(MUTEX_ALL_ACCESS, 0, "irgend_eine_ID");
    
    // Bei Programmende...
    ReleaseMutex(kdg_mutex);
    

    Im Programm, dass prüft, ob das andere gerade aktiv ist:

    HANDLE kdg_mutex = OpenMutex(MUTEX_ALL_ACCESS, 0, "irgend_eine_ID")
    
    //Wenn Mutex-Handle 1 ist, ist gerade eine Programminstanz aktiv...
    if(kdg_mutex)   {
        // Hier was passieren soll, wenn das Programm läuft...
    }
    

    Ist jetzt aber aus'm Kopf, könnten Fehler drin sein 🙄



  • Ich wrede es ausprobieren.
    Erst einmal Vielen Dank für die Unterstützung.

    mfg
    Traugott



  • Hallo

    dazu gibt es bereits in den Builder-Examples ein Control dazu :
    <BCB_Path>\Examples\Controls\SingleInst

    bis bald
    akari



  • Wenn ich das richtig verstanden habe und die anderen falsch, dann willst du feststellen, ob ein Fremdprozess läuft, der nicht von dir stammt?
    In dem Fall könntest du dir die Prozesse anhand des Dateinamens im System auflisten und schauen, ob der gesuchte dabei ist.

    DWORD GetPidByName(PSTR ProcessName) {
    	DWORD PIDs[1024], BytesNeeded, ProcessCount;
    
    	//SetDebugPrivilege();
    
    	if (!EnumProcesses(PIDs,sizeof(PIDs),&BytesNeeded)) {
    		return 0;
    	}
    
    	ProcessCount = BytesNeeded / sizeof(DWORD);
    	BytesNeeded = 0;
    
    	for (UINT i = 0;i<ProcessCount;i++) {
    		HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,false,PIDs[i]);
    
    		if (hProcess != NULL) {
    			HMODULE hModule;
    
    			char CurProcessName[MAX_PATH];
    
    			if (EnumProcessModules(hProcess,&hModule,sizeof(hModule),&BytesNeeded) ) {
    				if (GetModuleBaseName(hProcess,hModule,CurProcessName, sizeof(CurProcessName) )) {
    					if (strcmpi(CurProcessName,ProcessName)==0) {
    						CloseHandle (hProcess);
    						return PIDs[i];
    					}
    				}
    			}
    		}
    
    		CloseHandle(hProcess);
    	}
    	return 0;
    }
    

    Deklarationen in der psapi.h -> psapi.lib einbinden



  • Reyx schrieb:

    Das Programm, dass laufen muss:

    // Bei Programmstart
    HANDLE kdg_mutex = OpenMutex(MUTEX_ALL_ACCESS, 0, "irgend_eine_ID");
    
    // Bei Programmende...
    ReleaseMutex(kdg_mutex);
    

    Ist jetzt aber aus'm Kopf, könnten Fehler drin sein 🙄

    Wenn ich das so benutze, kommen bei mir folgende Fehler:

    [C++ Warnung] Unit1.cpp(21): W8004 'kdg_mutex' wurde ein Wert zugewiesen, der nie verwendet wird
      [C++ Fehler] Unit1.cpp(25): E2451 Undefiniertes Symbol 'kdg_mutex'
    

    Ich bin damit nicht so vertraut. Muss ich da noch etwas machen?
    Danke im Voraus



  • Hat echt keiner 'ne Ahnung? 😞



  • Hallo

    die Fehelrmeldung ist doch klar. Du deklarierst zwar kdg_mutex, aber dort wo den Release aufrufst, ist kdg_mutex nicht bekannt. Vermutlich hast du kdg_mutex lokal in eienr Methode deklariert, aber wei ldu den Release in einer anderen aufrufst, must du kdg_mutex stattdesen als Member der Klasse deklarieren.

    Ist das nicht der Fall und du findest den Fehler selber nicht, dann poste nochmal genau, in welchem Zusammenhang die beiden Codezeilen stehen.

    bis bald
    akari



  • Also jetzt kommt der Fehler nicht mehr. Allerdings funktionierts auch nicht so:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    HANDLE kdg_mutex = OpenMutex(MUTEX_ALL_ACCESS, 0, "123");
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
    ReleaseMutex(kdg_mutex);
    }
    //---------------------------------------------------------------------------
    
    Programm das überprüft werden soll.
    
    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    HANDLE kdg_mutex = OpenMutex(MUTEX_ALL_ACCESS, 0, "123");
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    
    //Wenn Mutex-Handle 1 ist, ist gerade eine Programminstanz aktiv...
    if(kdg_mutex)
      {
      ShowMessage("Opened");
      }
    }
    //---------------------------------------------------------------------------
    
    Programm das überprüft.
    

    Das überprüfende Programm gibt nie die Meldung aus (ShowMessage), egal ob das erste Programm geöffnet ist oder nicht.





  • Aber da wird erklärt wie man verhindert das ein Programm 2x geöffnet wird.
    Aber ich will eigentlich wissen wie man "ermittelt ob eine EXE Datei geöffnet ist".



  • Aber da wird erklärt wie man verhindert das ein Programm 2x geöffnet wird.

    Damit wird auch doch irgendwie geklärt, ob ein Programm schon läuft. Ob du dann nun einen weiteren Start verhinderst oder sonstewas machst......



  • Achso ja Sorry hab ein Problem mit logischem Denken hehe
    Danke



  • OK jetzt läuft es soweit...
    Allerdings ein Problem.

    Programm1 (Ausgeführtes)
    Programm2 (Überprüfendes)

    1. Erst mache ich Programm1 an, dann Programm2. Programm2 meldet das Programm1 bereits läuft. OK soweit. Wenn ich jetzt Programm1 schließe und Programm2 nochmal überprüfen lasse, wird immer noch gemeldet das Programm1 läuft.

    2. Erst starte ich Programm2 und lasse überprüfen, keine Fehlermeldung. Dann starte ich Programm1 und lasse wieder überprüfen, das Programm meldet dass Programm1 läuft. Wenn ich Programm1 schließe wieder der selbe Fehler von Punkt1.

    Programm1:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    HANDLE hMutex=OpenMutex(MUTEX_ALL_ACCESS,0,"MeinProgramm");
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
    ReleaseMutex(hMutex);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    if(!hMutex)
      {
      hMutex=CreateMutex(0,0,"MeinProgramm");
      }
    else
      {
      ShowMessage("Das Programm läuft bereits");	
      }
    }
    //---------------------------------------------------------------------------
    

    Programm2:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    HANDLE hMutex=OpenMutex(MUTEX_ALL_ACCESS,0,"MeinProgramm");
    if(!hMutex)
      {
      ReleaseMutex(hMutex);
      }
    else
      {
      ShowMessage("Das Programm läuft bereits");
      ReleaseMutex(hMutex);	
      }
    }
    //---------------------------------------------------------------------------
    


  • Hallo

    ich kann deinen Quellcode jetzt nicht testen, weil ich keinen Builder habe.
    Aber CreateMutex und ReleaseMutex sollten besser in dem Konstruktor bzw. dem Destruktor des Forms stehen, und HANDLE hMutex sollte ein Member des Forms sein (also im Header des Forms nach private deklarieren).

    bis bald
    akari



  • Danke akari, kannst du (oder jemand anderes) mir noch sagen was Konstruktor und Destruktor bedeutet? Oder wo ich das finde?



  • Konstuktor:

    __fastcall TForm1::TForm1(TComponent* Owner) 
            : TForm(Owner) 
    { 
    } 
    //---------------------------------------------------------------------------
    

    besser ist aber das TForm Event OnCreat.

    Destruktor:
    ist ist das TForm Event OnDestroy
    kannst du im Objektinspektor für TForm doppelt klicken.
    Ok stimmt nicht ganz da der Destruktor danach kommt.
    Den Destruktor würde ich nicht überschreiben!



  • Hallo

    besser ist aber das TForm Event OnCreat.

    Falsch. Genausowenig wie OnDestroy besser als der Destruktor sein soll. Das gegenteil ist der Fall, die Begründung hatten wir schon ein paar mal in verschiedenen Threads dieses Forums.

    Danke akari, kannst du (oder jemand anderes) mir noch sagen was Konstruktor und Destruktor bedeutet? Oder wo ich das finde?

    Lies gleich ein ganzes Tutorial zum Thema OOP, denn du wirst es noch brauchen.

    bis bald
    akari


Anmelden zum Antworten