Avatar billede skovs Nybegynder
07. januar 2004 - 13:28 Der er 10 kommentarer og
2 løsninger

Vent på at setup bliver

Er der nogen der kender en funktion som afventer den fortsatte eksekvering af et VB program indtil et andet er færdig.

Jeg har en setupfil som skal køres og afsluttes før mit program arbejde videre.

Jeg har prøvet med forskellige shell funktioner, men da disse eksekvere en dos-kommando som blot starter programmet fra DOS, så virker de ikke da de ser på dos-viduets aktivitet.

Har i andre forslag?
Avatar billede driis Nybegynder
07. januar 2004 - 13:33 #1
Ja, brug ShellExecute API'en. 2 sekunder.
Avatar billede skovs Nybegynder
07. januar 2004 - 13:38 #2
OK
Avatar billede driis Nybegynder
07. januar 2004 - 13:40 #3
Du må kunne bruge noget lignende dette (har ikke lige VB installeret på denne maskine, så det er ikke testet):

Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Declare Function WaitForSingleObject Lib "kernel32" Alias "WaitForSingleObject" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long

Dim hProc as long
Dim ret as long
hProc = ShellExecute(Me.hwnd,"open","ditprogram.exe","","",1)
ret = WaitForSingleObject(ret,480000)
Avatar billede driis Nybegynder
07. januar 2004 - 13:41 #4
ret = WaitForSingleObject(ret,480000)

Venter på at programmet lukkes, eller timeout tiden er gået. Timeout har jeg sat til 480000 millisekunder = 8 minutter. Denne tid kan du selvfølgelig ændre.
Avatar billede skovs Nybegynder
07. januar 2004 - 13:55 #5
Når jeg køre :
Dim hProc As Long
Dim ret As Long
hProc = ShellExecute(Me.hwnd, "open", "c:\wtsfarm\setup.exe", "", "", 1)
ret = WaitForSingleObject(ret, 480000)
MsgBox "TEST"

Så eksekvere den også beskeden "Test" Altså så venter den ikke på at setup bliver færdig. Istedet eksekvere den MSGBOX lige efter de øvrige koder. Er det mig der gør noget galt?
Avatar billede kabbak Professor
07. januar 2004 - 13:57 #6
Avatar billede driis Nybegynder
07. januar 2004 - 14:09 #7
ups, den skal være sådan her:

Dim hProc As Long
Dim ret As Long
hProc = ShellExecute(Me.hwnd, "open", "c:\wtsfarm\setup.exe", "", "", 1)
ret = WaitForSingleObject(hProc, 480000)
Avatar billede skovs Nybegynder
07. januar 2004 - 14:13 #8
Sorry kabbak den smadre programmet helt
Avatar billede skovs Nybegynder
07. januar 2004 - 14:56 #9
Sorry men jeg kan ikke få det til at virke. Men jeg har fundet en anden løsning på baggrund af dig driis. Derfor får du et par points.

Løsningen er:
Option Explicit
Dim isRunning As Boolean


Private Type STARTUPINFO
        cb As Long
        lpReserved As String
        lpDesktop As String
        lpTitle As String
        dwX As Long
        dwY As Long
        dwXSize As Long
        dwYSize As Long
        dwXCountChars As Long
        dwYCountChars As Long
        dwFillAttribute As Long
        dwFlags As Long
        wShowWindow As Integer
        cbReserved2 As Integer
        lpReserved2 As Long
        hStdInput As Long
        hStdOutput As Long
        hStdError As Long
End Type

Private Type PROCESS_INFORMATION
        hProcess As Long
        hThread As Long
        dwProcessID As Long
        dwThreadID As Long
End Type

Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long

Private Declare Function CreateProcessA Lib "kernel32" (ByVal lpApplicationName As Long, ByVal lpCommandLine As String, ByVal lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long

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

Private Const NORMAL_PRIORITY_CLASS = &H20&
Private Const INFINITE = -1&

Public Sub ExecCmd(cmdline$)
    Dim proc As PROCESS_INFORMATION
    Dim start As STARTUPINFO
    Dim ReturnValue As Integer

       
    start.cb = Len(start)

       
    ReturnValue = CreateProcessA(0&, cmdline$, 0&, 0&, 1&, _
    NORMAL_PRIORITY_CLASS, 0&, 0&, start, proc)

       
    Do
        ReturnValue = WaitForSingleObject(proc.hProcess, 0)
        DoEvents
    Loop Until ReturnValue <> 258

    ReturnValue = CloseHandle(proc.hProcess)
End Sub



Private Sub Command2_Click()
ExecCmd "NOTEPAD.EXE"



MsgBox "HEJ"


End Sub
Avatar billede sjh Nybegynder
07. januar 2004 - 15:09 #10
skovs < http://www.eksperten.dk/spm/447141 virker da fint, dog skulle man nok bruge DoEvents i mellem Do ... Loop så smadre den ikke dit program ;)


'-------------------------------- Form1 --------------------------------
Option Explicit

Private Declare Function GetProcessVersion Lib "Kernel32.dll" (ByVal lProcessID As Long) As Long

Private Sub Command1_Click()
Dim lPID As Long

  lPID = Shell("notepad.exe", vbNormalFocus)

  Do: DoEvents
  Loop While GetProcessVersion(lPID) <> 0

  MsgBox "Programmet notepad.exe køer ikke mere."
End Sub
'-------------------------------- Form1 --------------------------------
Avatar billede skovs Nybegynder
08. januar 2004 - 08:10 #11
Ja det kan jeg se nu, men faktisk fungerer hverken mit eget forslag eller driis's. Kun på programmer og ikke på winsheild setupfiler som det faktisk drejer sig om her. Jeg har dog fundet ud af at man kan eksekvere et lille program som efterfølgende eksekvere setupfilen og så virker de begge.
Avatar billede sjh Nybegynder
08. januar 2004 - 17:00 #12
har du prøvet at starte dit dos-program sådan:
cmd.exe /c c:\dosprogram.exe

eller

command.com /c c:\dosprogram.exe
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester