Newsgroup: it.comp.lang.visual-basic
Titolo: Shellexecute e altro

Salve a tutti,
Avrei qualche domandina e una urgenza spaventosa :-)
Spero mi possiate aiutare ........ che momenti !!
Devo fare un programmino che apre a determinate orari un file .pps
specifico.
Per capire da che ora a che ora quel pps deve girare avrei pensato di
nominare i file così:
Pres1@10_50@10_55.pps
Pres1@11_00@11_15.pps
ecc....
Poi con il comando split estraggo i due valori dell'ora e modifico _ in .
Da qui in poi non so come fare :-)
Io ho fatto qualche prova inserendo i valori a mano usando lo shellexecute
    Dim adesso As String
    adesso = Mid$(Time, 1, 5)
    Select Case adesso
        Case "18.46"
            retval = ShellExecute(Form1.hwnd, "Open", "C:\Test1.pps",
0&, 0&, 3)
            End If
        Case "18.47"
            retval = ShellExecute(Form1.hwnd, "Open", "C:\Test2.pps",
0&, 0&, 3)
        Case "18.48"
            retval = ShellExecute(Form1.hwnd, "Open", "C:\Test3.pps",
0&, 0&, 3)
    End Select
ma ho due problemi !
1: Mi apre centomila pps perchè per un minuto (giustamente) l'ora non
cambia e continua ad entrare nello stesso case
2: non so come chiudere il il pps aperto con shellexecute per
visualizzare il successivo.
Se sono stato abbastanza chiaro mi date una mano per favore ?
Grazie, Alverman

Una soluzione potrebbe essere quella di usare una tabella del tipo:
OraApertura   FilePPS       Stato
10:00            File1.PPS       C
11:00            File2.PPS       C
12:00            File3.PPS       A
Con un controllo timer (o quello che ti pare), ogni minuto fai un ciclo 
sulla tabella e vedi quale file aprire cambiando lo stato in modo che se è 
già aperto (A) non lo riapri.
Per chiudere un file aperto il discorso è un pò più lungo ma cercando con 
Google puoi trovare la soluzione più adatta alle tue esigenze.
Ciao, Vincenzo

non ricordo se è la shellexcute, cmq un APE di Win apre un file e ritorna il 
suo hwn!
di conseguenza mediante un altra APE puoi gestirtela e quindi chiudere 
bloccare mandare in errore :-) 


Poche idee ma ben confuse... ;-)
Scherzi a parte, per attendere la chiusura del processo associato ad un file non
si riesce ad usare ShellExecute (che non ritorna "il suo hwn"...), ma occorre la
ShellExecuteEx.
Copioincollo un pezzo tratto dal sito experts-exchange:
"The problem with shellexecute is that it does not return a process handle that
allows us to check if the external process is done.  However, ShellExecuteEx
does return a process handle... :)
Private Const SEE_MASK_INVOKEIDLIST = &HC
Private Const SEE_MASK_NOCLOSEPROCESS = &H40
Private Const SEE_MASK_FLAG_NO_UI = &H400
Private Const INFINITE = &HFFFF
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As
Long, ByVal dwMilliseconds As Long) As Long
Private Type SHELLEXECUTEINFO
    cbSize As Long
    fMask As Long
    hwnd As Long
    lpVerb As String
    lpFile As String
    lpParameters As String
    lpDirectory As String
    nShow As Long
    hInstApp As Long
    lpIDList As Long
    lpClass As String
    hkeyClass As Long
    dwHotKey As Long
    hIcon As Long
    hProcess As Long
End Type
Private Declare Function ShellExecuteEx Lib "shell32.dll" (SEI As
SHELLEXECUTEINFO) As Long
Sub ShellExecuteAndWait(FileName As String, Verb As String)
    Dim SEI As SHELLEXECUTEINFO
    Dim r As Long
    With SEI
        .cbSize = Len(SEI)
        .fMask = SEE_MASK_NOCLOSEPROCESS Or SEE_MASK_FLAG_NO_UI
        .hwnd = Me.hwnd
        .lpVerb = Verb
        .lpFile = FileName
        .lpParameters = vbNullChar
        .lpDirectory = vbNullChar
        .nShow = vbNormalFocus
        .hInstApp = 0
        .lpIDList = 0
    End With
    ShellExecuteEx SEI
    WaitForSingleObject SEI.hProcess, INFINITE
End Sub
Bye
Raf
-----------------------------------------------------
Funk: cooler than the other side of the pillow.

 suo hwn!
ShellExecute: If the function succeeds, the return value is the 
instance handle of the application that was run, or the handle of a 
dynamic data exchange (DDE) server application.
-- 
E Pluribus UNIX.
News 2000 [v 2.06] - 
http://www.akapulce.net/socket2000

 dynamic data exchange (DDE) server application.
