Office Automation con Visual C++

Riepilogo

In questo articolo vengono fornite risposte alle domande comuni relative all'automazione a Microsoft Office da Visual C++.

Ulteriori informazioni

Sommario

  1. Che cos'è l'automazione?

  2. Per altre informazioni sull'automazione, dove è possibile trovare risorse valide?

  3. Esistono diversi modi per usare l'automazione?

  4. Che cos'è COM?

  5. Come si associa all'istanza in uso di un'applicazione di Office?

  6. Come si passano I parametri facoltativi?

  7. Come si intercettano gli eventi esposti dalle applicazioni di Office?

  8. Il codice di automazione è troppo lento. Come si velocizza l'attività?

  9. Cosa significano questi enormi valori di errore, ad esempio-2147352573 o 0x80030002?

  10. Che cos'è una libreria di tipi?

  11. Il codice di automazione ha funzionato con Microsoft Excel 95, ma non riesce con Microsoft Excel 97. Perché?

  12. Perché l'applicazione che si sta automatizzando rimane in memoria dopo il completamento del programma?

  13. So cosa si vuole fare come utente di un'applicazione di Microsoft Office, ma come si esegue questa operazione a livello di programmazione usando l'automazione?

  14. È possibile automatizzare un'applicazione di Microsoft Office incorporata?

  15. Come si accede alle proprietà del documento in un documento di Microsoft Office?

