Comportamento GetObject e CreateObject dei server di automazione di Office

Riepilogo

Questo articolo illustra i diversi comportamenti che si verificano quando si usano le funzioni GetObject e CreateObject con varie versioni delle applicazioni di Microsoft Office.

GetObject e CreateObject sono funzioni fornite da Microsoft Visual Basic e Microsoft Visual Basic, Applications Edition (VBA). Tuttavia, le informazioni sono applicabili anche a Microsoft Visual C++ se si considerano i riferimenti a GetObject come chiamate all'API GetActiveObject e i riferimenti a CreateObject come chiamate a CoCreateInstanceAPI.

Ulteriori informazioni

Getobject

GetObject viene usato per connettersi a un'istanza in esecuzione di un server di automazione. Esistono diversi modi per chiamare GetObject, ma la sintassi consigliata per le applicazioni di Microsoft Office è la seguente:

set xlApp = GetObject(, "Excel.Application")

Se un'istanza di Microsoft Excel è in esecuzione quando viene eseguito questo codice, è possibile accedere al modello a oggetti dell'istanza in esecuzione tramite la variabile xlApp. Se non è in esecuzione alcuna istanza, viene visualizzato il messaggio di errore di runtime intercettabile seguente:

Run-time error '429':
ActiveX component can't create object  

Se sono in esecuzione più istanze di Microsoft Excel, GetObject si collega all'istanza avviata per prima. Se quindi si chiude la prima istanza, un'altra chiamata a GetObject si collega alla seconda istanza avviata e così via.

È possibile collegarsi a un'istanza specifica se si conosce il nome di un documento aperto in tale istanza. Ad esempio, se un'istanza di Excel è in esecuzione con una cartella di lavoro aperta denominata Book2, il codice seguente si collega correttamente a tale istanza anche se non è la prima istanza avviata:

Set xlApp = GetObject("Book2").Application

Createobject

CreateObject viene usato per avviare una nuova istanza di un server di Automazione. Ad esempio:

set xlApp = CreateObject("Excel.Application")

A seconda che il server sia progettato come SingleUse o MultiUse, un altro processo del server può essere avviato o meno. Questa potrebbe essere una distinzione importante per decidere se arrestare forzatamente un'istanza di Automazione. Ad esempio, con un server MultiUse, se un'istanza è già in esecuzione prima di connettersi, è possibile evitare di arrestare il server a livello di codice al termine dell'automazione.

La tabella seguente funge da riferimento utile per l'implementazione di una soluzione con Microsoft Office. Elenca i comportamenti e gli attributi delle varie versioni e applicazioni di Microsoft Office, ad esempio se il server è visibile per impostazione predefinita all'avvio, se è SingleUse o MultiUse, se ha una proprietà UserControl, se ha un metodo Quit e il nome della classe per la relativa finestra principale.

Applicazioni Visibile Istanze Ha UserControl Ha QuitClassName Nome classe
Excel 97, 2000, 2002, 2003, 2007 No SingleUse XlMain
Word 97, 2000, 2002, 2003, 2007 No SingleUse OpusApp
PowerPoint 97 No Multiuso No PP97FrameClass
PowerPoint 2000 No Multiuso No PP9FrameClass
PowerPoint 2002 No Multiuso No PP10FrameClass
PowerPoint 2003 No Multiuso No PP11FrameClass
PowerPoint 2007 No Multiuso No PP12FrameClass
Accesso 97 SingleUse OMain
Access 2000, 2002, 2003, 2007 No SingleUse OMain
Progetto 98, 2000 No Multiuso JWinproj-WhimperMainClass

Il nome della classe della finestra principale è utile per chiamare l'API FindWindow quando si vuole scoprire in modo pratico se un'istanza è già in esecuzione. La proprietà UserControl è una proprietà booleana che indica se l'applicazione server viene arrestata automaticamente quando viene rilasciato l'ultimo riferimento (impostato su nothing). Il metodo Quit consente di eseguire l'override della proprietà UserControl nei casi in cui è necessario, ad esempio quando un'istanza non viene arrestata dopo il rilascio dell'ultimo riferimento.

In generale, Microsoft consiglia di usare una nuova istanza di un'applicazione di Office invece di collegarsi a un'istanza che l'utente potrebbe usare. È consigliabile creare un'istanza usando il ProgID dell'applicazione e quindi aprire o creare nuovi oggetti da questa istanza. Altri progID, ad esempio Excel.Sheet e Word. Document e così via sono destinati all'uso in OLE (Collegamento e incorporamento di oggetti) e possono dare risultati incoerenti se usati con CreateObject. Usando il ProgID dell'applicazione, è possibile evitare potenziali problemi avviando in modo esplicito il server per l'automazione (non incorporamento).

Al termine del server di automazione, rilasciare tutti i riferimenti e chiamare il relativo metodo Quit (se disponibile) in modo che il server venga arrestato come previsto. Se si desidera configurare un'istanza tramite Automazione e lasciarla aperta all'utente, è necessario impostare la proprietà UserControl su TRUE e quindi rilasciare tutti i riferimenti. Il server rimane quindi in esecuzione (perché la proprietà UserControl è TRUE) e si arresta in modo appropriato quando l'utente chiude l'applicazione (perché non sono presenti riferimenti in sospeso).

Nota Per Word, la proprietà UserControl è di sola lettura. Non può essere impostato su True o False. Word rimane sempre in esecuzione quando viene rilasciato l'ultimo riferimento.