Newsgroup: it.comp.lang.visual-basic
Titolo: Problmea con lancio sincrono di un batch su Win98

Ciao a tutti, ho un problema: 
devo creare un .BAT con all'interno una serie di istruzioni, salvarlo su
una directory e successivamente lanciarlo dall'applicazione in modo
sincrono (in finestra nascosta).
Non posso, per motivi che non sto a spiegare, lanciare ogni singola
operazione: il tutto deve invece essere racchiuso nel bat che viene creato
al volo, salvato e lanciato.
Il tutto funziona su sistemi NT based (2000 e XP in particolare) mentre su
98 il rocesso mi rimane appeso perchè la finestra non si chiude.. il
tipico messaggio "il comando è stato eseguito adesso è possibile chiudere
la finestra" (o roba del genere, non ho sottomano il pc con Win98 adesso).
Se il bat, una volta salvato, lo lancio "a mano" ha lo stesso effetto.
Se creo un PIF legato al bat in cui specifico di chiudere la finestra alla
fine dell'esecuzione allora tutto ok.
Il problema maggiore sta nel fatto che non posso portare l'ambiente di
sviluppo su win 98. Come posso ovviare a tale problema?
Preferirei risolvere il tutto da codice e non obbligare gli utenti con win
 98 a smanettare (se mai fosse possibili) con le impostazioni del computer.
Potrei anche creare il .PIF legato al BAT, impostare in quaklche modo il
"chiudi finestra a fine esecuzione" e lanciare quello, ma:
1) non so come si crea un PIF da codice
2) poichè deve essere lanciato in maniera sincrona, non vorrei che il
"pif" si chiuda prima del bat associato.. non so se mi spiego: lancio il
pif, questo klancia il bat e si chiude magari prima del termine
dell'esecuzione del .bat, tornando il controllo al VB quando invece il
batch deve ancora finire la sua esecuzione.
in ogni caso esiste un punto in win98 dove impostare la chiusura delle
finestre dos a fine esecuzione di default?
qui di seguito la (conosciuta) funzione che utilizzo per lanciare il BAT
in modo sincrono
Option Explicit
Option Private Module
Public Const INFINITETIMEOUT = -1&      '  Infinite timeout
Private Const WAIT_TIMEOUT = 258&
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 Byte
        hStdInput As Long
        hStdOutput As Long
        hStdError As Long
End Type
Type PROCESS_INFORMATION
        hProcess As Long
        hThread As Long
        dwProcessId As Long
        dwThreadId As Long
End Type
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
Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As
Long, ByVal dwMilliseconds As Long) As Long
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Const NORMAL_PRIORITY_CLASS = &H20&
Public Sub ShellSync(ToRun As String, Optional CommandLine As Variant)
   Dim cmdLine$
   If Not IsMissing(CommandLine) Then
      cmdLine$ = ToRun & " " & CommandLine
   Else
      cmdLine$ = ToRun
   End If
   Dim proc As PROCESS_INFORMATION
   Dim Start As STARTUPINFO
   Dim Ret&
   Start.cb = Len(Start)
    Start.wShowWindow = 0 '6 - minimizzato
    Start.dwFlags = 1
    Ret& = CreateProcessA(0&, cmdLine$, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS,
0&, 0&, Start, proc)
 
   Ret& = WaitForSingleObject(proc.hProcess, INFINITETIMEOUT)
   Ret& = CloseHandle(proc.hProcess)
End Sub
ciao
Andrea
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 la finestra" (o roba del genere, non ho sottomano il pc con Win98 adesso).
basta disabilitare l'output a video nel batch mettendo in testa al file
BAT, prima dell'inizio dei comandi, @ECHO OFF
Cosě facendo, anche su windows 9x la finestra si chiude una volta eseguito
il batch per intero
saluti.
