frage zu..doppeltes öffnen eines programmes vermeiden aus faq



  • //doppeltes öffnen eines Programmes vermeiden
        HANDLE mHandle;
        mHandle=CreateMutex(NULL,true,"Programm.exe");
        if (mHandle==NULL)
        {
           if (GetLastError()==ERROR_ALREADY_EXISTS)
           {
              MessageBox(NULL, "Programm.exe bereits gestartet", "Info", MB_OK | MB_ICONINFORMATION);
              // Anwendung bereits einmal gestartet
              HANDLE CloseHandle();
              //beenden das ausgeführten progs.
              exit (0);
           }
        }
        //Programm.exe starten
        ShellExecute(0, "open", "C:\\Programm.exe", 0, 0, SW_HIDE);
    

    bei mir mag er da was net.....!??? arbeite mit borland builder 6...
    vielleicht könnt ihr mir sagn was net passt...

    cu surf.



  • Es muß heissen:

    if (mHandle!=NULL)  // <----
        {
            if (GetLastError()==ERROR_ALREADY_EXISTS) 
            {
                .
                .
                .
            }
        }
    

    ansonsten solltest Du dazu schreiben, was 'er' nicht mag. Bekommst Du Fehler vom Compiler gemeldet, oder wie oder was?



  • nö bekomme keinen error vom compiler...aber deine verbesserung funzt a net;-(

    cu surf



  • Jo, Du brauchst uns gar nicht sagen, was nicht geht... das wissen wir eh schon.

    Bei Dir habe ich langsam den Verdacht, das der Fehler zwischen Tastatur und Sitzlehne zu finden ist!

    Du liest keine Antworten, probierst Deinen geposteten Code nie aus und zeigst auch sonst kaum Eigeninitiative...



  • titat: Du liest keine Antworten, probierst Deinen geposteten Code nie aus und zeigst auch sonst kaum Eigeninitiative...

    ich probiere die gepostetem code aus freund sonst wüsst icht nicht das was nicht stimmt!



  • int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iShowCmd)
    {
    	hMutex = CreateMutex(0,true,TEXT("BinaryStudiosToolBruni"));
    
    	if(GetLastError() == ERROR_ALREADY_EXISTS) {
    		SetLastError(0);
    		MessageBox(0,TEXT("Mei, Bruno, des Programm is doch schon offen !\nAlso echt ;)"),TEXT("Bruni!"),MB_ICONINFORMATION|MB_OK);
    		CloseHandle(hMutex);
    		return 0;
    	}
    }
    
    //HANDLE hMutex sollte global sein
    
    case WM_DESTROY:{
    	ReleaseMutex(hMutex);
    	CloseHandle(hMutex);
    	PostQuitMessage(0);
    	return 0;
    }
    


  • @marcell: Du kontrollierst den Rückgabewert jetzt gar nicht mehr!

    Hast du schonmal ausprobiert, ob es funktioniert, wenn du (wie -King- im FAQ-Beitrag vorschlug) den 2. Parameter auf FALSE setzt?

    Kann es sein, dass bei ShellExecute irgend etwas an den neuen Prozess vererbt wird und es damit zusammenhängt 😕
    Hast du die Anwendung mal manuell ein 2. Mal gestartet, oder immer nur mit ShellExecute?

    Gewöhne dir außerdem mal an, deine Fehler (bzw. das Nicht-Funktionieren) etwas genauer zu beschreiben und dir vor allem erstmal die Threads etwas genauer durchzulesen! 👎 Nicht wir suchen Hilfe, sondern DU! :p

    btw: ich hab den Fehler im Code aus den FAQ-Beitrag jetzt auch mal korrigiert 🙂



  • surf. schrieb:

    ich probiere die gepostetem code aus

    Glaub ich Dir nicht.

    Ich rede nicht von fremden Code, sondern von Deinem!

    Ständig postest Du hier Code und fragst gleichzeitig:
    "...könnte sowas gehen?" oder "...funktioniert sowas?"

    Probier's doch selber aus, ob "sowas geht" bzw. ob "sowas funktioniert"!

    surf. schrieb:

    freund

    ...bin ich nicht.



  • Hast du schonmal ausprobiert, ob es funktioniert, wenn du (wie -King- im FAQ-Beitrag vorschlug) den 2. Parameter auf FALSE setzt? ^

    ja hab ich grad probiert...den gleichen code wie king ausgebesserte version!!

    Kann es sein, dass bei ShellExecute irgend etwas an den neuen Prozess vererbt wird und es damit zusammenhängt
    Hast du die Anwendung mal manuell ein 2. Mal gestartet, oder immer nur mit ShellExecute?

    ja habs manuell und automatisch mit shellexecute gestartet....leider war das nit der fehler;-(

    cu



  • __fastcall TKeyForm::TKeyForm(TComponent* Owner)
       : TForm(Owner), Zeilen(0), umschalt(false), altgr(false)
    {
      //Überprüfen welche exe Datei gestartet wurde
       GetModuleFileName(NULL,buf,1000);
       FileName = strrchr(buf,'\\');
       FileName++;
       s=FileName;
    
       int vergleich = s.compare("mp3.exe");
    
       if(vergleich==0)
       {
        //doppeltes öffnen eines Programmes vermeiden
        HANDLE mHandle;
    
        mHandle=CreateMutex(NULL,true,"Prog.exe");
        if (mHandle!=NULL)
        {
           if (GetLastError()==ERROR_ALREADY_EXISTS)
           {
              MessageBox(NULL, "is gestartet", "Info", MB_OK | MB_ICONINFORMATION);
              // Anwendung bereits einmal gestartet
              CloseHandle(mHandle);
              exit (0);
           }
        }
    
        //Programm Prog.exe starten
        ShellExecute(0, "open", "C:\\Prog.exe", 0, 0, SW_HIDE);
    
        //exe beenden
        exit (0);
       }
    }
    


  • Damit wir uns richtig verstehen:

    HANDLE mHandle;
    mHandle=CreateMutex(NULL,true,"Prog.exe");
    if (mHandle!=NULL)
    {
       if (GetLastError()==ERROR_ALREADY_EXISTS)
       {
          MessageBox(NULL, "is gestartet", "Info", MB_OK | MB_ICONINFORMATION);
          // Anwendung bereits einmal gestartet
          CloseHandle(mHandle);
          exit (0);
       }
    }
    

    erstellt einen MUTEX.
    Ein MUTEX kann nur einmal mit gleichem Namen im System existieren.
    Normalerweise verwendet man einen MUTEX, um zu testen, ob das EIGENE Programm schon läuft.

    Beispiel:
    Ich starte mein Programm TEST.EXE
    Dieses TEST.EXE erstellt einen MUTEX.
    Versuche ich nun, genau die selbe TEST.EXE nochmal zu starten, geht das nicht, weil ja der MUTEX bereits existiert...

    Was passiert denn, wenn Du dein Programm (dessen Quelltext-Ausschnitt Du hier gerade gepostet hast) versuchst ein zweites Mal zu starten?



  • Beispiel:
    Ich starte mein Programm TEST.EXE
    Dieses TEST.EXE erstellt einen MUTEX.
    Versuche ich nun, genau die selbe TEST.EXE nochmal zu starten, geht das nicht, weil ja der MUTEX bereits existiert...
    [/b]ja...aber wie macht man das wenn man wissen will ob eine andere exe datei schon gestartet ist??? **hab gehört das man alle prozessinstanzen durchsteppen muss!?

    Was passiert denn, wenn Du dein Programm (dessen Quelltext-Ausschnitt Du hier gerade gepostet hast) versuchst ein zweites Mal zu starten?**dann wird das Prog.exe noch mal gestartet....dann sehe ich im taskmanager 2 mal Proxy.exe[b]

    cu



  • Wenn Du doch eh nur deine eigenen Programme starten willst mit ShellExecute, was hindert Dich denn daran, in jedem Programm einen eindeutig bezeichneten MUTEX zu kreieren?



  • Wenn Du doch eh nur deine eigenen Programme starten willst mit ShellExecute, was hindert Dich denn daran, in jedem Programm einen eindeutig bezeichneten MUTEX zu kreieren?

    **was is wenn ich aus meinem programm prüfen will ob icq.exe schon gestartet ist? so ist das bei mir das fall!! wenn nein dann soll icq.exe gestartet werde....so mein ich das.....
    **

    cu



  • Sag doch gleich, was du suchst 🙄
    Wenn du schauen willst, ob eine fremde Anwendung bereits läuft musst du entweder die laufenden Prozesse durchgehen oder nach dem Fenster der Anwendung suchen, falls du die Fensterklasse, oder den Titel weißt



  • sorry hab ich mich vielleicht falsch ausgedürckt;-(

    ich will einfach schaun ober eine fremdanwendung läuft...zb.: icq.exe fensternahme usw kenn ich nicht!! nur den namen der exe datei...
    wie geht man das an? hab e schon vorher gemeint...alle prozess instanzen durchsteppen oder so...

    cu



  • // Diese Funktion funktioniert in dieser Form
    // nur unter WindowsNT 4.0, Windows2000 und WindowsXP!
    
    #include <Psapi.h>
    #pragma comment(lib, "psapi.lib") //nur für Visual Studio! Bei anderem Compiler
    // auskommentieren und die LIB manuell dem Linker mitteilen...
    
    void GetPathFromHandle(HWND hWnd, LPTSTR szPathFromHandle)
    {
    	DWORD lpdwProcessId; 
    	HANDLE hProcessHandle;
    	GetWindowThreadProcessId(hWnd, &lpdwProcessId);	
    	hProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, TRUE, lpdwProcessId);
    	GetModuleFileNameEx(hProcessHandle, NULL, szPathFromHandle, MAX_PATH);
    	CloseHandle(hProcessHandle);
    }
    

    Mit EnumWindows alle Fenster abklappern, in der EnumWindowsProc rufst Du dann obige Funktion auf

    GetPathFromHandle(hWnd, szPath);
    

    Dann vergleichst Du szPath eben mit "C:\\Programme\\ICQ\\Icq.exe" und wenn ICQ nicht läuft startest Du es eben....



  • oder mit Process32First & Co. 🙂





  • Na hörmal, du pfuscht da ja schließlich auch unter der Motorhaube rum, sowas braucht schonmal ein paar mehr Zeilen Code....

    Es gibt nunmal keine

    StarteIcqWennEsNochNichtLäuft();
    

    Funktion... aber Du kannst uns ja eine schreiben.... 😉



  • ja!!
    ich will einfach C:\Programm.exe eingeben...dann soll er schaun ob der process schon läuft...kannst ja mir bissi helfen..;-)

    ich versteh da mit der msdn nicht so viel...erklärungen sind auch keine dabei;-(

    was machen die da mit....Process32First
    hat jemand da eine example vielleicht wo man das besser sieht???
    wär fein...

    cu


Anmelden zum Antworten