Interop.PowerPoint non esce da PowerPoint

martedì 27 novembre 2007 - 18.26

napoleone1981 Profilo | Newbie

Ciao,
sono nuovo di questo forum e non so se questa è la sezione giusta... in caso chiedo ai moderatori di spostare il post.
Comunque, sto usando le Interop 11.0 (in particolare quelle di PowerPoint, ma il problema dovrebbe essere condiviso con le altre) per modificare un ppt a runtime.

Tutto va a buon fine, nel senso che il ppt viene modificato e salvato correttamente in una ltro file, e l'applicazione non dà nessun errore/eccezione ma, quando chiudo la presentazione a runtime, sembra non chiudersi effettivamente.

Infatti, quando poi provo ad aprire il file da windows (normalmente) non succede nulla e guardando nel TaskManager vedo che c'è ancora attivo un processo di PowerPoint, come se non fosse stato chiuso il programma. Chiudendolo a mano e riaprendo il file, lo posso vedere tranquillamente.

Nel codice, per chiudere la presentazione e il programma, ho usato:

pptPresentation.Close();
applicationPPT.Quit()

Spero di essere stato chiaro...
Qualcuno sa quale è il problema??

Ciao,
N@poleone

erongis Profilo | Junior Member

Forse dico una cavolata, ma hai provato a scrivere:

applicationPPT = nothing

Magari funziona.

napoleone1981 Profilo | Newbie

sí, ma purtroppo non cambia nulla...

StefanoLep Profilo | Senior Member

Ciao, prova con pptApplication.dispose().


E' la passione che genera il progresso :-)

napoleone1981 Profilo | Newbie

mmm, non mi sembra fosse un oggetto disposable, però domani quando torno a lavoro proverò, grazie del consiglio...

napoleone1981 Profilo | Newbie

In effetti non c'è il metodo Dispose; ho provato a settare anche pptPresentation a null ma non cambia nulla... uffa!!

StefanoLep Profilo | Senior Member

Ho fatto una prova con excel e così funziona:

'qua istanzio la variabile e lancio il programma
Dim XLS As Microsoft.Office.Interop.Excel.Application

XLS = New Microsoft.Office.Interop.Excel.Application

XLS.Workbooks.Open("C:\aaa.xls")

XLS.Visible = True


'quando ho finito faccio così e il programma scompare dal task manager
XLS.Quit()
XLS = Nothing
GC.Collect()

Fammi sapere se funziona, altrimenti faccio una prova specifica con powerpoint :-)

E' la passione che genera il progresso :-)

napoleone1981 Profilo | Newbie

Provato anche GC.Collect(), ma nulla...
Io utilizzo C# invece che VB, ma non dovrebbe essere questo il problema, visto che le Interop sono le stesse
Questo è il codice per aprire applicazione e poi presentazione:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Altre soluzioni?? Sto processo di PowerPoint mi rimane sempre appeso!! UFFA!!

L'unica differenza con la tua porzione è che io non faccio vedere PowerPoint nella TaskBar, mentre tu lo setti a Visible se non sbaglio...

StefanoLep Profilo | Senior Member

Ho fatto una prova e mi sembra che venga chiuso tutto senza problemi. In pratica Powerpoint parte non appena avvii il progetto (per via del riferimento che hai impostato) e si chiude quando chiudi tutto il progetto. Questo comportamento l'ho verificato usando VB e tenendo aperto sempre il task manager, per ovviare al problema ho tolto il riferimento a Powerpoint e usato il late binding (puoi anche testare tutto il codice così com'è e poi quando tutto funziona per risolvere questo ultimo neo togli il riferimento e usi il late binding):

Dim oApp As New Object 'PowerPoint.Application
Dim ppt As Object 'PowerPoint.Presentation

oApp = CreateObject("PowerPoint.Application")
oApp.Activate()

ppt = oApp.Presentations.Open("C:\aaa.ppt")


'per chiudere (in questo preciso ordine):

ppt.Close()
ppt = Nothing
oApp.Quit()
oApp = Nothing
GC.Collect()

In C# dovrebbe essere:
object oApp; // 'PowerPoint.Application
object ppt;// PowerPoint.Presentation

oApp = CreateObject("PowerPoint.Application");
oApp.Activate();
ppt = oApp.Presentations.Open("C:\aaa.ppt");
//metti tutto il codice che ti serve...

// per chiudere (in questo preciso ordine):
ppt.Close();
ppt = null;
oApp.Quit();
oApp = null;
GC.Collect();

E' la passione che genera il progresso :-)
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5