Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263

    vb6 - Chiudere un qualsiasi File.pdf da VB6

    Devo chiudere un File.pdf perchè lo devo cancellare ed ovviamente se è aperto non lo posso fare e non so se l'utente lo ha lasciato aperto o chiuso. Inoltre non so se il File.pdf è stato generato e/o aperto da Acrobat Standard, Acrobat Reader, PDF Creator o altro.
    Sfogliando qua e la credo di avere capito che è relativamente facile aprire un File.pdf con VB6, ma che è decisamente più complicato chiuderlo.
    Credo inoltre di avere capito che bisogna fare ricorso alle API e che è necessario individuare la Classe cui appartiene il File aperto, ma confesso di avere una grande, grande confusione.
    Qualcuno sa darmi una scaletta di cose da studiare/vedere in modo chiaro e progressivo per arrivare a fare quello che mi serve? magari con qualche esempio? Ogni consiglio è comunque benvenuto.
    Grazie.

  2. #2
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Ovviamente non puoi chiudere un file, ma l'applicazione che lo ha aperto.
    E qui si apre un mondo di teorie, perché vattelapesca sapere con quale programma è aperto.

    La sola cosa che mi viene in mente è quella di tentare di aprire il file in modalità diretta con una banale
    Open ...

    Se il file è accessibile, significa che non è aperto da un'applicazione, allora lo chiudi e procedi.
    Se non lo è avvisi l'utente che deve chiuderlo lui.

  3. #3
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263
    Grazie Gibra.
    Con "applicazione che lo ha aperto" intendi l'applicazione residente sul PC che gestisce i Files.pdf?
    Diversamente lo posso aprire io da VB6, ma sul mio PC ho Acrobat 8, mentre sui Client posso avere Reader o anche altro.
    Insomma non mi consigli di perdermi in questa storia, se ho capito bene, ...
    Grazie.

  4. #4
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Quote Originariamente inviata da Rickycast Visualizza il messaggio
    Grazie Gibra.
    Con "applicazione che lo ha aperto" intendi l'applicazione residente sul PC che gestisce i Files.pdf?
    Non solo quella, tu non hai idea di cosa fa l'utente, di quale applicazione usa, e così via.

    Quote Originariamente inviata da Rickycast Visualizza il messaggio
    Diversamente lo posso aprire io da VB6, ma sul mio PC ho Acrobat 8, mentre sui Client posso avere Reader o anche altro.
    Insomma non mi consigli di perdermi in questa storia, se ho capito bene, ...
    Grazie.
    Veramente non capisco assolutamente cosa intendi...
    Scusa, ma se devi chiuderlo, perché mai lo vuoi aprire?

  5. #5
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263
    Ci si dimentica spesso che chi ti legge non ha in mente quello che intendi tu: Scusami.

    Lo devo aprire per farne vedere il contenuto all'utente e lo apro da VB6 con ShellExecute.
    Questo File.pdf è il risultato di scelte che l'utente può fare in un form e che può stampare o inviare via mail a destinatari diversi; per questo viene prodotto in PDF, in modo che chiunque lo possa stampare.
    Se però l'utente si accorge che il contenuto non è quello che vuole, allora lo deve produrre nuovamente con lo stesso nome ma con contenuti diversi e quindi ho bisogno di cancellarlo (kill) e di conseguenza di chiuderlo.
    Spero di esserre stato chiaro, anche se non è mai facile.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    237
    Ciao
    Premessa: non sono esperto di VB6 e saprei fare quello che chiedi tu in vb.net, che permette di far partire e chiudere i processi..
    Cercando su internet ho trovato questo codice:
    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 Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Private Const INFINITE = &HFFFF ' Timeout infinito
    Private Const SYNCHRONIZE = &H100000
    
    esecuzione di un programma con attesa della chiusura
    
    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
    Il programma qua fa altro oltre ad aprire il file... Però l'idea è che c'è la variabile process_handle che ti può dire se il processo (il file è aperto) è in esecuzione oppure no. E poi con close lo termini..

  7. #7
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263
    Grazie renygade. Appena ho un minuto provo la procedura.

    Ciao.

  8. #8
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Quote Originariamente inviata da Rickycast Visualizza il messaggio
    Ci si dimentica spesso che chi ti legge non ha in mente quello che intendi tu: Scusami.
    No problem, basta parlarsi.

    Quote Originariamente inviata da Rickycast Visualizza il messaggio
    Lo devo aprire per farne vedere il contenuto all'utente e lo apro da VB6 con ShellExecute.
    Questo File.pdf è il risultato di scelte che l'utente può fare in un form e che può stampare o inviare via mail a destinatari diversi; per questo viene prodotto in PDF, in modo che chiunque lo possa stampare.
    Se però l'utente si accorge che il contenuto non è quello che vuole, allora lo deve produrre nuovamente con lo stesso nome ma con contenuti diversi e quindi ho bisogno di cancellarlo (kill) e di conseguenza di chiuderlo.
    Spero di esserre stato chiaro, anche se non è mai facile.
    Bene, allora è la tua applicazione che crea il file.
    In tal caso, quando l'utente ri-genera il PDF non fai altro che intercettare l'errore che si verificherà durante la creazione del file, indicando con un messaggio all'utente che deve chiuderlo per continuare, a quel punto puoi fare:
    codice:
    Kill nomefile
    prima di ri-generarlo.

    N.B. Non credo che il codice di renygade ti risolva il problema.
    Se il file è aperto, la WaitForSingleObject mica te lo chiude; resta solo in attesa (INFINITE) che venga chiuso.
    Se l'utente non lo chiude... Sei punto a capo





  9. #9
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263
    Quello che mi indichi di fare è esattamente quello che ho fatto e ovviamente funziona.
    Sarebbe molto più comodo (conosco i miei utenti) se l'operazione si svolgesse automaticamente.

    Grazie comunque.

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    237
    Quote Originariamente inviata da gibra Visualizza il messaggio
    N.B. Non credo che il codice di renygade ti risolva il problema.
    Se il file è aperto, la WaitForSingleObject mica te lo chiude; resta solo in attesa (INFINITE) che venga chiuso.
    Se l'utente non lo chiude... Sei punto a capo



    Si certo, è chiaro che il codice va riadattato alle sue esigenze. Il pensiero che ci sta dietro è che quando è capitato a me una situazione simile, ho risolto gestendo il processo di apertura del file e la conseguente chiusura alla sua ri-generazione.
    Quel codice (che non ho provato) dovrebbe permetterti di verificare se il file è aperto (il processo è ancora attivo) e in tal caso chiuderlo, per evitare l'errore nella sovrascrittura...

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.