Rezumat
Acest articol răspunde la întrebări frecvente privind automatizarea Microsoft Office de la Visual C++.
Mai multe informații
Cuprins
-
Ce este automatizare?
-
Sunt nou la automatizare, unde pot găsi bune resurse pentru a afla mai multe?
-
Există metode diferite pot folosi automatizare?
-
Ce este COM?
-
Cum pot atașa la instanța de execuție a unei aplicații Office?
-
Cum trece parametrii opționali?
-
Cum captura evenimente expusă de aplicațiile Office?
-
Codului de automatizare este prea lentă. Cum puteți accelera lucrurile?
-
Ce înseamnă aceste valori mare eroare, cum ar fi-2147352573 sau 0x80030002?
-
Ce este o bibliotecă de tip?
-
Codului de automatizare a lucrat cu Microsoft Excel 95, dar eșuează cu Microsoft Excel 97. de ce?
-
De ce aplicație I sunt automatizarea rămân în memorie, după ce se termină programul?
-
Știu ce vreau să fac ca utilizator aplicație Microsoft Office, dar cum se face acest lucru folosind programatic automatizare?
-
I poate automatiza o aplicație Microsoft Office încorporată?
-
Cum se accesează meu ile documentelor într-un document Microsoft Office?
Întrebări și răspunsuri
-
Ce este automatizare? Automatizare (cunoscut anterior ca OLE Automation) este o tehnologie care vă permite să beneficiați de un program existent funcționalitate și se include în aplicaţiile dumneavoastră. De exemplu, puteţi utiliza Microsoft Word verificare ortografică și gramaticală capacități în aplicația fără Microsoft Word vizibile pentru utilizatori. Puteți chiar să folosiți toate Microsoft Excel diagrame, imprimare și datele de instrumente de analiză. Această tehnologie poate simplifica foarte mult și viteza de dezvoltare.
-
Sunt nou la automatizare, unde pot găsi bune resurse pentru a afla mai multe? Capitolul 24 de David Kruglinski "în interiorul Visual C++" (ISBN:1-57231-565 - 2) furnizează o prezentare generală, precum și unele exemple de mare. De asemenea, baza de cunoștințe Microsoft este o bună sursă de informații. Acest articol în sine este un start bun și puteți găsi mai specifică referințe în următorul articol din baza de cunoștințe Microsoft:
găsirea resurse pentru a studia OLE AutomationDacă preferați învățare, de exemplu, consultaţi următorul articol din baza de cunoștințe Microsoft:
HOWTO utilizarea MFC să automatizați Excel și creați/Format un nou registru de lucru
-
Există metode diferite pot folosi automatizare? Există trei moduri de bază, aveți posibilitatea să utilizați automatizare: MFC, #import și C/C++:
-
Cu MFC, utilizați Visual C++ ClassWizard pentru a genera "ambalaj clase" de la biblioteci de tip Microsoft Office. Aceste clase, precum și alte clase MFC, cum ar fi COleVariant, COleSafeArray, COleException, simplifice activitățile de automatizare. Această metodă este recomandată de obicei prin alte persoane și cele mai multe dintre exemplele baza de cunoștințe Microsoft utilizează MFC.
-
#import, o nouă directivă care a devenit disponibil cu Visual C++ 5.0, creează VC ++ "indicatori smart" dintr-o bibliotecă de tip specificat. Este foarte puternice, dar adesea nu este recomandată din cauza referință - numărare problemele care apar de obicei când se utilizează cu aplicațiile Microsoft Office.
-
Automatizare C/C++ este mult mai dificil, dar uneori este necesar pentru a evita supraîncărcarea cu MFC, sau probleme cu #import. Practic, lucrați cu aceste API-uri ca CoCreateInstance() și COM interfețe, cum ar fi nImplementarea și IUnknown.
Este important să rețineți că nu există unele mici diferențe între automatizare din C++ în comparație cu C simplu, deoarece COM a fost proiectat în jurul C++ class. Pentru mai multe informații, consultați următorul articol din baza de cunoștințe Microsoft pentru un exemplu de C:
Ghid : utilizarea OLE Automation dintr-o aplicație C
-
-
Ce este COM? Automatizare se bazează pe Component Object Model (COM). COM este o arhitectură standard software bazate pe interfețe, şi conceput pentru a avea cod separat în obiectele independente. Cred ca o extensie paradigmei obiect orientate spre programare (OOP), dar se aplică pentru a separa aplicații. Fiecare obiect expune un set de interfețe și toate comunicațiile între către un obiect, cum ar fi inițializarea, notificări și transferul de date, se întâmplă prin aceste interfețe. COM este, de asemenea, un set de servicii oferite de biblioteci cu legare dinamică (DLL) instalate cu sistemul de operare. Automatizare utilizează multe dintre aceste servicii. Un exemplu este serviciul "Marshalling", care pachete apeluri aplicația client pentru funcțiile de membru de interfețe de aplicație de server și transferă cele, cu argumentele lor, la cererea de server. Face să pară că server interfețe sunt expuse în spațiul de memorie clientului, care nu este cazul, atunci când clientul este un .exe execută în spațiul propriu de proces. Compunerea, de asemenea, devine valorile reveniți la server metode înapoi dincolo de limitele de proces și în siguranță în mâinile apel clientului. Există multe alte servicii esențiale pentru automatizare care sunt furnizate de bibliotecile COM. Surse de informații despre cele include "În interiorul Ole – ediția" Kraig Brockschmidt, ISBN 1-55615-843-2, "În interiorul COM" de Dale Rogerson - ISBN 1-57231-349-8 și "Automatizare Programmer's Reference," ISBN 1-57231-584-9.
-
Cum pot atașa la instanța de execuție a unei aplicații Office? Utilizați GetActiveObject() API. Automatizare servere se înregistra în ROT (execută obiect Table), prin intermediul RegisterActiveObject() API. Automatizare clienții pot ajunge la instanța execută 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 executarea aplicației Office pe care doriți să atașați, doar va fi capabil să atașați la prima instanță pe care a fost lansat la utilizarea GetActiveObject() API. Teoretic, se poate repeta PUTREGAIULUI pentru fiecare instanță individuale, dar aplicațiile Office nu se înregistrează dacă o altă instanță este deja în PUTREGAIULUI deoarece poreclei pentru în sine este întotdeauna același (acesta nu a putut fi deosebite oricum). Aceasta înseamnă că nu atașați la orice instanță, cu excepția primul. Cu toate acestea, deoarece aplicațiile Office și înregistra documentele în PUTREGAIULUI, cu succes la puteți atașa alte instanțe de iterațiile PUTREGAIULUI căutarea unui anumit document, ataşarea la el, apoi obținerea obiectul de aplicație la ea. Există un cod în următorul articol din baza de cunoștințe Microsoft pentru iterarea PUTREGAIULUI și căutați numele unui document:
Ghid : obțineți nImplementarea de Word Document sau Excel dintr-o OCXNu trebuie să faceți acest lucru pentru PowerPoint, deoarece este o aplicație cu o singură instanță; Puteți avea numai o singură instanță de se execută.
-
Cum trece parametrii opționali? Unele metode au parametri "optional". În Visual Basic, se poate ocazional omite le când apela metoda. Însă, când apelați cu Visual C++ trebuie să treacă o variantă speciale ale căror .vt este VT_ERROR și .scode este DISP_E_PARAMNOTFOUND. adică:
// VARIANT used in place of optional-parameters. VARIANT varOpt; varOpt.vt = VT_ERROR; varOpt.scode = DISP_E_PARAMNOTFOUND;
Acest lucru este adevărat ceea ce face Visual Basic din fundal.
-
Cum captura evenimente expusă de aplicațiile Office? Practic implementează interfața de evenimente care doriți să prindeți ("recipient"), iar setup o conexiune de consultanță cu aplicația ("sursă"). Următorul articol oferă exemple pas cu pas pentru Microsoft Word:
Ghid : prinde evenimente de aplicație Microsoft Word97 folosind VC ++În general, pentru a seta conexiunea consultanță, obțineți server IConnectionPointContainer și apelați FindConnectionPoint() cu Carmen de interfața de evenimente. Acest lucru vă oferă o interfață IConnectionPoint și tot ceea ce este lăsat este de a apela Advise() cu o instanță a interfeței de evenimente. Serverul va apoi suna prin această interfață atunci când apar aceste evenimente.
-
Codului de automatizare este prea lentă. Cum puteți accelera lucrurile? O cauză obișnuită pentru viteza probleme legate de automatizarea este cu repetate de citire și scriere de date. Acest lucru este tipic pentru clienții automatizare Excel. Cu toate acestea, majoritatea oamenilor nu se știe că aceste date pot fi, de obicei, scris sau citit toate odată folosind SAFEARRAY. Consultați următoarele articole din baza de cunoștințe Microsoft pentru mai multe informații și informativ exemple:
Ghid : utilizați MFC pentru a automatiza Excel și a completa o zonă cu o matrice
Ghid : utilizați MFC pentru a automatiza Excel și obțineți o serie de la o gamă largă
Ghid : utilizați MFC pentru a automatiza Excel și creați/Format un nou registru de lucruDe asemenea, este important să arate că utilizarea în clipboard uneori puteți îmbunătăți performanțele. De exemplu, copiați datele în Clipboard apoi utilizați automatizare a indica serverului pentru a lipi. Sau invers; Spuneți-server copie la Clipboard și lipiți în aplicația.
-
Ce face aceste valori mare eroare, cum ar fi-2147352573 sau 0x80030002 înseamnă? Aceste valori sunt cunoscute ca HRESULTs și definite în winerror.h. Numerele sunt atât de mare, deoarece primul bit reprezintă sau nu este o eroare de rezultate. Utilizați utilitarul ErrLook.Exe care este distribuit cu Visual C++ traduce aceste numere în descrieri semnificativ. Dacă doriți să obțineți prin programare o descriere pentru erori, utilizați FormatMessage() API. Consultați următoarele articole din baza de cunoștințe Microsoft pentru mai multe informații și exemple de utilizare a FormatMessage():
INFO: Traducerea automatizare erori pentru VB/VBA
EXEMPLU de : Decode32 și Decode16 OLE eroare codul decodor instrumenteNotă: Dacă utilizați Visual C++ 6.0 și aveți o variabilă care conţine această valoare în fereastra Depanare ceas, adăugați ", hr" (fără ghilimele) pentru a avea Visual C++ traduce pentru dumneavoastră!
-
Ce este o bibliotecă de tip? O bibliotecă de tip este similar cu un fișier de antet C/C++. Conține interfețele, metode şi proprietăţi care este un server de publicare. Puteți vizualiza bibliotecii cu Vizualizator de obiect OLE/COM (Oleview.exe) care este distribuit cu Visual C++. Iată o listă de tip bibliotecă numelor de fișiere 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
-
Codului de automatizare a lucrat cu Excel 95, dar eșuează cu Excel 97. ce se întâmplă? Modelul de obiecte pentru Excel făcut o modificare semnificativă la versiunea 95-97. Excel 95 implementat toate metodele şi proprietăţile sale într-un singur implementarea nImplementarea. Acest lucru înseamnă că des poate apela metode pentru X, obiect de obiect Y. Acest lucru nu a fost un design bun, astfel încât în Office 97, fiecare obiect are propria separate nImplementarea implementare. Acest lucru înseamnă că dacă cereți o metoda sau proprietatea de obiect X dintr-un obiect separat Y, primiți eroarea 0x80020003,-2147352573, "membru not found." Pentru a evita această eroare, trebuie să vă asigurați că interfața nImplementarea subordonată fac apelurile din este semantic corectă. Consultați următoarele articole din baza de cunoștințe Microsoft pentru mai multe informații:
Ghid : depanare "Membru negăsit", 0x80020003 eroare
-
Aplicație I sunt automatizarea rămâne în memorie după ce se termină programul. ce se întâmplă? Cel mai probabil, aceasta se întâmplă deoarece ați uitat la o interfață achiziționată de lansare și trebuie să urmăriți-l în jos. Iată câteva sugestii generale și caută lucruri:
-
Dacă folosiți #import, este foarte probabil este imposibil să executați într-una de referință calculul erori asociate cu aceasta. De multe ori poate fi lucrat erorile în apropiere, dar, de obicei, este de preferat să utilizați una dintre celelalte metode de automatizare. #import nu funcţionează foarte bine cu aplicațiile Office, deoarece sa tip biblioteci și utilizarea sunt destul de complexe. De asemenea, aceste probleme de referință numărare sunt greu pentru a urmări în jos, deoarece o mulțime de la nivel de interfață COM apelurile sunt din fundal atunci când se utilizează #import.
-
Verificaţi dacă apelate orice metode, cum ar fi deschiderea sau nou, care returnează un nImplementarea * (LPDISPATCH), ignorând valoarea returnată. Dacă sunteți, apoi sunt abandona această interfață returnate și va trebui să modificați codul, astfel încât se lansează atunci când nu mai sunt necesare.
-
Comentați treptat secțiuni de cod până când problema dispare, apoi adăugați-l judicios înapoi pentru a urmări în jos care pornește problema.
-
Rețineți că unele aplicații vor rămâne execută dacă utilizatorul a "atins" aplicația. Dacă acest lucru se produce când automatizați, apoi aplicația va probabil rămâne execută ulterior. Aplicațiile Office au o proprietate "UserControl" obiect aplicație care vă puteți citire/scriere pentru a modifica acest comportament.
-
De asemenea, unele aplicații va decide să rămână execută dacă suficient interfața utilizator "acţiune" s-a produs. Dacă vă sunt intenționează aplicația pentru a închide, apoi apela metoda Quit() obiectului de aplicație. Word va închidere indiferent de numărul de referință atunci când este apelat Quit. Acest lucru nu este comportamentul așteptat COM. Excel, însă, va corect doar ascunde în sine, dar păstrați execută până când toate interfețele deosebite sunt lansate. În general, ar trebui să lansare toate referințele deosebite, și apelați numai Quit() dacă intenționați aplicația se închide.
-
-
Știu ce vreau să fac ca utilizator aplicație Office, dar cum se face acest lucru prin programare prin automatizare? Sunteți interesat este ceea ce obiecte, metode şi proprietăţi trebuie să utilizați. Cea mai bună metodă pentru a afla cum să navigaţi modele de obiecte de Word, Excel și Powerpoint pe care doriți să faceți ca utilizator, se utilizează înregistratorul de macrocomenzi. Doar alegeți Macro\ 'Înregistrare macrocomandă nouă' din meniul Instrumente, executa activitatea vă interesează, apoi alegeți Macro\ "Opri înregistrarea." După ce aţi terminat de înregistrare, alegeți Macro\Macros din meniul Instrumente, selectați macrocomanda notate, apoi faceţi clic pe Editare. Acest lucru vă va duce la codul VBA generat care va realiza activitatea este înregistrată. Reţineţi macrocomanda înregistrată nu va fi cel mai bine posibil codul în majoritatea cazurilor, dar nu este foarte bine pentru un exemplu rapid.
-
Am poate automatiza o aplicație Office embedded? Absolut. Truc este prea indicatorul nImplementarea: aceasta este prezentată în Visual C++ tehnice Notă 39 (TN039). Consultați următorul articol din baza de cunoștințe Microsoft pentru un exemplu pas cu pas:
Ghid : încorporat și pentru a automatiza o foaie de lucru Microsoft Excel cu MFC
-
Cum se accesează meu ile documentelor într-un document Office? Proprietățile de document sunt accesibile prin automatizare sau direct prin IPropertyStorage. Următoarele articole din baza de cunoștințe Microsoft demonstrează fiecare metodă:
Ghid : utilizați automatizare să preia proprietăţile Document predefinit
Ghid : citiți proprietăți Document compus direct cu VC ++