Salt la conținutul principal
Asistență
Conectare

Automatizarea Office utilizând Visual C++

Rezumat

Acest articol răspunde la întrebări comune despre automatizarea la Microsoft Office de la Visual C++.

Mai multe informații

Cuprins

  1. Ce este automatizare?

  2. Sunt nou în automatizare, unde pot găsi resurse bune pentru a afla mai multe?

  3. Există modalități diferite prin care pot utiliza automatizarea?

  4. Ce este COM?

  5. Cum ataș la instanța curentă a unei aplicații Office?

  6. Cum trec parametri opționali?

  7. Cum prind evenimentele expuse de aplicațiile Office?

  8. Codul meu de automatizare este prea lent. Cum pot grăbi lucrurile?

  9. Ce înseamnă aceste valori de eroare uriașe, cum ar fi-2147352573 sau 0x80030002?

  10. Ce este o bibliotecă de tipuri?

  11. Codul meu de automatizare a funcționat cu Microsoft Excel 95, dar nu reușește cu Microsoft Excel 97. de ce?

  12. De ce aplicația pe care o utilizez automat rămâne în memorie după ce programul meu s-a terminat?

  13. Știu ce doresc să fac ca utilizator al aplicației Microsoft Office, dar cum fac acest lucru prin programare prin automatizare?

  14. Pot automatiza o aplicație Microsoft Office încorporată?

  15. Cum îmi accesez proprietățile documentului într-un document Microsoft Office?