Domande e risposte

  1. Che cos'è l'automazione? Automation (in precedenza automazione OLE) è una tecnologia che consente di sfruttare le funzionalità di un programma esistente e incorporarla nelle proprie applicazioni. Ad esempio, puoi usare le funzionalità di controllo ortografico e grammaticale di Microsoft Word nell'applicazione senza che Microsoft Word sia visibile agli utenti. È anche possibile usare tutti gli strumenti di analisi dei dati e grafici di Microsoft Excel. Questa tecnologia può semplificare e velocizzare notevolmente lo sviluppo.

  2. Per altre informazioni sull'automazione, dove è possibile trovare risorse valide? Il capitolo 24 di David Kruglinski "Inside Visual C++" (ISBN: 1-57231-565-2) fornisce una panoramica generale, oltre ad alcuni esempi eccezionali. Inoltre, la Microsoft Knowledge base è una buona fonte di informazioni. Questo articolo è un buon inizio ed è possibile trovare riferimenti più specifici nell'articolo della Microsoft Knowledge Base seguente:

    152023 Individuazione delle risorse per studiare l'automazione OLE Se si preferisce imparare con l'esempio, vedere l'articolo seguente nella Microsoft Knowledge Base:

    179706 HOWTO usare MFC per automatizzare Excel & creare/formattare una nuova cartella di lavoro

  3. Esistono diversi modi per usare l'automazione? È possibile usare l'automazione in tre modi di base: MFC, #import e C/C++:

    • Con MFC, USA Visual C++ ClassWizard per generare "classi wrapper" dalle librerie dei tipi di Microsoft Office. Queste classi, oltre ad altre classi MFC, come COleVariant, COleSafeArray, COleexception, semplificano le attività di automazione. Questo metodo è in genere consigliato sugli altri e la maggior parte degli esempi di Microsoft Knowledge base Usa MFC.

    • #import, una nuova direttiva resa disponibile con Visual C++ 5,0 crea VC + + "puntatori intelligenti" da una libreria dei tipi specificata. È molto potente, ma spesso sconsigliato a causa di problemi di conteggio dei riferimenti che in genere si verificano quando vengono usati con le applicazioni di Microsoft Office.

    • L'automazione C/C++ è molto più difficile, ma a volte è necessario evitare l'overhead con MFC o problemi con #import. In pratica, si utilizzano API come CoCreateInstance () e interfacce COM, ad esempio IDispatch e IUnknown.

    È importante notare che ci sono alcune piccole differenze tra l'automazione da C++ rispetto a C normale, perché COM è stato progettato intorno alla classe C++. Per altre informazioni, vedere l'articolo seguente nella Microsoft Knowledge base per un esempio di C:

    181473 HOWTO: usare l'automazione OLE da un'applicazione C

  4. Che cos'è COM? L'automazione si basa sul modello COM (Component Object Model). COM è un'architettura software standard basata sulle interfacce e progettata per avere codice separato in oggetti indipendenti. Considerala come un'estensione del paradigma della programmazione orientata agli oggetti, ma applicabile alle applicazioni separate. Ogni oggetto espone un set di interfacce e tutte le comunicazioni a un oggetto, come l'inizializzazione, le notifiche e il trasferimento dei dati, avvengono tramite queste interfacce. COM è anche un set di servizi forniti da librerie a collegamento dinamico (dll) installate con il sistema operativo. L'automazione usa molti di questi servizi. Un esempio è il servizio "marshalling", che consente di confezioni le chiamate dell'applicazione client alle funzioni membro delle interfacce dell'applicazione server e le passa, con i relativi argomenti, all'applicazione server. Viene visualizzato che le interfacce del server sono esposte nello spazio di memoria del client, che non è il caso quando il client è un. exe in esecuzione nel proprio spazio di processo. Gli strumenti di marshalling ottengono anche i valori restituiti dai metodi del server di nuovo attraverso i limiti del processo e in modo sicuro nelle mani della chiamata del cliente. Esistono molti altri servizi essenziali per l'automazione forniti dalle varie librerie COM. Le fonti di informazioni su queste includono "Inside OLE-Second Edition" di Kraig Brockschmidt, ISBN 1-55615-843-2, "Inside COM" di Dale Rogerson-ISBN 1-57231-349-8 e "Automation Programmer ' s Reference", ISBN 1-57231-584-9.

  5. Come si associa all'istanza in uso di un'applicazione di Office? Usa l'API GetActiveObject (). I server di automazione si iscrivono nella ROT (tabella oggetti in uso) tramite l'API RegisterActiveObject (). I client di automazione possono ottenere l'istanza in uso con codice, ad esempio:

          // Translate server ProgID into a CLSID. ClsidFromProgID      // gets this information from the registry.      CLSID clsid;      CLSIDFromProgID(L"Excel.Application", &clsid);        // Get an interface to the running instance, if any..      IUnknown *pUnk;      HRESULT hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);      ASSERT(!FAILED(hr));      // Get IDispatch interface for Automation...      IDispatch *pDisp;      hr = pUnk->QueryInterface(IID_IDispatch, (void **)&pDisp);      ASSERT(!FAILED(hr));      // Release the no-longer-needed IUnknown...      pUnk->Release();

    Nota: se sono in uso più istanze dell'applicazione di Office da allegare, sarà possibile allegare solo alla prima istanza avviata con l'API GetActiveObject (). In teoria, è possibile iterare la ROT per ogni singola istanza, ma le app di Office non si iscrivono se un'altra istanza è già in PUTREFAZIONe, perché il moniker per se stesso è sempre lo stesso (non può comunque essere distinto). Questo significa che non puoi allegare a nessuna istanza eccetto la prima. Tuttavia, poiché le app di Office registrano anche i loro documenti nella ROT, è possibile allegare correttamente ad altre istanze scorrendo la ROT alla ricerca di un documento specifico, allegando il testo e ottenendo quindi l'oggetto dell'applicazione. Nell'articolo della Microsoft Knowledge Base seguente è disponibile un codice per l'iterazione della PUTREFAZIONe e la ricerca di un nome di documento:

    190985 HOWTO: ottenere IDispatch di un documento di Excel o di Word da un OCX Non è necessario eseguire questa operazione per PowerPoint, perché si tratta di un'applicazione a istanza singola; è possibile avere un'unica istanza in cui è in corso.

  6. Come si passano I parametri facoltativi? Alcuni metodi hanno parametri "facoltativi". In Visual Basic puoi ometterli casualmente quando chiami il metodo. Tuttavia, quando si chiama con Visual C++ è necessario passare una variante speciale il cui campo VT è VT_ERROR e il campo SCODE è DISP_E_PARAMNOTFOUND. Cioè:

          // VARIANT used in place of optional-parameters.      VARIANT varOpt;      varOpt.vt = VT_ERROR;      varOpt.scode = DISP_E_PARAMNOTFOUND;

    Questo è davvero ciò che Visual Basic sta eseguendo dietro le quinte.

  7. Come si intercettano gli eventi esposti dalle applicazioni di Office? In pratica puoi implementare l'interfaccia dell'evento che vuoi intercettare (il "sink") e configurare una connessione consultiva con l'applicazione (la "fonte"). L'articolo seguente contiene esempi di istruzioni dettagliate per Microsoft Word:

    183599 HOWTO: catturare gli eventi delle applicazioni Microsoft Word97 con VC + + In generale, per configurare la connessione consultiva, Ottieni il IConnectionPointContainer del server e chiama FindConnectionPoint () con l'IID dell'interfaccia dell'evento. In questo modo, puoi chiamare Advise () con un'istanza dell'interfaccia dell'evento per un'interfaccia IConnectionPoint. Il server richiamerà quindi questa interfaccia quando si verificano questi eventi.

  8. Il codice di automazione è troppo lento. Come si velocizza l'attività? Una causa comune di problemi di velocità con l'automazione è la lettura e la scrittura ripetitiva dei dati. Questo è tipico per i client di automazione di Excel. Tuttavia, la maggior parte delle persone non sa che questi dati possono in genere essere scritti o letti contemporaneamente usando SAFEARRAY. Per altre informazioni ed esempi informativi, vedere gli articoli della Microsoft Knowledge base seguenti:

    186120 HOWTO: usare MFC per automatizzare Excel e riempire un intervallo con una matrice

    186122 HOWTO: usare MFC per automatizzare Excel & ottenere una matrice da un intervallo

    179706 HOWTO: usare MFC per automatizzare Excel e creare/formattare una nuova cartella di lavoro Inoltre, è importante sottolineare che l'uso degli Appunti può talvolta migliorare le prestazioni. Ad esempio, è possibile copiare i dati negli Appunti, quindi usare l'automazione per comunicare al server di incollarlo. O viceversa; informare il server su Copy-to-Clipboard e incollarlo nell'applicazione.

  9. Cosa significano questi enormi valori di errore, ad esempio-2147352573 o 0x80030002? Questi valori sono noti come HRESULT e sono definiti in Winerror. h. I numeri sono così grandi perché il primo bit indica se si tratta di un risultato di errore. Puoi usare l'utilità ErrLook. exe fornita con Visual C++ per tradurre questi numeri in descrizioni significative. Se si vuole ottenere una descrizione per gli errori a livello di codice, è possibile usare l'API FormatMessage (). Per altre informazioni ed esempi sull'uso di FormatMessage (), vedere gli articoli della Microsoft Knowledge base seguenti:

    186063 INFO: tradurre gli errori di automazione per VB/VBA

    122957 ESEMPIO: strumenti di decodificazione del codice di errore OLE Decode32 e Decode16Nota: se si usa visual c++ 6,0 e si ha una variabile contenente questo valore nella finestra controllo debug, accodare ", HR" (senza le virgolette) per avere Visual c++ tradurlo per te!

  10. Che cos'è una libreria di tipi? Una libreria di tipi è simile a un file di intestazione C/C++. Contiene le interfacce, i metodi e le proprietà che un server sta pubblicando. È possibile visualizzare la libreria dei tipi con il Visualizzatore di oggetti OLE/COM (Oleview. exe) fornito con Visual C++. Ecco un elenco dei nomi file della raccolta di tipi per Microsoft Office 95, 97 e 2000: Office Application | Type library ------------------------+---------------- Word 95 and prior | wb70en32.tlb Excel 95 and prior | xl5en32.olb Powerpoint 95 and prior | Powerpoint.tlb Access 95 and prior | msaccess.tlb Binder 95 | binder.tlb Schedule+ | sp7en32.olb Project | pj4en32.olb Team Manager | mstmgr1.olb Word 97 | msword8.olb Excel 97 | excel8.olb Powerpoint 97 | msppt8.olb Access 97 | msacc8.olb Binder 97 | msbdr8.olb Graph 97 | graph8.olb Outlook 97 | msoutl8.olb Outlook 98 | msoutl85.olb Word 2000 | msword9.olb Excel 2000 | excel9.olb Powerpoint 2000 | msppt9.olb Access 2000 | msacc9.olb Outlook 2000 | msoutl9.olb Word 2002 | msword.olb Excel 2002 | excel.exe Powerpoint 2002 | msppt.olb Access 2002 | msacc.olb Outlook 2002 | msoutl.olb

  1. Il codice di automazione ha funzionato con Excel 95, ma non riesce con Excel 97. Cosa sta succedendo? Il modello a oggetti per Excel ha modificato sensibilmente la versione 95 in 97. Excel 95 ha implementato tutti i metodi e le proprietà in un'unica implementazione di IDispatch. Ciò significava che spesso puoi chiamare i metodi per l'oggetto X, dall'oggetto Y. Non si trattava di una buona progettazione, quindi in Office 97 ogni oggetto ha una propria implementazione separata di IDispatch. Questo significa che se chiedi un metodo o una proprietà dall'oggetto X da un oggetto separato Y, viene visualizzato il messaggio di errore 0x80020003,-2147352573, "member not found". Per evitare questo errore, è necessario assicurarsi che l'interfaccia IDispatch sottostante da cui si effettuano le chiamate sia quella semanticamente corretta. Per altre informazioni, vedere gli articoli della Microsoft Knowledge base seguenti:

    172108 HOWTO: risoluzione dei problemi "membro non trovato", errore 0x80020003

  2. L'applicazione che si sta automatizzando rimane in memoria dopo il completamento del programma. Cosa sta succedendo? Molto probabilmente, perché hai dimenticato di rilasciare un'interfaccia acquisita e devi rintracciarla. Ecco alcuni suggerimenti generali e aspetti da cercare:

    • Se usi #import, è molto probabile che tu possa essere eseguito in uno dei bug di conteggio riferimenti associato. Spesso i bug possono essere risolti, ma in genere è preferibile usare uno degli altri metodi di automazione. #import non funziona molto bene con le applicazioni di Office, perché le relative librerie di tipi e l'uso sono abbastanza complesse. Inoltre, questi problemi di conteggio dei riferimenti sono difficili da rintracciare perché molte chiamate COM a livello di interfaccia sono dietro le quinte quando si usa #import.

    • Verificare se si chiamano tutti i metodi, ad esempio Open o New, che restituiscono IDispatch * (LPDISPATCH) e ignorando il valore restituito. In caso affermativo, si sta abbandonando l'interfaccia restituita e sarà necessario modificare il codice in modo da rilasciarlo quando non è più necessario.

    • Aggiungere un commento graduale alle sezioni del codice fino a quando il problema non scompare, quindi aggiungerlo di nuovo con giudizio per individuare il punto in cui si trova il problema.

    • Tieni presente che alcune applicazioni rimarranno in funzione se l'utente ha "toccato" l'applicazione. Se questo si verifica durante l'automazione, l'applicazione probabilmente resterà in esecuzione in seguito. Le applicazioni di Office hanno una proprietà "UserControl" nell'oggetto Application che puoi leggere/scrivere per modificare questo comportamento.

    • Inoltre, alcune applicazioni decideranno di rimanere in esecuzione se si è verificata un'interfaccia utente sufficiente. Se vuoi che l'applicazione esca, chiama il metodo Quit () sull'oggetto Application. Word verrà arrestato indipendentemente dal conteggio dei riferimenti quando viene richiamata l'uscita. Questo comportamento non è previsto per COM. Excel, tuttavia, si nasconderà correttamente, ma resterà in funzione finché non vengono rilasciate tutte le interfacce in sospeso. In generale, è consigliabile rilasciare tutti i riferimenti in sospeso e chiamare solo Quit () se si vuole che l'applicazione smetta.

  3. So cosa si vuole fare come utente di un'applicazione di Office, ma come si esegue questa operazione a livello di programmazione tramite automazione? Le informazioni che ti interessano sono gli oggetti, i metodi e le proprietà che devi usare. Il modo migliore per scoprire come esplorare i modelli di oggetti di Word, Excel e PowerPoint, in base a ciò che si vuole eseguire come utente, consiste nell'usare il registratore macro. Basta scegliere macro \' Registra nuova macro ' dal menu Strumenti, eseguire l'attività che si è interessati, quindi scegliere macro \' Interrompi registrazione '. Dopo aver completato la registrazione, scegliere Macro\Macros dal menu Strumenti, selezionare la macro registrata, quindi fare clic su modifica. In questo modo verrà eseguita la creazione del codice VBA generato che eseguirà l'attività registrata. Tieni presente che la macro registrata non sarà il codice migliore possibile nella maggior parte dei casi, ma fa molto bene per un esempio rapido.

  4. È possibile automatizzare un'applicazione di Office incorporata? Assolutamente. Il trucco sta ottenendo il puntatore IDispatch: questo è dato nella nota tecnica di Visual C++ 39 (TN039). Per un esempio di procedura dettagliata, vedere l'articolo della Microsoft Knowledge Base seguente:

    184663 HOWTO: incorporare e automatizzare un foglio di lavoro di Microsoft Excel con MFC

  5. Come si accede alle proprietà del documento in un documento di Office? Le proprietà del documento sono accessibili tramite automazione o direttamente tramite IPropertyStorage. Gli articoli della Microsoft Knowledge base seguenti illustrano ogni metodo:

    179494 HOWTO: usare l'automazione per recuperare le proprietà del documento predefinite

    186898 HOWTO: leggere le proprietà del documento composto direttamente con VC + +

Serve aiuto?

Amplia le tue competenze
Esplora i corsi di formazione
Ottieni in anticipo le nuove caratteristiche
Partecipa a Microsoft Insider

Queste informazioni sono risultate utili?

Grazie per il feedback!

Grazie per il tuo feedback! Potrebbe essere utile metterti in contatto con uno dei nostri operatori del supporto di Office.

×