externes Programm auch wieder beenden

Anfängerfragen zum Programmieren mit PureBasic.
Adler
Beiträge: 5
Registriert: 12.02.2007 00:41
Wohnort: Mitteldeutschland

externes Programm auch wieder beenden

Beitrag von Adler »

Habe da ein kleines Problem, ich bin totaler Anfänger und bitte um Hilfe!

Erstellt habe ich das Programm mit dem neuen VisualDesigner und PB 4.1
Ich wollte ein externes Programm welches ich zuvor mit einen Button gestartet habe über einen anderen Button auch wieder beenden. Aber irgentwie geht es nicht, weder mit dem Befehl KillProgram noch mit dem Befehl CloseProgram.

Bei dem RunProgram-Befehl die Parameter habe ich mir aus dem Forum rausgelesen aber ich finde sie auch nicht erklärt (,"-s -t 0 -f","",0) und weiß nicht so richtig damit umzugehen. Würde mich auch freuen diese einmal erklärt zu bekommen bzw. wo man dafür eine Erklärung findet.
Ist eigentlich ein Übungsprogramm um langsam reinzukommen

Hier ist mein bisheriger Code

Code: Alles auswählen


;Programm mit neuen Visual Designer erstellt
  
Global Window_0, Button_0, Button_1, Button_2, Button_3, Button_4      ;Button einfügen die man noch selber einfügt 

Structure VisualDesignerGadgets
  Gadget.l
  EventFunction.l
EndStructure

Global NewList EventProcedures.VisualDesignerGadgets()

Procedure RegisterGadgetEvent(Gadget, *Function)
  
  If IsGadget(Gadget)
    AddElement(EventProcedures())
    EventProcedures()\Gadget        = Gadget
    EventProcedures()\EventFunction = *Function
  EndIf
  
EndProcedure

Procedure CallEventFunction(Window, Event, Gadget, Type)
  
  ForEach EventProcedures()
    If EventProcedures()\Gadget = Gadget
      CallFunctionFast(EventProcedures()\EventFunction, Window, Event, Gadget, Type)
      LastElement(EventProcedures())
    EndIf
  Next
  
EndProcedure

