Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di ghini76
    Registrato dal
    Jun 2003
    Messaggi
    560

    [VB6] Come sapere quando viene chiusa l'applicazione lanciata da ShellExecute

    Ciao a tutti,
    utilizzo in un form il comando ShellExecute per lanciare l'applicazione associata ai file visualizzati in una ListView. In pratica quando l'utente fa doppio click sul nome di un file visualizzato nella ListView grazie alla ShellExecute il file viene aperto dal programma associato da Windows... ad esepio file .doc viene apertoda Word.

    Ora per verificare se l'utente ha modificato il file dovrei riuscire a sapere quando il file viene chiuso o quando l'applicazione viene chiusa, in modo che poi possa confrontare ladimensione e la data del file.

    Che mi dite? Come posso fare?

    Grazie a tutti

  2. #2
    Moderatore di CMS L'avatar di kalosjo
    Registrato dal
    Jul 2001
    residenza
    In culo alla luna
    Messaggi
    1,999
    Dichiarazioni
    codice:
     
    Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Public Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
    Public Const INFINITE = &HFFFF      '  Timeout infinito
    Public Const SYNCHRONIZE = &H100000
    esecuzione di un programma con attesa della chiusura
    codice:
            process_id = Shell("Programma\da\eseguire", vbNormalFocus)
            DoEvents
            process_handle = OpenProcess(SYNCHRONIZE, 0, process_id)
            If process_handle <> 0 Then
                WaitForSingleObject process_handle, INFINITE
                CloseHandle process_handle
            End If
    Scusate i puntini di sospensione...... La verità è che non ho argomenti....

  3. #3
    Utente di HTML.it L'avatar di ghini76
    Registrato dal
    Jun 2003
    Messaggi
    560
    Grazie per l'aiuto,
    mi da però un errore.
    Mi da "Sub o Function non definita" su CloseHandle...

    E poi potrei sostituire Shell con ShellExecute? Funziona lo stesso?

    Grazie ancora

  4. #4
    Moderatore di CMS L'avatar di kalosjo
    Registrato dal
    Jul 2001
    residenza
    In culo alla luna
    Messaggi
    1,999
    Domanda 1:

    ho dimenticato la definizione:

    Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long


    Domanda 2
    Si, se ti restituisce un handle del programma lanciato (sostituiscilo a shell)
    Scusate i puntini di sospensione...... La verità è che non ho argomenti....

  5. #5
    Utente di HTML.it L'avatar di ghini76
    Registrato dal
    Jun 2003
    Messaggi
    560
    Ora il codice viene eseguito correttamente però ho un comportamento anomalo.
    Se utilizzo Shell come nel tuo esempio i programmi si comportano esattamente come volevo, ovvero non posso utilizzare il mio programma in VB6 finchè non chiudo l'applicazione chiamata da Shell.
    Questo però non accade con ShellExecute. Lanciata l'applicazione competente posso cmq passare alla mia applicazione.
    In effetti ho controllato durante lesecuzione e con ShellExecute a process_handle viene assegnato 0 (zero).

    Mi serve di utilizzare la ShellExecute perchè mi apre automaticamente l'applicazione associata al file che gli passo.
    Hai un suggerimento?

    Grazie ancora

  6. #6
    Utente di HTML.it L'avatar di ghini76
    Registrato dal
    Jun 2003
    Messaggi
    560
    Alla fine ci sono riuscito con l'aiuto di altri forumisti... uso la Shell ma prima mi sono ricavato il programma che apre il file selezionato e il suo percorso con la FindExecutable.

    Grazie ancora

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2003
    Messaggi
    137
    Originariamente inviato da kalosjo
    Dichiarazioni
    codice:
     
    Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Public Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
    Public Const INFINITE = &HFFFF      '  Timeout infinito
    Public Const SYNCHRONIZE = &H100000
    esecuzione di un programma con attesa della chiusura
    codice:
            process_id = Shell("Programma\da\eseguire", vbNormalFocus)
            DoEvents
            process_handle = OpenProcess(SYNCHRONIZE, 0, process_id)
            If process_handle <> 0 Then
                WaitForSingleObject process_handle, INFINITE
                CloseHandle process_handle
            End If
    come mai mi da questo errore?
    "dopo end sub, end unction, end property sono ammessi solo commenti"
    Quuesto mess me lo visualizza su
    Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Lo da sia che le dichiari pubbliche al modulo sia che le dichiari in locale nella funzione

    invece le constanti mi da errore tranne se tolgo public.

    praticamente, perchè non va?

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2003
    Messaggi
    137
    ecco perchè non va!!!
    Allora intanto le const non vanno pubbliche, poi le declare devono essere come private e vanno messe all'inizio del modulo nella sezione generale. Infine la variabile process_handle è dichiarata senza la o per di process per un errore di battitura.. E così funzia!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.