Supportnet Computer
Planet of Tech

Supportnet / Forum / Anwendungen(Java,C++...)

Neues Problem mit VB





Frage

Hi! Folgendes Problem: Mein Programm hat ein anderes Programm gestartet. Nun soll mein Programm merken, wann das gestartete Programm wieder beendet wurde. Wenn das nicht geht, dann soll es zumindest merken wann es selber wieder benutzt wird. Versteht ihr? Danke! Gruß Bernie

Antwort 1 von Casvil

Du kannst doch bei deinem Prog einen Code ausgeben
In c++ in etwa

int main() // deine Hauptfunktion
{
return 0;
}

Sowas müsste auch mit deinem Prog gehen. Das Return 0 gibt dem BS den Fehlercode 0 zurück, somit weiss das BS dass dein Prog Fehlerfrei beendet wurde. Die Fehlerroutinen geben dann mit Return einen anderen Fehler aus, und so kann man dem User zeigen, ob er etwas Falsch gemacht hat, oder man zeigt ihm wo genau der Fehler lag.

Jedenfalls müsste es damit auch gehen, dass dein Proggie dieses Return abfängt. Ich hab leider keine VB erfahrung, hoffe aber es hilft.
©as

Antwort 2 von Bernie

Ich verstehe leider nicht was das mit meinem Problem zu tun hat.
Hilfe!!!

Antwort 3 von Casvil

War nur so eine idee. Jedes Proggie ist in der Regel so aufgebaut, dass es am Ende dem BS ne info gibt, was genau passiert ist, also Fehler etc. wie oben beschrieben. Es müsste doch gehen, dass du dann eine Ausstiegsroutine schreibst, die entweder diesen Stream abfängt/ausliest, damit dein Prog weiss dass das andere beendet wurde. Oder kannst du nicht eine Fkt. im 2 Proggie schreiben, welche dem ersten sagt, das es sich beendet, und dieses dann auch tut?!
©as


Antwort 4 von Bernie

Ja stimmt. Aber damit klappt es auch nicht. Hat noch jemand eine Idee?

Gruß Bernie

Antwort 5 von Nessus

Hi,

wenn Du ein externes (!) Programm über eine Routine im VB gestartet hast, läuft das als eigenständiger Task. Du müsstest dann in Intervalllen überprüfen, ob der Task noch läuft, wenn nicht soll eine Aktion ausgeführt werden.

Nessus

Antwort 6 von Alf

Es gibt eine Möglichkeit mit der Windows API herauszufinden, wann ein Programm beendet wurde. Es ist ähnlich kompliziert wie herauszufinden ob der Task noch läuft, aber weniger rechenintensiv. Wenn du an dem Code interessiert bist, schick ne PM.

Die obere ist sicherlich die eleganteste Lösung, es gibt aber auch noch andere.

Wenn du das 2. (zu startende) Programm auch selbst programmiert hast, kannst du...

...versuchen, es in das 1. zu integrieren. Als neues Formular, Modul, was auch immer.
...eine Datei erstellen oder einen Registrywert setzen. Das andere Programm überprüft dies in regelmäßigen Zeitabständen und reagiert dementsprechend.

Außerdem kannst du zum Beispiel die Form_Activate() oder Form_GotFocus() Methode benutzen, um herauszufinden, wann das Programm aktiviert wurde.

Das wars.

Antwort 7 von Bernie

Hi!
Also das Programm, was gestartet werden soll, habe ich nicht selber programmiert. Ich starte es mit folgendem Code:

Private Sub Programm(sFilename As String)
Dim sDirectory As String
Dim lRet As Long
Dim DeskWin As Long

DeskWin = GetDesktopWindow()
lRet = ShellExecute(DeskWin, "open", sFilename, _
vbNullString, vbNullString, vbNormalFocus)

Gruß
Bernie

Antwort 8 von Alf


Private Sub startExternApp(s_appFileName As String)
   Dim l_handle As Long
   Dim t_processInfo As PROCESS_INFORMATION
   Dim t_startupInfo As STARTUPINFO
   Dim l_success As Long
            
            
   t_startupInfo.cb = Len(t_startupInfo)
   l_success = CreateProcess(0&, s_appFileName, 0&, 0&, 1&, &H20, 0&, 0&, t_startupInfo, t_processInfo)
   
   If l_success = 0 Then
    l_handle = t_processInfo.hProcess

    MsgBox "Extern application could not be opened."
   Else
    Do Until WaitForSingleObject(l_handle, 0)
       DoEvents
    Loop
    
    MsgBox "Programm wurde beendet"
    '// add code, what should happen, if extern application
    '// is closed
   End If
   
End Sub


So funktionierts.

Antwort 9 von Bernie

Klappt leider nicht. Beim Aufruf von:
Dim t_processInfo As PROCESS_INFORMATION
Dim t_startupInfo As STARTUPINFO
erfolgt gleich ein Fehler.
Ist aber nicht schlimm. Ich habe das Problem jetzt auch anders gelöst.

Vielen Dank

Gruß Bernie