Întrebări și răspunsuri

  1. Ce este automatizare? Automatizarea (anterior OLE Automation) este o tehnologie care vă permite să beneficiați de funcționalitatea unui program existent și să o încorporați în aplicațiile proprii. De exemplu, puteți utiliza capacitățile de verificare ortografică și gramaticală Microsoft Word în aplicația dvs., fără ca Microsoft Word să fie vizibil pentru utilizatorii dvs. Puteți chiar să utilizați toate instrumentele de diagramă, imprimare și analiză de date din Microsoft Excel. Această tehnologie poate simplifica foarte mult și accelera dezvoltarea.

  2. Sunt nou în automatizare, unde pot găsi resurse bune pentru a afla mai multe? Capitolul 24 din David Kruglinski ' s "Inside Visual C++" (ISBN: 1-57231-565-2) furnizează o prezentare generală generală, precum și câteva exemple extraordinare. De asemenea, baza de cunoștințe Microsoft este o sursă de informații bună. Acest articol este un început bun și puteți găsi referințe mai specifice în următorul articol din baza de cunoștințe Microsoft:

    152023 Găsirea resurselor pentru a studia automatizarea OLE Dacă preferați să învățați prin exemplu, consultați următorul articol din baza de cunoștințe Microsoft:

    179706 HOWTO utilizați MFC pentru a automatiza Excel & creați/formatați un registru de lucru nou

  3. Există modalități diferite prin care pot utiliza automatizarea? Există trei modalități de bază pe care le puteți utiliza automatizare: MFC, #import și C/C++:

    • Cu MFC, utilizați Visual C++ ClassWizard pentru a genera "clase de Wrapper" din bibliotecile de tipuri Microsoft Office. Aceste clase, precum și alte clase MFC, cum ar fi COleVariant, COleSafeArray, COleException, simplifică activitățile de automatizare. Această metodă este, de obicei, recomandată în alte persoane, iar majoritatea exemplelor din baza de cunoștințe Microsoft utilizează MFC.

    • #import, o nouă directivă care a devenit disponibilă cu Visual C++ 5,0, creează VC + + "Smart pointers" dintr-o bibliotecă de tipuri specificată. Este foarte puternic, dar adesea nu este recomandat din cauza problemelor de numărare a referințelor care apar de obicei atunci când sunt utilizate cu aplicațiile Microsoft Office.

    • Automatizarea C/C++ este mult mai dificilă, dar uneori necesară pentru a evita supraîncărcarea cu MFC sau problemele cu #import. Practic, lucrați cu API-uri ca CoCreateInstance () și interfețele COM, cum ar fi IDispatch și IUnknown.

    Este important să rețineți că există câteva diferențe ușoare între automatizarea de la C++ în comparație cu simpla C, deoarece COM a fost proiectat în jurul clasei C++. Pentru mai multe informații, consultați următorul articol din baza de cunoștințe Microsoft pentru un exemplu C:

    181473 HOWTO: utilizați automatizarea OLE dintr-o aplicație C

  4. Ce este COM? Automatizarea se bazează pe modelul de obiecte componente (COM). COM este o arhitectură software standard bazată pe interfețe și proiectată pentru a avea un cod separat în obiecte cu conținut propriu. Gândiți-vă la aceasta ca la o extensie a paradigmei de programare orientată spre obiect (OOP), dar aplicabilă aplicațiilor separate. Fiecare obiect expune un set de interfețe și toate comunicațiile la un obiect, cum ar fi inițializare, notificări și transfer de date, se întâmplă prin intermediul acestor interfețe. COM este, de asemenea, un set de servicii furnizate de bibliotecile cu legare dinamică (DLL) instalate cu sistemul de operare. Automatizarea utilizează multe dintre aceste servicii. Un exemplu este serviciul "de înmulțire", care face ca pachetele aplicației client să fie efectuate la funcțiile membre ale interfețelor aplicației Server și să le treacă pe acestea, cu argumentele lor, la aplicația server. Se pare că interfețele serverului sunt expuse în spațiul de memorie al clientului, ceea ce nu este cazul atunci când clientul este un. exe care rulează în propriul său spațiu de proces. De asemenea, mareșalul primește valorile de returnare din metodele serverului din toate limitele procesului și sunt în siguranță în mâinile apelului clientului. Există multe alte servicii esențiale pentru automatizarea furnizată de diversele biblioteci COM. Sursele de informații despre acestea includ "Inside OLE-Second Edition" de sanda Brockschmidt, ISBN 1-55615-843-2, "Inside COM" de Dale Rogerson-ISBN 1-57231-349-8 și "referința programatorului de automatizare", ISBN 1-57231-584-9.

  5. Cum ataș la instanța curentă a unei aplicații Office? Utilizați API-ul GetActiveObject (). Serverele de automatizare se înregistrează în tabelul ROT (rulare obiect), prin intermediul API-ului RegisterActiveObject (). Clienții de automatizare pot accesa instanța curentă cu cod, cum ar fi:

          // 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();

    Notă: dacă există mai multe instanțe care se execută în aplicația Office pe care doriți să o atașați, veți putea să atașați doar la prima instanță care a fost lansată utilizând API-ul GetActiveObject (). Teoretic, puteți să repetați PUTREGAIul pentru fiecare instanță individuală, dar aplicațiile Office nu se înregistrează singure dacă o altă instanță este deja în putregai, deoarece porecla pentru sine este întotdeauna aceeași (nu a putut fi distinsă oricum). Acest lucru înseamnă că nu puteți atașa la nicio instanță, cu excepția primei. Cu toate acestea, deoarece aplicațiile Office își înregistrează, de asemenea, documentele în putregai, puteți să atașați cu succes la alte instanțe, iterând PUTREGAIul căutând un anumit document, atașându-l, apoi obținând obiectul aplicației din acesta. Există un cod în următorul articol din baza de cunoștințe Microsoft pentru iterarea PUTREZIrii și căutarea unui nume de document:

    190985 HOWTO: obțineți IDispatch unui document Excel sau Word dintr-un OCX Nu va trebui să faceți acest lucru pentru PowerPoint, deoarece este o aplicație cu o singură instanță; Puteți avea o singură instanță în execuție.

  6. Cum trec parametri opționali? Unele metode au parametri "opționali". În Visual Basic, puteți să le omiteți ocazional atunci când apelați metoda. Cu toate acestea, atunci când faceți apeluri cu Visual C++, trebuie să treceți la o VARIANTă specială a cărei câmp. VT este VT_ERROR, iar câmpul. scode este DISP_E_PARAMNOTFOUND. adică:

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

    Aceasta este într-adevăr ceea ce face Visual Basic în culise.

  7. Cum prind evenimentele expuse de aplicațiile Office? Practic implementați interfața evenimentului pe care doriți să o prindeți ("chiuvetă") și configurați o conexiune consultativă cu aplicația ("sursă"). Următorul articol vă oferă exemple pas cu pas pentru Microsoft Word:

    183599 HOWTO: capturați evenimente de aplicație Microsoft Word97 utilizând VC + + În general, pentru a configura conexiunea de consultanță, obțineți IConnectionPointContainer de server și apelați FindConnectionPoint () cu IID interfeței evenimentului. Acest lucru vă oferă o interfață IConnectionPoint și tot ce a rămas este să apelați consultanță () cu o instanță a interfeței evenimentului. Serverul va apela apoi înapoi prin această interfață atunci când apar aceste evenimente.

  8. Codul meu de automatizare este prea lent. Cum pot grăbi lucrurile? O cauză comună a problemelor de viteză cu automatizarea este citirea și scrierea repetitivă a datelor. Acest lucru este tipic pentru clienții Excel Automation. Cu toate acestea, majoritatea persoanelor nu sunt conștienți de faptul că aceste date pot fi scrise sau citite simultan, utilizând SAFEARRAY. Consultați următoarele articole din baza de cunoștințe Microsoft pentru mai multe informații și exemple informative:

    186120 HOWTO: utilizați MFC pentru a automatiza Excel și a completa o zonă cu o matrice

    186122 HOWTO: utilizați MFC pentru a automatiza Excel & a obține o matrice dintr-o zonă

    179706 HOWTO: utilizați MFC pentru a automatiza Excel și a crea/formata un registru de lucru nou De asemenea, este important să se sublinieze că, uneori, utilizarea Clipboardului poate îmbunătăți performanța. De exemplu, puteți să copiați datele în Clipboard, apoi să utilizați automatizare pentru a spune serverului să se lipească. Sau invers; Spuneți serverului să copieze-în-Clipboard și lipiți-l în aplicație.

  9. Ce înseamnă aceste valori de eroare uriașe, cum ar fi-2147352573 sau 0x80030002? Aceste valori sunt cunoscute ca HRESULTs și sunt definite în Winerror. h. Numerele sunt atât de mari, deoarece primul bit reprezintă dacă este sau nu un rezultat de eroare. Puteți utiliza utilitarul ErrLook. exe livrat cu Visual C++ pentru a traduce aceste numere în descrieri semnificative. Dacă doriți să obțineți programatic o descriere pentru erori, puteți utiliza API-ul FormatMessage (). Consultați următoarele articole din baza de cunoștințe Microsoft pentru mai multe informații și exemple despre utilizarea FormatMessage ():

    186063 INFORMAȚII: Traducerea erorilor de automatizare pentru VB/VBA

    122957 EXEMPLU: instrumente de decodare cod de eroare OLE Decode32 și Decode16Notă: Dacă utilizați visual C++ 6,0 și aveți o variabilă care conține această valoare în fereastra de vizionare depanare, adăugați ", HR" (fără ghilimele) pentru a-l face să aibă Visual C++ să-l traducă pentru dvs.!

  10. Ce este o bibliotecă de tipuri? O bibliotecă tip este similară cu un fișier antet C/C++. Conține interfețele, metodele și proprietățile pe care le publică un server. Puteți vizualiza biblioteca Type cu OLE/COM Object Viewer (Oleview. exe) care este livrat cu Visual C++. Iată o listă a numelor de fișiere de bibliotecă tip pentru Microsoft Office 95, 97 și 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. Codul meu de automatizare a funcționat cu Excel 95, dar nu reușește cu Excel 97. ce se întâmplă? Modelul de obiecte pentru Excel a efectuat o modificare semnificativă de la versiunea 95 la 97. Excel 95 a implementat toate metodele și proprietățile sale într-o singură implementare a IDispatch. Acest lucru înseamnă că deseori puteți apela metode destinate pentru obiectul X, de la obiectul Y. Acest lucru nu a fost un design bun, așadar, în Office 97, fiecare obiect are propria implementare IDispatch separată. Acest lucru înseamnă că, dacă solicitați o metodă sau o proprietate din obiectul X de la un obiect separat Y, primiți eroarea 0x80020003,-2147352573, "membrul nu a fost găsit". Pentru a evita această eroare, trebuie să vă asigurați că interfața IDispatch subiacentă din care efectuați apeluri este cea corectă semantic. Consultați următoarele articole din baza de cunoștințe Microsoft pentru mai multe informații:

    172108 HOWTO: Depanarea "membrul not found", eroare 0x80020003

  2. Aplicația pe care o introduc automat rămâne în memorie după ce programul meu s-a terminat. ce se întâmplă? Cel mai probabil, acest lucru se întâmplă pentru că ați uitat să eliberați o interfață achiziționată și va trebui să o urmăriți. Iată câteva sugestii generale și lucruri de căutat:

    • Dacă utilizați #import, este foarte probabil să vă confruntați cu una dintre erorile de numărare a referințelor asociate. Deseori, se pot lucra în jurul problemelor, dar de obicei este preferat să utilizați una dintre celelalte metode de automatizare. #import nu funcționează foarte bine cu aplicațiile Office, deoarece bibliotecile de tip și utilizarea lor sunt destul de complexe. De asemenea, o astfel de referință de numărare a problemelor sunt greu de urmărit, deoarece multe dintre apelurile COM la nivel de interfață sunt în culise atunci când se utilizează #import.

    • Verificați pentru a vedea dacă denumiți metode, cum ar fi Open sau New, care returnează un IDispatch * (LPDISPATCH) și ignorând valoarea returnată. Dacă sunteți, atunci abandonați această interfață returnată și va trebui să modificați codul, astfel încât să-l eliberați atunci când nu mai este necesar.

    • Extrageți treptat secțiuni ale codului până când problema dispare, apoi adăugați-o înapoi în mod rațional pentru a urmări unde pornește problema.

    • Rețineți că unele aplicații vor rămâne în execuție dacă utilizatorul a "atins" aplicația. Dacă se întâmplă acest lucru în timp ce automatizați, atunci aplicația va rămâne probabil la rulare după aceea. Aplicațiile Office au o proprietate "UserControl" pe obiectul aplicației pe care o puteți citi/scrie pentru a modifica acest comportament.

    • De asemenea, unele aplicații vor decide să rămână în execuție dacă s-a produs suficient interfața de utilizator. Dacă intenționați să ieșiți din aplicație, apelați-i metoda Quit () de pe obiectul aplicației. Word se va închide indiferent de numărul său de referință când se numește ieșire. Acesta nu este un comportament COM așteptat. Cu toate acestea, Excel se va ascunde corect, dar rămâne în execuție până când sunt lansate toate interfețele restante. În general, ar trebui să eliberați toate referințele restante și să apelați doar închideți () dacă intenționați ca aplicația să demisioneze.

  3. Știu ce doresc să fac ca utilizator de aplicație Office, dar cum fac acest lucru prin programare prin automatizare? Ceea ce vă interesează este obiectele, metodele și proprietățile pe care trebuie să le utilizați. Cea mai bună modalitate de a afla cum să navigați în modelele de obiecte din Word, Excel și PowerPoint, pe baza a ceea ce doriți să faceți ca utilizator, este să utilizați Înregistrator de macrocomenzi. Pur și simplu alegeți macrocomandă \ ' înregistrare macrocomandă nouă ' din meniul Instrumente, executați activitatea pe care o interesați, apoi alegeți macrocomandă \ ' oprire înregistrare. ' După ce ați terminat înregistrarea, alegeți Macro\Macros din meniul Instrumente, selectați macrocomanda înregistrată, apoi faceți clic pe Editare. Acest lucru vă va duce la codul VBA generat care va realiza activitatea înregistrată. Rețineți că macrocomanda înregistrată nu va fi cel mai bun cod posibil în majoritatea cazurilor, dar funcționează foarte bine pentru un exemplu rapid.

  4. Pot automatiza o aplicație Office încorporată? Absolut. Trucul este să obțineți indicatorul IDispatch: Acesta este furnizat în Visual C++ Technical note 39 (TN039). Consultați următorul articol din baza de cunoștințe Microsoft pentru un exemplu pas cu pas:

    184663 HOWTO: încorporarea și automatizarea unei foi de lucru Microsoft Excel cu MFC

  5. Cum îmi accesez proprietățile documentului într-un document Office? Proprietățile documentului sunt accesibile prin automatizare sau direct prin IPropertyStorage. Următoarele articole din baza de cunoștințe Microsoft demonstrează fiecare metodă:

    179494 HOWTO: utilizați automatizarea pentru a regăsi proprietățile documentului predefinite

    186898 HOWTO: citiți proprietățile documentului compus direct cu VC + +

Aveți nevoie de ajutor suplimentar?

Extindeți-vă competențele
Explorați instruirea
Fiți primul care obține noile caracteristici
Alăturați-vă la Microsoft Insider

V-a fost de ajutor această informație?

Vă mulțumim pentru feedback!

Vă mulțumim pentru feedback! Se pare că ar fi util să luați legătura cu unul dintre agenții noștri de asistență Office.

×