Vb vba

Liebe/-r Experte/-in,
ich habe in VB (6.0, SP 6) und VBA öfter das Problem, ein anderes Programm mittels der Shell-Funktion zu starten, das wird lt. Dokumentation asynchron ausgeführt. Wie kann man feststellen, dass dieses Programm beendet ist(ich brauche das Ergebnis zur Weiterverarbeitung)?
Oder gibt es dafür eine andere Funktion, z.B. direkt Windows aufrufen?
Vielen Dank für die Unterstützung

Hallo Herr Engelhardt.

Ich hoffe, ich habe die Frage richtig verstanden, und versuche, ihnen zu helfen.

Wenn man via Shell-Commando einen Task startet, bekommt man im Erfolgsfall eine Task-ID zurück.

Beispiel:
TaskID = Shell(„c:\winnt\system32\notepad.exe“, vbNormalNoFocus)

Mit Hilfe dieser Task-ID kann man jederzeit ermitteln, ob dieser Task noch läuft. Dazu benötigt man jedoch verschiedene API-Methoden.

Ein gutes Beispiel diesbezüglich findet man unter nachfolgendem Link:

http://www.vbarchiv.net/tipps/details.php?id=367

Sollten noch Fragen offen sein, stehe ich gerne zur Verfügung.

Gruß

Henry

Hallo Henry,

vielen Dank für die rasche Antwort, das scheint genau das zu sein, was ich suche. Ich muss damit mal experimentieren, das gestartete Programm soll nicht sichtbar sein und beendet sich selbst, aber ich denke, das kriege ich hin.

Nochmals danke, Rainer

Hallo Rainer,

das einzige was ich kenne, ist die Windows-API WaitForSingleObject.

siehe: http://msdn.microsoft.com/en-us/library/ms687032(VS…

Hier ein kleiner bescheidener Beispielcode, denn du in den VBA cokde reinkopieren und adaptieren kannst.
Hoffe es hilft.

'---------- C O D E - A N F A N G ----------

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

Private Declare Function WaitForSingleObject Lib „kernel32“ ( _
ByVal hHandle As Long, _
ByVal dwMilliseconds As Long) _
As Long

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

Const SYNCHRONIZE = &H100000
Const INFINITE = -1&

Public Sub WartenBisAppZurueckKommt()
Dim taskid As Double
Dim hProcess As Long
Dim Result As Long

taskid = Shell(„notepad.exe“, vbNormalFocus)
hProcess = OpenProcess(SYNCHRONIZE, False, taskid)
Result = WaitForSingleObject(hProcess, INFINITE)
Result = CloseHandle(hProcess)
End Sub

'---------- C O D E - E N D E ----------

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Böttchi,

vielen Dank für die rasche Antwort, ich werde das ausprobieren.

Hallo,

ich glaube, man kann in Windows die Taskliste auswerten. Aber gemacht hab ich das noch nicht. Ich weiß nur, dass unser aktueller Auftragnehmer dasselbe Problem hat (er muss feststellen, ob ein Programm beendet wurde).

Viele Grüße,

André

Die einzige mir bekannte Möglichkeit ist, in einer nachfolgenden Schleife die Beendigung des gestarteten Programms abzufragen. Aber man muß nicht alles selbst erfinden. Eine Lösung ist in
http://www.aboutvb.de/khw/artikel/khwshell.htm
zu finden.

Gruß Pensibald

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Okay, prima, ich denke, damit komme ich weiter.
Rainer

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]