kann window nicht finden



  • Probiers mal damit, bei uns funktioniert das gut.

    // In IchLebSchonMutex sollte z.B der Programmname eingetragen werden

    HANDLE hMutex;
    
      hMutex = CreateMutex(
      NULL,                  // no security descriptor
      FALSE,                 // mutex not owned
      "IchLebschon_Mutex");   // object name  ProgName_Mutex
    
      if (hMutex == NULL)
        printf("CreateMutex error: %d\n", GetLastError() );
      else
        if ( GetLastError() == ERROR_ALREADY_EXISTS )
        {
          MessageBox(0,"CreateMutex opened existing mutex\n Applikation Starter is already started", "ERROR",MB_ICONERROR|MB_OK|MB_SETFOREGROUND|MB_APPLMODAL );
          exit(1);
        }
    

    Viel Spaß

    PS Weis einer wie ich an eine Liste aller Mutexe die im System definiert sind rankomme?



  • danke funzt super,
    aber wie kann ich jetzt noch machen, dass ich den prozess auch beenden kann?
    kann ich des einfach mit terminate process machen?



  • welchen?

    den aktuellen, das passiert sowieso durch das exit 1
    den anedren, da muss man mal ein bisschen überlegen



  • naja, das exit(1) schliest ja das ganze programm, aber ich will ja danach noch mehr code haben, oder schliest das in dem fall nur den prozess?



  • Das Programm ist der Process, somit ist deine Frage nicht besonders sinnvoll.

    Wenn du etwas anderes tun willst, machs doch vor dem exit(1)
    Das exit ist hier nicht essentiell, sondern nur das was wir hier tun wollten.

    Das Beispiel ist bei uns im Ensatz um sicher zu stellen das dieses Programm genau einmal läuft, wird es ein zweitesmal gestartet, so beendet sich sich unmittelbar selbst mit einer Fehlermeldung.

    Der Rest ist doch normale C/C++ -Programmierung

    if (xxxx)
     {
      tue a
     }
    else
     {
       tue b
     }
    


  • ich hab noch eine andere exe mit
    CreateProcess() gestartet.
    Wie kann ich den prozess dieser exe terminieren?
    Ich brauch für TerminateProcess ja ein handle auf den prozess .. den bekomm ich aber doch nicht von createprocess?



  • .. den bekomm ich aber doch nicht von createprocess?

    Was soll dann der letzte Parameter?

    TerminateProcess ist nicht zu empfeheln. Das ist das selbe als wenn du das prog mit dem Processfenster im Tasmanager rauskickst. Es wird auf der Stelle gekillt ohne irgendwas aufräumen/freigeben zu können. Wenn das Prog das du schließen willst ein Fenster hat wäre ein WM_CLOSE eher zu empfehlen.



  • und wie kann ich sonst den handle rausfinden?
    wenn der prozess schon läuft, bevor mein programm aufgerufen wird?



  • also findwindow funktioniert da nicht, da es kein offenes Fenster ist.



  • crash0r schrieb:

    also findwindow funktioniert da nicht, da es kein offenes Fenster ist.

    dann nehmt halt enumwindows ..



  • was mach ich wenn es ein Consolenprogramm ist ohne eine Ausgabe auf die console?

    ➡ WM_CLOSE kennen Consolenprogramme nicht
    ➡ TerminateProcess ist zu hart

    Wie beendet man ein solches Programm.



  • Warum sollte DAS FENSTER IN DEM Consolenprogramme laufen keine WM_CLOSE kennen? Wir sind hier im WinAPI forum.. die Console läuft bei uns in einem Fenster und das kennt normalerweise WM_CLOSE 😉



  • was solln des sein?
    der scannt doch auch nur aktive bzw. sichtbare fenster



  • oh scheise, sry, da waren ja schon neue einträge o_O



  • ne mein programm läuft im hintergrund..da gibts keine console oder fenster 😕



  • ...aber EnumWindows findet es unter Garantie!

    Dann noch den Namen der EXE inkl. kompletten Pfad herausfinden:

    // Benötigt psapi.lib und psapi.h
    // Läuft nur auf WinNT-basierenden Betriebssystemen!
    // (also WinNT, Windows2000, WindowsXP)
    
    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);
    }
    

    Aufrufen tuste das in der EnumProc (welche zu EnumWindows() gehört):

    BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam)
    {
        char szProgrammEXE[MAX_PATH];
        GetPathFromHandle(hwnd, szProgrammEXE);
        if (stricmp(szDasZuSuchendeProgramm, szProgrammEXE)==NULL) 
        {
            SendMessage(hwnd, WM_CLOSE, NULL, NULL);
            return FALSE;
        }
        return TRUE;
    }
    

    ...und schon wird die EXE beendet, sauber und komplett...



  • des is doch voll kompliziert...und gibts nicht ein code, der auch auf win98 funktioniert?
    den filename hab ich ja!
    ich will einfach nur meine tools.exe (das ist der name) abbrechen, damit das file überschrieben werden kann, und der zusatzeffekt ist dann, dass sie nur einmal gestartet sein kann.
    ich mach CreateMutex, damit kann ich rausfinden, ob sie an ist oder nicht.
    Mir ist es egal, ob das jetzt schön geschlossen ist oder nicht, bis jetzt musste ich sie immer mitm taskmgr schliesen.
    ich will einfach nur die tools.exe abbrechen, damit man sie wieder überschreiben kann.
    und ich weiß nicht wo ich die ganzen hwnds herbekommen soll, wenn ich des jetzt in enumproc schreiben würde, da muss doch was drinstehen, aber ich weiß eben nicht was?!



  • Ein Programm der Qualität

    int main()
    {
    
    int x=3
    for (;;)
    {
    }
    exit 0
    }
    

    in einem anderen Program gestartet mit

    unsigned long int SpawnWaitNoWindow(char *AppName,char *CmdLine) 
    { 
      char szCmdLine[LONGSTRINGLEN]; 
      PROCESS_INFORMATION pi; 
      STARTUPINFO si={sizeof(si)};  // da der erste Parameter gefüllt wird werden zumindest ab Visual C 5.0 alle anderen genullt 
      unsigned long int dwExitCode; 
      BOOL fSucess; 
      sprintf(szCmdLine,"%s %s",AppName,CmdLine); 
      fSucess=CreateProcess(AppName,szCmdLine,NULL,NULL,FALSE,CREATE_NO_WINDOW,NULL,NULL,&si ,&pi); 
      if (fSucess) 
      { 
        CloseHandle(pi.hThread); 
        WaitForSingleObject(pi.hProcess,INFINITE); 
        GetExitCodeProcess(pi.hProcess,&dwExitCode); 
        CloseHandle(pi.hProcess); 
      } 
      else 
        return 0xFFFFFFFFL; 
      return dwExitCode;
    

    }

    CREATE_NO_WINDOW Windows NT/2000 or later: This flag is valid only when starting a console application. If set, the console application is run without a console window.

    Wie soll ich dieses aus einem dritten Programm beenden, wobei dieses dritte Programm keinen Zugriff auf die Daten in pi hat?

    I



  • crash0r schrieb:

    des is doch voll kompliziert...und gibts nicht ein code, der auch auf win98 funktioniert?

    Natürlich gibt es entsprechende Equivalente, die auch unter Win9x funktionieren.

    Aber Du erwartest doch nicht im Ernst, das wir Dir hier komplett fertigen Code schreiben, oder?

    Kann ich gerne tun, mein Stundensatz liegt bei 130,- EUR...

    Minimum müßte ich 2 Stunden veranschlagen... kannst Du Dir das leisten? Ich fürchte nicht....

    Also, den Weg hab ich Dir gezeigt, beschreite ihn!



  • mit dem script startet man doch auch erst den prozess um ihn danach wieder zu schliesen.
    also nochmal: ich habe ein programm das am laufen ist. Und der prozess soll einfach von einem anderen programm, das den programmpfad der laufenden exe kennt, terminiert werden. Also muss da sowas ähnliches wie FindWindow oder so rein, dass der die pid findet, damit er den schliesen kann. FindWindow geht aber nicht, da das programm im hintergrund läuft (oder irre ich mich und das geht nur bei mir nicht?).
    Und ich hab kein handle oder sonst was, ich will einfach nur des billige programm terminieren.


Anmelden zum Antworten