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 | Sì | Sì | XlMain |
Word 97, 2000, 2002, 2003, 2007 | No | SingleUse | Sì | Sì | OpusApp |
PowerPoint 97 | No | Multiuso | No | Sì | PP97FrameClass |
PowerPoint 2000 | No | Multiuso | No | Sì | PP9FrameClass |
PowerPoint 2002 | No | Multiuso | No | Sì | PP10FrameClass |
PowerPoint 2003 | No | Multiuso | No | Sì | PP11FrameClass |
PowerPoint 2007 | No | Multiuso | No | Sì | PP12FrameClass |
Accesso 97 | Sì | SingleUse | Sì | Sì | OMain |
Access 2000, 2002, 2003, 2007 | No | SingleUse | Sì | Sì | OMain |
Progetto 98, 2000 | No | Multiuso | Sì | Sì | 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.
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per