Avatar billede force_master Praktikant
22. juni 2004 - 23:39 Der er 16 kommentarer og
1 løsning

Pause til shell er færdig

har et program som kører et commandline.

"her har vi lavet noget
shell(etellerandet)
''' vil gerne den ikke fortsætter i proceduren før shell er afsluttet.'''
programmet kører videre."
Avatar billede vbcoder Nybegynder
23. juni 2004 - 07:47 #1
shell funktionen er designet sådan at ikke kører som en del af dit program dvs. at dit program ikke stopper indtil shell er færdig.

dette er pr. design da der jo er mange anvendelses muligheder for shell som ikke behøver at have noget med dit program at gøre.

hvis man er afhængig af et resultat fra shell funktionen kunne man måske lave en løkke hvor man søger efter shell opgaven i de kørende opgaver og når den ikke længere findes må shell opgaven være færdig.
Avatar billede joern Nybegynder
23. juni 2004 - 11:54 #2
Hej.

Hvis du tildeler shell en værdi, kan du teste på værdien og dermed afgøre om det kaldte program er afsluttet, - men ikke om det er 'færdigt'.

x = shell("notepad.exe c:\windows\win.ini"

M.v.h.  Jørn
Avatar billede sjh Nybegynder
23. juni 2004 - 13:08 #3
Avatar billede sjh Nybegynder
23. juni 2004 - 13:26 #4
'---------------------------------------- Form1 ----------------------------------------
Option Explicit

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode 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 Const STILL_ACTIVE              As Long = &H103
Private Const PROCESS_QUERY_INFORMATION As Long = &H400

Public Sub ShellWait(ByVal strFile As String, _
                    Optional emuStyle As VbAppWinStyle = vbNormalFocus)
Dim lR As Long
Dim hProcess As Long
  hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, _
            Shell(strFile, emuStyle))
  If (hProcess <> 0) Then
    Do
      Call GetExitCodeProcess(hProcess, lR)
      DoEvents: Sleep 1
    Loop While lR = STILL_ACTIVE
  End If
End Sub

Private Sub Command1_Click()
Const FILE As String = "c:\winnt\system32\notepad.exe"
  Call ShellWait(FILE)
  MsgBox FILE
End Sub
'---------------------------------------- Form1 ----------------------------------------
Avatar billede force_master Praktikant
23. juni 2004 - 16:28 #5
Hej
Har nu følgende kode,
men det virker ikke .

Option Explicit

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode 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 Const STILL_ACTIVE              As Long = &H103
Private Const PROCESS_QUERY_INFORMATION As Long = &H400


Public Sub ShellWait(ByVal strFile As String, _
                    Optional emuStyle As VbAppWinStyle = vbNormalFocus)
Dim lR As Long
Dim hProcess As Long
  hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, _
            Shell(strFile, emuStyle))
  If (hProcess <> 0) Then
    Do
      Call GetExitCodeProcess(hProcess, lR)
      DoEvents: Sleep 1
    Loop While lR = STILL_ACTIVE
  End If
End Sub





Private Sub Command2_Click()
Dim frasti, program, hjemdir As String
Dim udpak As FILE
If Text1.Text = "" Then Exit Sub
frasti = Chr(34) & Text1.Text & Chr(34)
program = "wzunzip -d -o"
hjemdir = Chr(34) & App.Path & Chr(34)
ChDrive ("C:\")
ChDrive ("C:\")
udpak = "wzunzip -d -o" & " " & frasti & " frasti.txt " & "C:\"
Const FILE As String = udpak
Label1.Caption = "VENT VENLIGST"
Label1.Refresh
Call ShellWait(FILE)

Hvorfor virker det ikke ?
Avatar billede sjh Nybegynder
23. juni 2004 - 16:31 #6
er "wzunzip -d -o" en DOS command??
Avatar billede thesurfer Nybegynder
23. juni 2004 - 16:52 #7
Nej, det er udpakningsprogram (dekomprimering) til formatet "zip".

Men hedder den ikke "pkunzip"..?
Avatar billede thesurfer Nybegynder
23. juni 2004 - 16:59 #8
force_master> DOS kan ikke lide mellemrum, i mappe/fil -navne.. derfor skal der "" tegn udenom stien.. feks.:

"c:\mappe med mellemrum"

Derfor skal det nok være:

udpak = "wzunzip -d -o """ & frasti & frasti.txt & """ C:\"

1) Du har fejl i den linie. Dit "&" tegn (det før "C:\") er i selve stien..

2) hvorfor bruger du også "frasti.txt" (altså ".txt"-delen) når det er en variabel?
Avatar billede thesurfer Nybegynder
23. juni 2004 - 17:01 #9
Der skal nok bare være (fjerner frasti.txt):

udpak = "wzunzip -d -o """ & frasti & """ ""C:\"""
Avatar billede thesurfer Nybegynder
23. juni 2004 - 17:06 #10
Ahh.. lagde lige mærke til linien: frasti = Chr(34) & Text1.Text & Chr(34)

Sådan her: udpak = "wzunzip -d -o " & frasti & " ""C:\""" :-)

Bruger du variablerne "program" og "hjemdir"?
Avatar billede force_master Praktikant
23. juni 2004 - 23:39 #11
Der er ikke problemer med at udpakke , alt dette virker 100%


det det drejer sig om er det med at den skal vente med at gå videre , før end "wzunzip" er færdig.
Avatar billede sjh Nybegynder
24. juni 2004 - 02:29 #12
1 -> Dim udpak As FILE  skal nok være  Dim udpak As String
2 -> så gør du sådan:  Call ShellWait(udpak)
3 -> Prøv om du kan få din kode til at virke ved at skrive:  Shell(strFile, vbNormalFocus)
Avatar billede sjh Nybegynder
24. juni 2004 - 02:30 #13
3 -> = Call Shell(udpak, vbNormalFocus)
Avatar billede force_master Praktikant
24. juni 2004 - 06:52 #14
virker stadig ikke.
må nok opgive
Avatar billede sjh Nybegynder
24. juni 2004 - 06:59 #15
du skal nok skrive stig til wzunzip

fx.
c:\programmer\wzunzip -d -o osv...
Avatar billede force_master Praktikant
24. juni 2004 - 07:10 #16
stien har jeg jo , c:\ skifter jeg til før , og den ligger i roden, den wzunzip fil.

som sagt er det ikke selve afviklingen af programmet der driller , men det med at få den til at pause indtil "unzip" er færdig..
Avatar billede sorenstrom Nybegynder
07. juli 2004 - 16:29 #17
Lidt sent men:
Jeg bruger denne kode uden problemer:
Opret en form:
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
 
Private Declare Function OpenProcess Lib "kernel32" _
  (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
    ByVal dwProcessId As Long) As Long


Private Const INFINITE = -1&
Private Const SYNCHRONIZE = &H100000

Private Sub Command1_Click()
    Dim iTask As Long, ret As Long, pHandle As Long
    iTask = Shell("notepad.exe", vbNormalFocus)
    pHandle = OpenProcess(SYNCHRONIZE, False, iTask)
    ret = WaitForSingleObject(pHandle, INFINITE)
    ret = CloseHandle(pHandle)
    MsgBox "Process Finished!"
End Sub

/Søren
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

IT-JOB

PensionDanmark

AI Automation Engineer

Netcompany A/S

Linux Operations Engineer

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Senior Data Engineers til dataplatform i Forsvaret

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Cyberdivisionen søger Business Relationship Manager