I ett program jag skriver startas ett externt program (för bandavläsning). Jag vill veta när detta program är klart för att därefter låta mitt program fortsätta. Det externa programmet skapar en logfil. Jag tänkte att jag skulle kolla när den är stängd. Hur gör man det i VB? Det är enklare att kolla när processen avslutas. Har gjort en liten funktion som kanske kan hjälpa dig. Klistra in följande kod i en modul: Hej Jag skulle skämas om jag var du SvenPon. Om man ska klaga, kan du ju kontrollera att du har rätt. Hej Tack Andreas och Sven för era tips! Jag fick detta att funka ....MEN.... Spara Process-IDn i en statisk eller global variabel. Kolla med en timer verje sekund, eller var 5:e sekund eller något med koden ovan. Har skapat och laddat upp et exempel: Tack igen Andreas (och Niklas).Hur verifiera om en textfil (loggfil) är öppen av annat prog
Sv: Hur verifiera om en textfil (loggfil) är öppen av annat
Om du startar programet med shell får du tillbaks ett tal som representerar processens id. Du kan med hjälp av API anrop kontrollera när processen är avslutad. Sv: Hur verifiera om en textfil (loggfil) är öppen av annat
<code>
Option Explicit
Private Const INFINITE As Long = &HFFFFFFFF
Private Const SYNCHRONIZE As Long = &H100000
Private Const WAIT_FAILED As Long = &HFFFFFFFF
Private Const WAIT_OBJECT_0 As Long = &H0&
Private Const WAIT_ABANDONED As Long = &H80&
Private Const WAIT_TIMEOUT = &H102&
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal DesiredAccess As Long, ByVal bInheritHandle As Long, ByVal ProcessId As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal Milliseconds As Long) As Long
Public Function ShellEx(ByVal PathName As String, Optional WindowStyle As VbAppWinStyle = vbNormalFocus, Optional TimeOut As Long = INFINITE)
Dim ProcessId As Long
Dim hProcess As Long
Dim lReturn As Long
ProcessId = Shell(PathName, WindowStyle)
If ProcessId Then
hProcess = OpenProcess(SYNCHRONIZE, 0, ProcessId)
If hProcess Then
lReturn = WaitForSingleObject(hProcess, TimeOut)
CloseHandle hProcess
Select Case lReturn
Case WAIT_OBJECT_0 'Allt ok
Case WAIT_TIMEOUT
Err.Raise vbObjectError + 1, "ShellEx", "Timeout"
Case WAIT_FAILED
Err.Raise vbObjectError + 2, "ShellEx", "Failed"
Case WAIT_ABANDONED
Err.Raise vbObjectError + 3, "ShellEx", "Abandoned"
End Select
End If
ShellEx = ProcessId
End If
End Sub
</code>Sv: Hur verifiera om en textfil (loggfil) är öppen av annat
Om du inte vill krångla med API :er in absurdum som Andreas
kan du göra så här,funkar alldeles utmärkt.
Private Sub Command1_Click()
Dim ret As Double
On Error GoTo OpenError
'Här öppnar du ditt logprogram där jag skrivit Notepad
'Obs viktigtt att du skriver hela sökvägen
ret = Shell("C:\Windows\NotePad.exe", vbNormalFocus)
Do Until ret <> 0
DoEvents
Loop
MsgBox ("LoggProgrammet Klart")
OpenOk:
Exit Sub
OpenError:
MsgBox "Fel vid öppnandet av loggprogram"
Resume OpenOk
End Sub
mvh
SvenSv: Hur verifiera om en textfil (loggfil) är öppen av annat
Ser inte vitsen med din kod. Fortsätter oavsett om processen är klart eller ej. Om shell skulle retunera 0 kommer en evighetslopp att starta.
Kan du vara vänlig att förklara vad du försöker åstakomma med din kod?Sv: Hur verifiera om en textfil (loggfil) är öppen av annat
>Jag skulle skämas om jag var du SvenPon
Jag skulle skämmas om jag inte kunde stava vanliga svenska ord !
"Ständigt denna vessla" som Ture Sventon skulle säga.
I vilket läge skulle ret aldrig kunna bli 0 ?
Shell
Runs an executable program and returns a Variant (Double) representing the program's task ID if successful, otherwise it returns zero.
undrar
SvenSv: Hur verifiera om en textfil (loggfil) är öppen av annat
PeoSv: Hur verifiera om en textfil (loggfil) är öppen av annat
Den process jag vill få koll på är bandavläsning, vilket av naturliga skäl kan ta mycket lång tid. Och denna kod gör att mitt program går i vänteläge tills dess att bandavläsningen är klar. Användaren kan därför inte jobba vidare med andra funktioner som jag hade tänkt. Ja inte ens minimera formuläret/formulären.
Jag skulle därför behöva ett tips om det går att utföra samma typ av kontroll utan att låsa det egna programmet.Sv: Hur verifiera om en textfil (loggfil) är öppen av annat
Lås programmet tills den är fri.
/Niklas JanssonSv: Hur verifiera om en textfil (loggfil) är öppen av annat
Programarkivet:Startar en process och känner av när den avslutas.Sv: Hur verifiera om en textfil (loggfil) är öppen av annat
Att lägga WaitForSingleObject i Timer-subben.... Det är ju lysande. Jag höll på att grotta med timer-kontrollen på en massa andra (felaktiga) sätt.
KANON!
Tack än en gång.
Peo