Det jeg har gjort er: Dim Program Program = Shell(Program.Exe, vbHide) 'Starts the program Do Until Len(Program) > 0 'Looping until program has started Loop strProcessID = Program 'Getting processID
Og herefter har jeg så tænkt mig at lave et loop ala: Do until procces is not running 'Looping until program has ended Loop CmdRun = "Programmet er kørt"
Nej det vil ikke virke, for Program er = ProcessID indtil det bliver ændret (Hvilket den ikke gør automatisk). Det vil sige, at der skal kigges på processen, for at se om den stadig kører.
Jeg sad og legede lidt med dette...hvis du laver en DoEvents før din loop, vil programmet starte helt op før der fortsættes. Jeg prøvede at åbne et dokument med winword.exe...hele dokumentet blev åbnet før VB fortsatte. Så du kan ersatte din loop med en If..end if
Dim Program Program = Shell(Program.Exe, vbHide) 'Starts the program DoEvents If Len(Program) > 0 strProcessID = Program 'Getting processID Else 'program failed to start End If
Ok, så er loopet ikke længere nødvendigt. Så mangler jeg bare at finde ud af når programmet er blevet lukket (Eller i mit tilfælde, hvornår barchjobbet er slut)
Det er nøjagtigt det samme jeg roder med...nemlig et batchjob. Jeg har en løsning som jeg bruger nu, men den er ikke så fed. Jeg laver output fra batchjob til fil: batchjob.bat > result.txt Og for at gøre det besværligt så oprettes result.txt allerede når batchjobbet går igang, så i slutningen af mit bacthjob laver jeg en rename af filen til nyresult.txt..nyresult.txt bliver altså oprettet som sidste linie i min batchprocess. Jeg looper så bare indtil filen nyresult.txt findes. Når den findes er bacthjobbet færdigt, og jeg slette nyresult.txt igen. Ikke den bedste måde at lave det på, men det virker indtil jeg finder en anden metode.
Option Explicit Private mvarProg As String Private mvarParameter As String Private Declare Function GetProcessVersion Lib "Kernel32.dll" (ByVal lProcessID As Long) As Long
Public Function CmdRun() As String Dim Program Dim intProcessID Dim strReturn
Program = Shell(mvarProg & mvarParameter, vbHide) 'Starts the program DoEvents If Len(Program) > 0 Then 'Program started intProcessID = Program 'Getting processID 'Test if program has finished WaitForProcessToEnd (intProcessID) strReturn = "Programmet er færdig!" Else 'program failed to start strReturn = "Der skete en fejl, og programmet startede ikke." End If CmdRun = strReturn End Function Private Sub WaitForProcessToEnd(PID As Long) Do DoEvents Loop While GetProcessVersion(PID) <> 0 End Sub Public Property Let Prog(ByVal vData As String) mvarProg = vData End Property
Public Property Let Parameter(ByVal vData As String) mvarParameter = vData End Property
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.