Ahimé non è più così da parecchie versioni di Windows a questa parte.
http://msdn2.microsoft.com/en-us/library/ms647732.aspx
In particolare:
Return Value
    Returns a value greater than 32 if successful, or an error value that is
less than or equal to 32 otherwise. The following table lists the error values.
The     return value is cast as an HINSTANCE for backward compatibility with
16-bit Windows applications. It is not a true HINSTANCE, however. The only thing
that can be done with the returned HINSTANCE is to cast it to an int and compare
it with the value 32 or one of the error codes below.
    0 The operating system is out of memory or resources.
    ERROR_FILE_NOT_FOUND The specified file was not found.
    ERROR_PATH_NOT_FOUND The specified path was not found.
    ...
-- 


non mi ero distanziato poi di molto :-)
non tocco un APE da un pacco 

Io sto usando:
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal
lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd
As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Const WM_CLOSE = &H10
e la chiamo da una sub:
Private Sub Chiudi(App As String)
Debug.Print "Presentazione di PowerPoint - [" & App & "]"
Dim winHwnd As Long
Dim RetVal As Long
winHwnd = FindWindow(vbNullString, "Presentazione di PowerPoint - [" & App
& "]")
If winHwnd <> 0 Then
RetVal = PostMessage(winHwnd, WM_CLOSE, 0&, 0&)
If RetVal = 0 Then
Debug.Print "Errore nella chiusura."
End If
Else
Debug.Print "non aperto."
End If
End Sub
E funziona bene, passando per esteso il nome del programma con il file
aperto. Un problema mi nasce quando su un pc è configurato per vedere
l'estensione dei file o no. Di fatti sul portatile non è visibile mentre
su desktop si, quindi sul portatile basta in App passi 'NomeFile' mentre
sul desk App deve essere 'NomeFile.pps'
C'è un modo per capire se un pc è configurato per visualizzare le
estensioni dei files o no ?
Grazie, Alverman


Ti lancio una proposta più "pulita", che non dipende da impostazioni del SO, né
dalla lingua di Office (infatti il metodo di cui sopra fallisce se hai Office
NON in italiano):
- aggiungi ai riferimenti del progetto la libreria "Microsoft PowerPoint X
Object Library", ove X sta per la versione di PowerPoint installata (es. 9 in
Office 2000)
- per chiudere la presentaz. PowerPoint (come per tutte le altre applicazioni
della suite di Office) usi la cosiddetta "Automazione", ossia oggetti COM propri
di PowerPoint.
Private Sub ChiudiPresentazCorrente()
Dim ppApp As PowerPoint.Application
Dim prsPres As PowerPoint.Presentation
    Set ppApp = GetObject("", "PowerPoint.Application")
    Set prsPres = ppApp.ActivePresentation
    prsPres.Close
    ppApp.Quit
End Sub
Che te ne pare?
Ovviamente anche per aprire il file PPS potresti usare gli stessi oggetti di
PowerPoint, anziché ShellExecute, leggi qui:
http://www.microsoft.com/technet/prodtechnol/office/office2000/proddocs/opg/part2/ch05.mspx


 End Sub
Occhio a settare a nothing le variabili di riferimento, pena (in molti casi) 
il tenere l'oggetto appeso in memoria.
Io lancio una soluzione molto simile, ma ancor piu' general-purpose dato che 
non richiede di conoscere la versione di office installata e neanche di 
aggiungere alcun riferimento alla libreria specifica. Sfrutta il late 
binding, e laddove office non fosse proprio installato genererebbe un errore 
runtime (aggirabile con una corretta gestione degli errori):
Private Sub ChiudiPresentazCorrente()
   Dim ppApp As Object
   Dim ppPres As Object
   Set ppApp = GetObject("", "PowerPoint.Application")
   Set ppPres = ppApp.ActivePresentation
   Call ppPres.Close
   Set ppPres = Nothing
   Call ppApp.Quit
   Set ppApp = Nothing
End Sub
hth,
Lokar 

 Lokar
Ciao

UHD !!!
SPETACOLO!!
Ma se per caso non è installato Office ma solo il viewer di Powerpoint andrebbe
lo stesso ?
Ti chiedo questo perchè sui miei pc è installato office e non posso verificare
se va solo con il viewer.
Comunque grazie un miliardo :-)
Alverman

 verificare se va solo con il viewer.
Dovrai ripiegare su altre tecniche, temo.
Ad esempio l'uso di ShellExecuteEx per avviare l'applicazione riuscendo ad
ottenere l'handle del processo + TerminateProcess per terminarlo.
Bye
Raf


Come qui:
http://www.openntf.org/Projects/codebin/codebin.nsf/CodeByDate/85F8254BBAA5C00F862571D40071F211
Bye
Raf