Google
 

it » comp » lang » visual-basic

Problmea con lancio sincrono di un batch su Win98

di (Andrea_)
il Tue, 10 Jul 2007 10:38:51 +0200
newsgroups it.comp.lang.visual-basic
message-id <f6vgir$mmc$1@news.newsland.it>

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 abuse@newsland.it


Risposte

Tutti i messaggi della discussione