Procedure Open_Window_0()
  
  Window_0 = OpenWindow(#PB_Any, 5, 5, 400, 200, "Mein Fenster mit PB 4.10",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
  If Window_0
    If CreateGadgetList(WindowID(Window_0))
      Button_0 = ButtonGadget(#PB_Any, 20, 20, 110, 40, "Prog. Beenden") 
      Button_1 = ButtonGadget(#PB_Any, 20, 70, 110, 40, "Jäegermeister")     ;Button einfügen die man noch selber einfügt
      Button_2 = ButtonGadget(#PB_Any, 20, 120, 110, 40, "Windows Beenden")
      Button_3 = ButtonGadget(#PB_Any, 145, 20, 110, 40, "Schleife For-Next")
      Button_4 = ButtonGadget(#PB_Any, 145, 70, 110, 40, "Jägermeister Ende")
    EndIf
  EndIf
EndProcedure

Open_Window_0()

Repeat
  
  Event  = WaitWindowEvent()
  Gadget = EventGadget()
  Type   = EventType()
  Window = EventWindow()
  
  Select Event
    Case #PB_Event_Gadget
      CallEventFunction(Window, Event, Gadget, Type)
 
      
   ;DiesenCode habe ich selber eigefügt zur Aktivierung der Tasten   
      Select EventGadget() 
            Case Button_0
            Debug 1    ;nur zur Kontrolle
            End 
            
            Case Button_1
            RunProgram("C:\Programme\Multimedia\Jägermeister\ps_start.exe","-s -t 0 -f","",0) ;ein Programm starten
                        
            Case Button_2
            RunProgram("C:\Windows\System32\shutdown.exe","-s -t 0 -f","",0) ;Windows beenden
            
            Case Button_3
            a$ + "Ja das ist der OK Button !!"
      MessageRequester("Button OK ",a$, #PB_MessageRequester_Ok)   ;Meldungsfenster öffnen
    
      For x = 1 To 10
      MessageRequester("Nachricht",Str(x)+". Durchlauf",0)   ;neues Meldungsfenster mit einer For Next Schleife (+"Texteingabe" für anschliessende Texte)
      Next
     
      
        ;Hier ist mein Problem, das Programm zu beenden welches ich vorher gestartet habe  

   
            Case Button_4
            CloseProgram("C:\Programme\Multimedia\Jägermeister\ps_start.exe","-s -t 0 -f","",0)      
            ;KillProgram("C:\Programme\Multimedia\Jägermeister\ps_start.exe","-s -t 0 -f","",0)  ;Geht auch nicht bei einer Aktivierung
        
       EndSelect
        ;Ende von meiner Eingabe
      
  EndSelect
  
Until Event = #PB_Event_CloseWindow

End


Vielen Dank schon im voraus, würde mich über Hilfe ehrlich freuen
Brügge
Beiträge: 359
Registriert: 28.05.2006 16:40
Wohnort: Rheine

Beitrag von Brügge »

also wenn das ein fremdes Programm beenden soll gibt es dort auch eine möglichkeit, die aber nicht so schön ist....

Code: Alles auswählen

KillAllProcess()
wenn du dies im PB-editor eingibst und F1 drückst dann stehen die Befehle dazu da.

es ist leider keine so saubere methode, weil man einen process wie beim Taskmaneger einfach beendet (also ohne frage: wollen sie wirklich beenden oder speichern)

aber es funktioniert


MFG brügge
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag von milan1612 »

@brügge: Das ist totaler Quatsch!
@Adler:
Schau dir mal den Befehl CloseProgram() in der Hilfe etwas genauer an :D
Du musst den Rückgabewert von RunProgram() übergeben...

//EDIT
Hab deinen Code mal ein bisschen aufgeräumt, schau dir einfach mal den
Unterschied bei RunProgram() und CloseProgram() an...

Code: Alles auswählen

Global Window_0, Button_0, Button_1, Button_2, Button_3, Button_4      ;Button einfügen die man noch selber einfügt

Procedure Open_Window_0()
  Window_0 = OpenWindow(#PB_Any, 5, 5, 400, 200, "Mein Fenster mit PB 4.10",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
  If Window_0
    If CreateGadgetList(WindowID(Window_0))
      Button_0 = ButtonGadget(#PB_Any, 20, 20, 110, 40, "Prog. Beenden")
      Button_1 = ButtonGadget(#PB_Any, 20, 70, 110, 40, "Jäegermeister")     ;Button einfügen die man noch selber einfügt
      Button_2 = ButtonGadget(#PB_Any, 20, 120, 110, 40, "Windows Beenden")
      Button_3 = ButtonGadget(#PB_Any, 145, 20, 110, 40, "Schleife For-Next")
      Button_4 = ButtonGadget(#PB_Any, 145, 70, 110, 40, "Jägermeister Ende")
    EndIf
  EndIf
EndProcedure

Open_Window_0()

Repeat
  Event  = WaitWindowEvent()
  Gadget = EventGadget()
 
  Select Event
    Case #PB_Event_Gadget
    
      Select EventGadget()
            Case Button_0
            Debug 1    ;nur zur Kontrolle
            End

            Case Button_1
              Ergebnis = RunProgram("C:\Programme\Multimedia\Jägermeister\ps_start.exe","-s -t 0 -f","",0) ;ein Programm starten
   
            Case Button_2
              RunProgram("C:\Windows\System32\shutdown.exe","-s -t 0 -f","",0) ;Windows beenden

            Case Button_3
              a$ + "Ja das ist der OK Button !!"
              MessageRequester("Button OK ",a$, #PB_MessageRequester_Ok)   ;Meldungsfenster öffnen
   
              For x = 1 To 10
              MessageRequester("Nachricht",Str(x)+". Durchlauf",0)   ;neues Meldungsfenster mit einer For Next Schleife (+"Texteingabe" für anschliessende Texte)
              Next

            Case Button_4
              If Ergebnis
                CloseProgram(Ergebnis)
                Ergebnis = 0
              EndIf
       
       EndSelect
  EndSelect
Until Event = #PB_Event_CloseWindow
End 
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Brügge
Beiträge: 359
Registriert: 28.05.2006 16:40
Wohnort: Rheine

Beitrag von Brügge »

echt? so totaler quatsch?

hmm dann nutze ich das demnächst nicht mehr ;)

dann nehme ich in zukunft nur noch closeprogram


und schon wieder habe ich was dazugelernt ^^
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

milan1612 hat geschrieben:@brügge: Das ist totaler Quatsch!
@Adler:
Schau dir mal den Befehl CloseProgram() in der Hilfe etwas genauer an :D
Du musst den Rückgabewert von RunProgram() übergeben...
Deins aber auch :wink:
Mit CloseProgram wird nur der Speicher für die Kommunikation wieder
freigegeben, aber das Programm nicht beendet. Dies ist auch garnicht so einfach
möglich. Man kann den Process killen, das ist aber nicht sehr sauber.
Beim Source überfliegen gings doch nur um die shutdown.exe? Das kann man
auch besser lösen, ohne ein externes Programm zu starten, einfach mal suchen.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag von milan1612 »

ts-soft hat geschrieben:
milan1612 hat geschrieben:@brügge: Das ist totaler Quatsch!
@Adler:
Schau dir mal den Befehl CloseProgram() in der Hilfe etwas genauer an :D
Du musst den Rückgabewert von RunProgram() übergeben...
Deins aber auch :wink:
Mit CloseProgram wird nur der Speicher für die Kommunikation wieder
freigegeben, aber das Programm nicht beendet. Dies ist auch garnicht so einfach
möglich. Man kann den Process killen, das ist aber nicht sehr sauber.
Beim Source überfliegen gings doch nur um die shutdown.exe? Das kann man
auch besser lösen, ohne ein externes Programm zu starten, einfach mal suchen.

Gruß
Thomas
Ups, das hab ich überlesen :oops:
@Adler: Na dann füg vor das CloseProgram() noch ein KillProgram() ein
(auch da musst du das Ergebnis von RunProgram() übergeben)
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Brügge
Beiträge: 359
Registriert: 28.05.2006 16:40
Wohnort: Rheine

Beitrag von Brügge »

um ein externes programm(was man programmiert hat) zu beenden, dann man auch einfach eine Globale OS Variable nutzen, um der anderen Seite zu sagen: Beende dich!
Benutzeravatar
tobe
Beiträge: 146
Registriert: 14.09.2006 17:33
Wohnort: Oktoberfest

Beitrag von tobe »

hi Adler,

um ein von dir mit RunProgram() gestartetes programm mit KillProgram() zu beenden, musst du es mit dem #PB_Program_Open flag starten, dann kannst du den rückgabewert von RunProgram() an KillProgram() übergeben und schon wird es beendet.

die parameter von RunProgram() sind in der hilfe von PB gut erklärt.
"-s -t 0 -f" sind parameter für die shutdown.exe
wenn du "shutdown ?" in deiner commandozeile eingibst erklärt dir die shutdown.exe alle parameter.

hier hab ich den code von milan1612 nochmal leicht überarbeitet:

Code: Alles auswählen

EnableExplicit
Define Window_0, Button_0, Button_1, Button_2, Button_3, Button_4      ;Button einfügen die man noch selber einfügt
Window_0 = OpenWindow(#PB_Any, 5, 5, 400, 200, "Mein Fenster mit PB 4.10",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
If Window_0
  If CreateGadgetList(WindowID(Window_0))
    Button_0 = ButtonGadget(#PB_Any, 20, 20, 110, 40, "Prog. Beenden")
    Button_1 = ButtonGadget(#PB_Any, 20, 70, 110, 40, "Jäegermeister")     ;Button einfügen die man noch selber einfügt
    Button_2 = ButtonGadget(#PB_Any, 20, 120, 110, 40, "Windows Beenden")
    Button_3 = ButtonGadget(#PB_Any, 145, 20, 110, 40, "Schleife For-Next")
    Button_4 = ButtonGadget(#PB_Any, 145, 70, 110, 40, "Jägermeister Ende")
  Else
    End
  EndIf
Else
  End
EndIf
Define Event, Gadget, Ergebnis, a$, x
Repeat
  Event  = WaitWindowEvent()
  Gadget = EventGadget()
  Select Event
    Case #PB_Event_Gadget
      Select EventGadget()
        Case Button_0
          End
        Case Button_1
          ;ein Programm starten
          Ergebnis = RunProgram("C:\Programme\Multimedia\Jägermeister\ps_start.exe", "", "", #PB_Program_Open)
        Case Button_2
           ;Windows beenden
          RunProgram("C:\Windows\System32\shutdown.exe", "-s -t 0 -f", "", 0)
        Case Button_3
          a$ + "Ja das ist der OK Button !!"
          ;Meldungsfenster öffnen
          MessageRequester("Button OK ",a$, #PB_MessageRequester_Ok)
          For x = 1 To 10
            ;neues Meldungsfenster mit einer For Next Schleife (+"Texteingabe" für anschliessende Texte)
            MessageRequester("Nachricht",Str(x)+". Durchlauf",0)
          Next
        Case Button_4
          ;Jägermeister Ende
          If Ergebnis
            KillProgram(Ergebnis)
            Ergebnis = 0
          EndIf
      EndSelect
  EndSelect
Until Event = #PB_Event_CloseWindow
End
mfG
tobe
PureBasic 4.40 (Windows - x86)
Adler
Beiträge: 5
Registriert: 12.02.2007 00:41
Wohnort: Mitteldeutschland

Beitrag von Adler »

Erst eimal vielen Dank :D für die schnellen Tips, aber es geht irgentwie immer noch nicht.

Bei diesen Code

Code: Alles auswählen

Case Button_1 
              Ergebnis = RunProgram("C:\Programme\Multimedia\Jägermeister\ps_start.exe","-s -t 0 -f","",0) ;ein Programm starten 

................................

Case Button_4 
              If Ergebnis 
                CloseProgram(Ergebnis) 
                Ergebnis = 0 
              EndIf 
bekomme ich die Fehlermaldung
Program is not an open Program object

Bei den anderen Tip geht es auch nicht, es kommt zwar keine Fehlermeldung, das Programm wird mit dem Code

Code: Alles auswählen

Case Button_1 
          ;ein Programm starten 
          Ergebnis = RunProgram("C:\Programme\Multimedia\Jägermeister\ps_start.exe", "", "", #PB_Program_Open) 

..............................................

Case Button_4 
          ;Jägermeister Ende 
          If Ergebnis 
            KillProgram(Ergebnis) 
            Ergebnis = 0 
          EndIf 
aber auch nicht beendet. Ist als ob der Button nicht angesprochen würde, also keine Reaktion des Progammes

Vieleicht habe ich mich auch irgentwie falsch ausgedrückt
Es ist quasi ein Programm welches ich nicht selber geschrieben habe. Also ein externes Programm welches man separat in Windows installieren kann, und wahrscheinlich nicht in PB programmiert wurde.
Ist nur ein Beispielprogramm um ev. auch andere externe Programme über eine in PB programmierte Maske starten und beenden zu können.

Danke :D für die shutdown-Parameter Erklärung, habe Parameter alle gefunden

den Befehl KillAllProcess() habe ich noch nicht getestet werde es aber morgen früh einmal probieren, DANKE
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Anwendungen, die nicht speziell dafür geschaffen sind, von Dir beendet zu
werden, sollte man auch nicht "abschiessen".
Diese Programme können Ihre Einstellungen nicht mehr speichern, Speicher und
Objekte nicht freigeben usw.
Du erzeugst also Chaos im Speicher, der erst mit einem Windows-Neustart
wieder aufgeräumt wird. Defekte Registry und ähnliche Dinge können passieren.
Nur hängengebliebene Programme, deren Prozeß sollte man abschiessen, weil
nur da macht es Sinn :wink:
Fremde Programme über feste Pfade ansprechen macht auch nicht viel sinn, weil
diese Pfade nur auf dem eigenem System stimmen. Das System muß nicht auf C:
liegen, die Ordner müssen nicht so heissen usw.

Laß Dir das alles nochmal durch den Kopf gehen, vielleicht gibts eine bessere
Lösung?

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten