Comportamento getObject e CreateObject dei server di automazione di Office

Riassunto

Questo articolo illustra i diversi comportamenti che si verificano quando si usano le funzioni GetObject e CreateObject con diverse 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 si fa riferimento a CreateObject come chiamate all'API CoCreateInstanceAPI.

Altre informazioni

OttieniOggetto

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 viene eseguita 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 seguente messaggio di errore di esecuzione intercettabile.

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

Se sono in esecuzione più istanze di Microsoft Excel, GetObject si connette 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 viene collegato 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. Per esempio:

set xlApp = CreateObject("Excel.Application")

A seconda che il server sia progettato come SingleUse o MultiUse, è possibile che venga avviato o meno un altro processo del server. Questa potrebbe essere una distinzione importante per decidere se è necessario arrestare forzatamente un'istanza di Automazione. Ad esempio, con un server MultiUse, se un'istanza è già in esecuzione prima di collegarla, è consigliabile evitare di arrestare il server programmaticamente 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 quando viene avviato, se è SingleUse o MultiUse, se ha una proprietà UserControl, se ha un metodo Quit e il nome della classe per la finestra principale.

Applicazione/i Visibile Istanze Ha un controllo utente Ha QuitClassName Nome classe
Excel 97, 2000, 2002, 2003, 2007 NO Monouso XlMain
Word 97, 2000, 2002, 2003, 2007 NO Monouso 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
Access 97 Monouso OMain
Access 2000, 2002, 2003, 2007 NO Monouso 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 al rilascio dell'ultimo riferimento (impostata 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 Application ProgID e quindi aprire o creare nuovi oggetti da questa posizione. Altri progID, ad esempio Excel.Sheet e Word.Document e così via, sono destinati all'uso in OLE (collegamento di oggetti e incorporamento) e possono restituire risultati incoerenti quando 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 dell'uso del server di automazione, eliminare tutti i riferimenti e chiamare il relativo metodo Quit (se disponibile) in modo che il server si spenga come previsto. Se si vuole configurare un'istanza tramite Automazione e quindi lasciarla aperta per l'uso da parte dell'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.