Anzeige
Archiv - Navigation
920to924
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
920to924
920to924
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Externes Programm automatisch schließen

Externes Programm automatisch schließen
26.10.2007 13:53:21
Kretschi
Hallo zusammen,
ich konnte folgendes Problem noch immer nicht lösen. Ich möchte eine Anwendung aus Excel heraus starten, warten bis sie fertig gerechnet hat und sie dann wieder automatisch schließen. Ich bin jetzt soweit, dass ich die Anwendung starten kann und sie gleich danach wieder geschlossen wird. Ich muss jedoch sicher gehn, dass sie fertig gerechnet hat. Die Anwendung (Simulationsprogramm) läuft unter DOS und am Ende erscheint ein Fenster mit der Meldung "Programm Terminated with exid code 0 - Exit Window? Ja/Nein.
Da ich etliche tausend Läufe habe, muss ich die Anwendung auf jedenfall automatisch schließen können und nicht erst nach einer vorgegebenen Zeit t!
Wer hat mir einen Tipp bzw. den passenden Code, da ich leider mit ein paar Stichwörtern wahrscheinlich nicht so viel anfangen werde!
Hier ist mein bisheriger Code:
[Option Explicit
Private Declare

Function TerminateProcess Lib "kernel32" (ByVal _
hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare 

Function OpenProcess Lib "kernel32" (ByVal _
dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal _
dwProcessID As Long) As Long
Private Declare 

Function CloseHandle Lib "kernel32" (ByVal hObject As _
Long) As Long
Private Declare 

Function GetExitCodeProcess Lib "kernel32" (ByVal _
hProcess As Long, lpExitCode As Long) As Long 'neu
Const PROCESS_TERMINATE = &H1
Const Aktiv = &H103 'neu
Private ProcessId As Long
Private ProcessId_Exit As Long
Private RetVal As Variant


Sub Test3()
Dim l As Long
ProcessId = shell("D:\app\fcit\kpro46de\rkern\kprohaup.exe", vbNormalFocus)
'Shell startet das ausgewählte Programm.
ProcessId_Exit = OpenProcess(PROCESS_TERMINATE, 0&, ProcessId)
'Mit dieser Funktion erhalten Sie das Object-Handle auf den
'aktiven Prozess.
Do
GetExitCodeProcess ProcessId_Exit, l
DoEvents
Loop While l = Aktiv
RetVal = TerminateProcess(ProcessId_Exit, 1&)
'Mit der TerminateProcess Funktion können Sie den ausgewählten
'Prozess und all seine Threads (falls vorhanden) beenden.
RetVal = CloseHandle(ProcessId_Exit)
'Hier wird das Handle wieder geschlossen.
End Sub

]
Vielen Dank!
MFG Kretschi

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Externes Programm automatisch schließen
26.10.2007 17:49:23
Tino
Hallo,
hat es im letzten Beitrag nich funktioniert?
Habe ja keine Rückmeldung bekommen!
Gruss Tino

AW: Externes Programm automatisch schließen
27.10.2007 12:45:52
Kretschi
Hallo Tino,
ne hat leider nicht geklappt und ich war die Woche über weg! Der Code wie er oben steht, öffnet und schließt, dass Programm aber halt leider viel zu schnell! Muss irgendwie an der Schleife liegen, die ist doch an der richtigen Stelle?
MFG Kretschi

AW: Externes Programm automatisch schließen
27.10.2007 12:58:00
Tino
Hallo,
mein Lösungsvorschlag ist ja gar nicht eingebaut?
Gruss
Tino

AW: Externes Programm automatisch schließen
27.10.2007 13:35:00
Kretschi
Hallo,
ich weiß, hab mich auch an deinem Lösungsvorschlag versucht. Das Problem ist, dass die Simulation später einige Stunden laufen wird und man mit der "sendkeys" Fkt. wahrscheinlich, wie Du es auch beschrieben hast, den Rechner in Ruhe lassen muss. Ich werd aber nicht der einzige sein der das Modell später bedienen wird und so erscheint mir die andere Variante die sichere zu sein.
Hast Du vielleicht noch eine Idee zu dem anderen Code? Wäre echt super!
Vielen Dank
Kretschi

Anzeige
AW: Externes Programm automatisch schließen
27.10.2007 13:47:00
Tino
Hallo,
dafür müsste man dein Programm genau kennen, um da genauer etwas machen zu können.
Gruss
Tino

AW: Externes Programm automatisch schließen
27.10.2007 14:25:00
Kretschi
Hallo,
das Programm das ich laufen lassen will heißt Kpro (Kreisprozessprogramm zur Berechnung von Kraftwerksprozessen) und ist meines Wissens in Fortran geschrieben. Mit der Shell Fkt. starte ich die krpohaup.exe, diese öffnet sich dann, rechnet und am Ende erscheint das beschriebene Fenster "Program Terminated with exit code 0; Exit Window? (Yes/No?). Das heißt das einzige was ich dann mache ist die Exe wieder zu schließen.
Ich kenn mich leider nicht so gut aus, mit dem was ich bisher rausgefunden hab, dürfte der Code aber fast schon stimmen. Die Exe wird momentan leider einfach nur zu schnell geschlossen.
MFG Johannes

Anzeige
AW: Externes Programm automatisch schließen
27.10.2007 14:36:34
Tino
Hallo,
also hast du ja schon die beendigungsprozedur also
brauchst du ja auch kein senkeys.
warte mit meinem beispiel, bis dass besagte fenster aufgeht und schiebe deine bendigungsprozedur hinterher, vieleich noch eine pause von ein bar sekunden dazwischen und fertig.
Gruss
Tino

AW: Externes Programm automatisch schließen
27.10.2007 14:50:21
Kretschi
Hallo,
eine Schleife mit einer Verzögerung zum Warten wäre sehr schlecht, da sich die Rechenzeit mit jeder sekunde um ca. 2,5 Stunden verlängern würde. Werde aber mal versuchen die Beendigungsprozedur mit deinem Code zu kompinieren.
MFG Jo

AW: Externes Programm automatisch schließen
27.10.2007 22:34:00
Tino
Hallo,
sollte es funktionieren, kannst du ja mal Rückmeldung geben.
Gruss
Tino

Anzeige
AW: Externes Programm automatisch schließen
29.10.2007 10:16:45
Kretschi
Hallo,
auch diese Option funktioniert leider nicht! Ich vermute, dass ich die Schleife in meinem Code (erster Post) verändern muss.
Hat jemand vielleicht noch einen Tipp!
Danke

AW: Externes Programm automatisch schließen
29.10.2007 11:01:00
Tino
Hallo,
so funktioniert es nicht?

Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function TerminateProcess Lib "kernel32" (ByVal _
hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal _
dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal _
dwProcessID As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As _
Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal _
hProcess As Long, lpExitCode As Long) As Long 'neu
Const PROCESS_TERMINATE = &H1
Const Aktiv = &H103 'neu
Private ProcessId As Long
Private ProcessId_Exit As Long
Private RetVal As Variant
Sub Test3()
Dim l As Long
Dim Zähler As Long
ProcessId = Shell("D:\app\fcit\kpro46de\rkern\kprohaup.exe", vbNormalFocus)
'Shell startet das ausgewählte Programm.
ProcessId_Exit = OpenProcess(PROCESS_TERMINATE, 0&, ProcessId)
'Mit dieser Funktion erhalten Sie das Object-Handle auf den
'aktiven Prozess.
Prüfe_Nochmal:
If Prüfe("Name Fenstertitel") = False Then 'hier Titel des Fenster eingeben der nach  _
Programmende angezeigt wird
AppActivate "Microsoft Excel"
Sleep (100) 'warte mit Prüfung 100 Millisekunden
Zähler = Zähler + 1
If Zähler > 100 Then GoTo Anwendungsfehler: 'nach 100 * 100 Millisekunden abbruch der  _
Schleife
GoTo Prüfe_Nochmal
End If
RetVal = TerminateProcess(ProcessId_Exit, 1&)
'Mit der TerminateProcess Funktion können Sie den ausgewählten
'Prozess und all seine Threads (falls vorhanden) beenden.
RetVal = CloseHandle(ProcessId_Exit)
'Hier wird das Handle wieder geschlossen.
Exit Sub
Anwendungsfehler:
MsgBox "Zeit abgelaufen"
End Sub
Function Prüfe(Fenster As String) As Boolean
On Error GoTo fehler
AppActivate Fenster
Prüfe = True
Exit Function
fehler:
Prüfe = False
End Function


Userbild
Gruss
Tino

Anzeige
AW: Externes Programm automatisch schließen
29.10.2007 11:11:00
Harry
Hallo,
google mal nach Function GetWindowThreadProcessId Lib "user32.dll". Damit müsstest du in einer Schleife alle Fenster prüfen können, ob sie zu deiner ProcessID gehören.
Gruß
Harry

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige