Office-automatisering ved hjelp av Visual C++

Sammendrag

Denne artikkelen gir svar på vanlige spørsmål om automatisering Microsoft Office fra Visual C++.

Mer informasjon

Innholdsfortegnelse

  1. Hva er automatisering?

  2. Jeg er ny på automatisering, hvor kan jeg finne gode ressurser for å lære mer?

  3. Finnes det forskjellige måter jeg kan bruke automatisering?

  4. Hva er COM?

  5. Hvordan jeg knytte til forekomst av et Office-program?

  6. Hvordan jeg sende valgfrie parametere?

  7. Hvordan jeg fange opp hendelser som vises av Office-programmer?

  8. Kode for automatisering er lav. Hvordan kan jeg gjøre ting raskere?

  9. Hva betyr disse enorme feilverdier, for eksempel-2147352573 eller 0x80030002?

  10. Hva er et typebibliotek?

  11. Min automatiseringskoden arbeidet med Microsoft Excel 95, men mislykkes med Microsoft Excel 97. hvorfor?

  12. Hvorfor programmet jeg 'M automatisere forbli i minnet etter at programmet er fullført?

  13. Jeg vet hva jeg skal gjøre som bruker en Microsoft Office-program, men hvordan gjør jeg dette programmatisk ved hjelp av automatisering?

  14. Kan jeg automatisere et innebygd Microsoft Office-program?

  15. Hvordan går jeg til Min dokumentegenskaper i et Microsoft Office-dokument?

Spørsmål og svar

  1. Hva er automatisering? Automatisering (tidligere OLE-automatisering) er en teknologi som gjør at du kan dra nytte av funksjonaliteten i et eksisterende program og bygge den inn i dine egne programmer. Du kan for eksempel bruke Microsoft Word stave- og grammatikkontroll funksjonene til programmet uten Microsoft Word vises til brukerne. Du kan også bruke alle Microsoft Excel diagrammer, utskrift og data Analyseverktøy. Denne teknologien kan mye enklere og raskere utviklingen.

  2. Jeg er ny på automatisering, hvor kan jeg finne gode ressurser for å lære mer? Kapittel 24 av David Kruglinski "inne i Visual C++" (ISBN:1-57231-565 - 2) gir en generell oversikt, samt noen flotte eksempler. Microsoft Knowledge Base er også en god kilde til informasjon. Denne artikkelen seg selv er en god start, og du kan finne mer spesifikk referanser i følgende artikkel i Microsoft Knowledge Base:

    152023 å finne ressurser for å studere OLE-automatiseringHvis du vil lære av eksempel, kan du se følgende artikkel i Microsoft Knowledge Base:

    179706 slik bruk MFC til å automatisere Excel og oppretter/Format en ny arbeidsbok

  3. Finnes det forskjellige måter jeg kan bruke automatisering? Det finnes tre grunnleggende måter du kan bruke automatisering: MFC, #import og C/C++:

    • Med MFC, kan du bruke Visual C++-ClassWizard til å generere "wrapperklasser" fra typebibliotek for Microsoft Office. Disse klassene, samt andre MFC-klasser, COleVariant, COleSafeArray, COleException, forenkle oppgavene med automatisering. Denne metoden anbefales vanligvis over de andre, og de fleste av Microsoft Knowledge Base-eksemplene bruker MFC.

    • #import, et nytt direktiv som ble tilgjengelig i Visual C++ 5.0, oppretter VC ++ "smart tips" fra en angitt typebibliotek. Det er svært kraftig, men ofte ikke anbefalt på grunn av referanse - opptelling problemer som vanligvis oppstår når den brukes med Microsoft Office-programmer.

    • C/C++-automatisering er mye vanskeligere, men noen ganger nødvendig å unngå overhead med MFC eller problemer med #import. I utgangspunktet du arbeider med slike APIer som CoCreateInstance(), og COM-grensesnitt som IDispatch og IUnknown.

    Det er viktig å merke seg at det er noen små forskjeller mellom automatisering fra C++ sammenlignet med vanlig C, fordi COM er utviklet rundt C++-klassen. Hvis du vil ha mer informasjon, kan du se følgende artikkel i Microsoft Knowledge Base for en C-eksempel:

    181473 slik: bruke OLE-automatisering fra et C-program

  4. Hva er COM? Automatisering er basert på Component Object Model (COM). COM er en standard programvare arkitektur basert på grensesnitt, og utformet for å ha kode som er delt inn i selvstendig objekter. Tenk på det som en utvidelse av objekt orientert programmering (OOP)-paradigm, men brukes til å skille programmer. Hvert objekt, viser et sett med grensesnitt, og all kommunikasjon til et objekt, for eksempel initialisering, varsler og dataoverføring, skjer gjennom disse grensesnittene. COM er også et sett med tjenester som leveres av biblioteker for dynamiske koblinger (DLLer) installert sammen med operativsystemet. Automatisering bruker mange av disse tjenestene. Ett eksempel er "Marshalling"-tjeneste som pakker i klientprogrammet kall til medlemsfunksjoner server-program-grensesnitt og sender dem, med sine argumenter, til serverprogrammet. Det gjør det vises at serverens grensesnitt vises i klientens minneområde som ikke er tilfellet når klienten er en .exe kjører i sitt eget prosessområde. Hensyn til formidlinger også får Returverdiene fra serverens metoder tilbake på tvers av grensene prosessen og trygt i hendene på klientens samtalen. Det er mange andre tjenester avgjørende for automatiseringen som tilbys av ulike COM-bibliotekene. Informasjon om de kilder "I Ole – Second Edition" av Kraig Brockschmidt, ISBN 1-55615-843-2, "I COM" av Dale Rogerson - ISBN 1-57231-349-8, og "Automatisering Programmer's Reference", ISBN 1-57231-584-9.

  5. Hvordan jeg knytte til forekomst av et Office-program? Bruk GetActiveObject()-APIen. Automatiseringsservere registreres i RÅTE (kjører objektet tabell), via RegisterActiveObject()-APIen. Automatiseringsklienter kan få på forekomst med koden som:

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

    Merk: Hvis det finnes flere forekomster kjører på Office-programmet du vil legge ved, du vil bare kunne legge til den første forekomsten startet med GetActiveObject()-APIen. I teorien kan du gå til RÅTE for hver enkelt forekomst, men i Office-programmer registrere ikke seg selv hvis en annen forekomst er allerede i RÅTE fordi kallenavn for seg selv er alltid det samme (det ikke kan skilles likevel). Dette betyr at du ikke kan koble til en forekomst med unntak av først. Imidlertid fordi Office-programmer kan også registrere dokumentene i RÅTE, kan du lykkes knytte til andre forekomster ved å veksle RÅTE på jakt etter et bestemt dokument, legger, henter deretter Application-objektet fra den. Det finnes noen kode i følgende Microsoft Knowledge Base-artikkel for å veksle mellom elementene i RÅTE og ser etter et dokumentnavn:

    190985 slik: hente IDispatch i et Excel eller Word-dokument fra en ocx-filDu trenger ikke å gjøre dette for PowerPoint, fordi det er et program for enkel forekomst. Du kan bare ha én forekomst av det kjører.

  6. Hvordan jeg sende valgfrie parametere? Noen metoder har "valgfrie" parametere. I Visual Basic kan du uvøren søking utelate dem under kall av metoden. Men når du kaller med Visual C++ må du sende en spesiell VARIANT der .vt-feltet er VT_ERROR, og .scode-feltet er DISP_E_PARAMNOTFOUND. det vil si:

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

    Dette er virkelig hva Visual Basic gjør ble laget.

  7. Hvordan jeg fange opp hendelser som vises av Office-programmer? I utgangspunktet du implementerer hendelsesgrensesnittet du vil fange opp ("mottaker"), og installasjonsprogrammet en sikkerhetsveiledning tilkobling med programmet ("kilde"). Den følgende artikkelen gir trinnvise eksempler for Microsoft Word:

    183599 slik: Finn Word97 for Microsoft-programhendelser ved hjelp av VC ++Generelt hvis du vil konfigurere tilkoblingen rådgivning, du hente serverens IConnectionPointContainer og ringe FindConnectionPoint() med IID for hendelsesgrensesnittet. Dette gir deg et grensesnitt for IConnectionPoint og alt som er igjen å kalle angi Advise() med en forekomst av hendelse-grensesnitt. Serveren vil deretter ringe tilbake gjennom dette grensesnittet når disse hendelsene oppstår.

  8. Kode for automatisering er lav. Hvordan kan jeg gjøre ting raskere? Det er en vanlig årsak til hastighet problemer med automatisering med gjentatte lesing og skriving av data. Dette er vanlig for automatisering av Excel-klienter. De fleste er imidlertid ikke klar over at disse dataene vanligvis kan skrive eller lese alle samtidig med SAFEARRAY. Se følgende Microsoft Knowledge Base-artikler for mer informasjon og informativ eksempler:

    186120 slik: bruke MFC til å automatisere Excel og fyller et område med en matrise

    186122 slik: bruke MFC til å automatisere Excel & få en matrise fra et område

    179706 slik: bruke MFC til å automatisere Excel og oppretter/Format en ny arbeidsbokDet er også viktig å peke på at ved hjelp av utklippstavlen kan noen ganger bedre ytelse. Du kan for eksempel kopiere dataene til utklippstavlen og deretter bruke automatisering til å be server til å lime inn. Eller omvendt; Be server til Kopier til utklippstavlen, og Lim inn i programmet.

  9. Hva gjør disse enorme feilverdier, for eksempel-2147352573 eller 0x80030002 betyr? Disse verdiene er kjent som HRESULTs, og er definert i winerror.h. Tallene er så stor fordi den første biten representerer om det er et resultat av feil eller ikke. Du kan bruke ErrLook.Exe-verktøyet som følger med Visual C++ til å oversette disse tallene til meningsfulle beskrivelser. Hvis du vil ha en beskrivelse av feilene programmatisk, kan du bruke APIen FormatMessage(). Se følgende Microsoft Knowledge Base-artikler for mer informasjon og eksempler på bruk av FormatMessage():

    186063 INFO: oversetter automatiseringsfeil for VB/VBA

    EKSEMPEL på 122957 : Decode32 og Decode16 OLE-feil kode dekoder-verktøyMerk: Hvis du bruker Visual C++ 6.0 og har en variabel som inneholder denne verdien i overvåkingsvinduet debug, tilføye ", hr" (uten anførselstegnene) til det har Visual C++ oversette den for deg!

  10. Hva er et typebibliotek? Et typebibliotek er lik en hovedpostfil for C/C++. Den inneholder grensesnitt, metoder og egenskaper som publiserer en server. Du kan vise typebiblioteket med OLE/COM-objektet Viewer (Oleview.exe) som følger med Visual C++. Her er en liste over filnavn for type-bibliotek for Microsoft Office 95, 97 og 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. Min automatiseringskoden arbeidet med Excel 95, men mislykkes med Microsoft Excel 97. hva skjer? Objektmodellen for Excel gjort en betydelig endring fra versjon 95 eller 97. Excel 95 implementert alle sine metoder og egenskaper i en enkelt implementeringen av IDispatch. Dette betydde at ofte du kan kalle metoder som er ment for objektet X, Y-objekt. Dette var ikke en god utforming, slik at i Office 97, hvert objekt har sin egen separate implementeringen av Idispatch. Dette betyr at hvis du ber om en metode eller egenskap fra objektet X fra et separat objekt Y, får du feilen 0x80020003,-2147352573, "Medlemmet ble ikke funnet." Hvis du vil unngå denne feilen, må du kontrollere at underliggende IDispatch-grensesnittet du ringer fra er riktig semantiske. Se følgende Microsoft Knowledge Base-artikler for mer informasjon:

    172108 slik: feilsøking "Medlemmet ble ikke funnet", 0x80020003 feil

  2. Programmet jeg 'M automatisere forblir i minnet etter at programmet er fullført. hva skjer? Mest sannsynlig, dette er fordi du har glemt å gi et grensesnitt som er hentet, og du trenger til å spore den. Her er noen generelle forslag, og ting du leter etter:

    • Hvis du bruker #import, er det svært sannsynlig at du kan kjøre til en over-referansetelling feil knyttet til den. Ofte feil kan arbeide rundt, men det er vanligvis å foretrekke å bruke en av de andre metodene for automatisering. #import fungerer ikke veldig bra med Office-programmer, fordi den typebiblioteker og bruk er ganske komplisert. Slike referanse opptellingsdatoen problemer er også vanskelig å spore fordi mye grensesnittet nivå COM-kall ble laget ved bruk av #import.

    • Se hvis du ringer noen metoder, for eksempel åpne eller ny, som returnerer IDispatch * (LPDISPATCH), og ignorerer returverdien. Hvis du er, deretter Opphevelsen er dette returnerte grensesnittet og trenger å endre koden slik at du slipper den når du ikke lenger trenger.

    • Kommenter gradvis ut deler av koden før problemet forsvinner, og deretter legge det tilbake Persienner for å spore hvor problemet starter.

    • Legg merke til at noen programmer vil fortsatt være kjører Hvis brukeren er "berøring" programmet. Hvis dette skjer når du automatiserer, vil deretter programmet trolig forbli kjører etterpå. Office-programmer har egenskapen "UserControl" på applikasjonsobjektet som du kan lese-og skrivetilgang til å endre dette.

    • Noen programmer vil også bestemme å holde kjører hvis nok brukergrensesnitt "handling" det har oppstått. Hvis du er planlegger å avslutte programmet, kan du kalle den Quit()-metoden i Application-objektet. Word avsluttes uansett sin referanseantallet når Avslutt kalles. Dette er ikke normalt COM. Excel, imidlertid, riktig bare skjule seg, men holde kjøre til alle utestående grensesnitt er utgitt. Generelt bør du frigjøre alle utestående referanser, og bare kalle Quit() Hvis du har tenkt å avslutte programmet.

  3. Jeg vet hva jeg skal gjøre som bruker et Office-program, men hvordan gjør jeg dette programmatisk gjennom automatisering? Hva du er interessert i er hvilke objekter, metoder og egenskaper du vil bruke. Den beste måten å lære hvordan du navigerer objektmodeller for Word, Excel og Powerpoint, basert på hva du vil gjøre som en bruker, er å bruke funksjonen for makroregistrering. Bare Velg Macro\ Registrer ny makro på Verktøy-menyen, kjøre oppgaven du er interessert i, og velg deretter Macro\ "Stopp registrering." Når du er ferdig med innspillingen, velger du Macro\Macros Verktøy-menyen, velger du makroen du registrerte, og klikk deretter Rediger. Da kommer du til genererte VBA-koden som skal utføre oppgaven du har spilt inn. Husk den registrerte makroen ikke best mulig koden i de fleste tilfeller, men den er veldig bra for en rask eksempel.

  4. Kan jeg automatisere et Office-program som er innebygd? Absolutt. Stikket blir IDispatch-pekeren: Dette er angitt i den Visual C++-39 med tekniske notat (TN039). Se følgende Microsoft Knowledge Base-artikkelen for en trinnvis eksempel:

    184663 slik: bygge inn og automatisere Microsoft Excel-regneark med MFC

  5. Hvordan går jeg til Min dokumentegenskaper i et Office-dokument? Dokumentegenskapene som er tilgjengelige gjennom automatisering eller direkte fra IPropertyStorage. Følgende Microsoft Knowledge Base-artikler beskriver hver metode:

    179494 slik: bruke automatisering til å hente egenskaper for innebygd dokument

    Slik 186898 : lese sammensatte dokumentegenskaper direkte med VC ++

Trenger du mer hjelp?

Utvid ferdighetene dine
Utforsk opplæring
Vær først ute med de nye funksjonene
Bli med i Microsoft Insiders

Var denne informasjonen nyttig?

Hvor fornøyd er du med kvaliteten på oversettelsen?

Hva påvirket opplevelsen din?

Har du ytterligere tilbakemeldinger? (valgfritt)

Takk for tilbakemeldingen!

×