vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
SEPA-Dateien erstellen inkl. IBAN-, BLZ-/Kontonummernprüfung  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Fortgeschrittene Programmierung
Warten ... 
Autor: Blackbox
Datum: 05.06.16 12:10

Hallo Woellmi,

ich schrieb schon: Deine Starter-Exe muss auf das Mutex-Handle aufpassen wie die Henne auf das Ei oder der Hahn auf die Hennen. Dein Probramm schließt das Mutex nämlich sofort nachdem das andere Probramm aufgerufen wurde.

Der Fehler am Beispiel:

Sub Main()
    static nCounter as Long
 
    hMutex=CreateMutex(0&, 1&, "AufrufendesProg")
 
    nCounter = nCounter + 1
    If Is2ndProgStarted() Then
       MsgBox "Fehler: bitte 2ndProg beenden! (" & Cstr(nCounter) & ")"
    Else
       Start2ndProg() 
       'Hier fehlt eine Function die verhindert dass der Thread die If-Anweisung
       'nicht gleich verlassen kann. Es wird sofort CloseHandle hMutex 
       ' aufgerufen, sofern
       'das andere Programm asynchron gestartet wurde. Die Funktionen Shell und 
       ' ShellExecute()
       'sind asynchrone Funktionen!       
    End If
 
    CloseHandle hMutex
 
End Sub
Ich nehme mal an, du nimmst die VB-Shell-Funktion zum Aufruf des externen Programms. Die Syntax dazu ist ja dann:

Dim hProcessID As Long
hProcessID = Shell("NotePad.EXE", 1)

Die Programmausführung setzt, weil Shell() asynchron ist, sofort weiter. Aber Du hast: hProcessID.
Mittels dieser ID lässt sich der Handle des Process erruieren, dass das den über Shell gestarteten
Prozess identifiziert. Das erlaubt, dass man sich über diese ProcessID private Zugriffsrechte auf
den gestarteten Prozess holen kann um, evtl. was Du ja brauchst, den Prozess aus dem asynchronen Lauf
in einen kontrollierten synchronen Lauf zu zwingen. Dazu erbt man mit OpenProcess() einfach einen
Handle:

Dim hProcessID As Long
Dim hProcess As Long

hProcessID = Shell("NotePad.EXE", 1)
hProcess = OpenProcess(PROCESS_SYNCHRONIZE, True, hProcessID)
WaitForSingleObject hProcess, INFINITE

Jetzt wartet man einfach nur darauf, dass hProcess, das ja signalisiert ist auf
einen unsignalisierten Zustand kippt und das genau macht die Funktion: WaitForSingleObject()
Somit synchroner Aufruf eines beliebigen Prozess und warten, bis der beendet ist:

Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" _
   (ByVal lpMutexAttributes As Long, _
    ByVal bInitialOwner As Long, _
    ByVal lpName As String) As Long
 
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject 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 WaitForSingleObject Lib "kernel32.dll" ( _
     ByVal hHandle As Long, _
     ByVal dwMilliseconds As Long) As Long
 
Private Const ERROR_ALREADY_EXISTS = 183&
Private Const PROCESS_SYNCHRONIZE = &H100000
Private Const INFINITE As Long = &HFFFFFFFF
 
 
Private m_hMutex As Long
Private Const s_NamedMutex As String = "MyExistAppCheck" 'Der Name des Mutex
                                                         ' ist eigentlich egal,
                                                         'soll aber in der App
                                                         ' unikat sein
Public Sub Main()
    Dim hProcessID As Long
    Dim hProcess As Long
 
    m_hMutex = CreateMutex(0&, 1, s_NamedMutex)
 
    If Err.LastDllError = ERROR_ALREADY_EXISTS Then
       MsgBox "Solange die andere Anwendung läuft kann das Programm nicht" & _
         "wieder gestartet werden"
       Exit Sub
    End If
 
    hProcessID = Shell("NotePad.EXE", 1)
    hProcess = OpenProcess(PROCESS_SYNCHRONIZE, True, hProcessID)
 
    'Warten bis der Prozess beendet wurde. VB-Programm startet Notepad.EXE und
    'es wird sich hier weiter nichts tun, bis Notepad.EXE geschlossen wurde.
    WaitForSingleObject hProcess, INFINITE
 
    MsgBox "Der zweite Prozess wurde geschlossen, jetzt das Mutex und das" & _
      "Process-Object freigeben"
 
    CloseHandle hProcess
    CloseHandle m_hMutex
 
End Sub
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Start einer externen VB6 Anwendung aus einer VB6 Anwendung2.196Woellmi26.05.16 09:20
Re: Start einer externen VB6 Anwendung aus einer VB6 Anwendu...1.137Blackbox26.05.16 11:35
Re: Start einer externen VB6 Anwendung aus einer VB6 Anwendu...1.252Woellmi26.05.16 23:33
Re: Start einer externen VB6 Anwendung aus einer VB6 Anwendu...1.104Woellmi27.05.16 00:24
Re: Start einer externen VB6 Anwendung aus einer VB6 Anwendu...1.224effeff27.05.16 11:52
Re: Start einer externen VB6 Anwendung aus einer VB6 Anwendu...1.092Woellmi28.05.16 00:10
Re: Start einer externen VB6 Anwendung aus einer VB6 Anwendu...1.129Blackbox27.05.16 14:04
Re: Start einer externen VB6 Anwendung aus einer VB6 Anwendu...1.067Woellmi28.05.16 00:27
Re: Start einer externen VB6 Anwendung aus einer VB6 Anwendu...1.112Woellmi31.05.16 00:15
Re: Start einer externen VB6 Anwendung aus einer VB6 Anwendu...1.190Blackbox01.06.16 22:22
Re: Start einer externen VB6 Anwendung aus einer VB6 Anwendu...1.164Woellmi02.06.16 22:07
Warten ...1.281Blackbox05.06.16 12:10
Re: Warten ... (Teil 1)1.107Woellmi06.06.16 17:47
Re: Warten ... (Teil 2)1.080Woellmi06.06.16 17:54
Re: Warten ... (Teil 3)1.194Woellmi06.06.16 17:59

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel