Logg på med Microsoft
Logg på, eller opprett en konto.
Hei,
Velg en annen konto.
Du har flere kontoer
Velg kontoen du vil logge på med.

Sammendrag

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

Mer informasjon

Innholdsfortegnelse

  1. Hva er automatisering?

  2. Jeg har ikke brukt automatisering før, hvor finner jeg gode ressurser for å lære mer?

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

  4. Hva er COM?
     

  5. Hvordan knytte til den kjørende forekomsten av et Office-program?

  6. Hvordan sende valgfrie parametere?

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

  8. Automatiseringskoden min er for treg. Hvordan kan jeg gjøre ting raskere?

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

  10. Hva er et typebibliotek?

  11. Automatiseringskoden min fungerte med Microsoft Excel 95, men mislykkes med Microsoft Excel 97. Hvorfor det?

  12. Hvorfor beholdes programmet jeg automatiserer, i minnet når programmet er ferdig?

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

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

  15. Hvordan få tilgang til dokumentegenskapene mine i et Microsoft Office-dokument?

Spørsmål og svar

  1. Hva er automatisering?

    Automatisering (tidligere OLE-automatisering) er en teknologi som lar deg dra nytte av funksjonaliteten til et eksisterende program og innlemme det i dine egne programmer. Du kan for eksempel bruke funksjonene for stave- og grammatikkontroll i Microsoft Word i programmet uten at Microsoft Word er synlig for brukerne. Du kan også bruke alle diagram-, utskrifts- og dataanalyseverktøyene i Microsoft Excel. Denne teknologien kan forenkle og gjøre utviklingen raskere.
     

  2. Jeg har ikke brukt automatisering før, hvor finner jeg gode ressurser for å lære mer? Kapittel 24 av David Kruglinskis "Inside Visual C++" (ISBN:1-57231-565-2) gir en generell oversikt samt noen gode eksempler. Microsoft Knowledge Base er også en god kilde til informasjon.
    Hvis du for eksempel foretrekker å lære, kan du se følgende artikkel i Microsoft Knowledge Base:
     

    179706 HOWTO Bruke MFC til å automatisere Excel & opprette/formatere en ny arbeidsbok

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

    Du kan bruke automatisering på tre grunnleggende måter: MFC, #import og C/C++:
     

    • Med MFC kan du bruke Visual C++ ClassWizard til å generere «wrapper-klasser» fra Microsoft Office-typebiblioteker. Disse klassene, så vel som andre MFC-klasser, for eksempel COleVariant, COleSafeArray, COleException, forenkler oppgavene med automatisering. Denne metoden anbefales vanligvis over de andre, og de fleste eksemplene på Microsoft Knowledge Base bruker MFC.

    • #import, et nytt direktiv som ble tilgjengelig med Visual C++ 5.0, oppretter VC++ «smartpekere» fra et angitt typebibliotek. Det er veldig kraftig, men anbefales ofte ikke på grunn av referansetellingsproblemer som vanligvis oppstår når de brukes med Microsoft Office-programmene.

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

    Det er viktig å være oppmerksom på at det er noen små forskjeller mellom automatisering fra C++ sammenlignet med vanlig C, fordi COM ble utformet rundt C++-klassen.
     

  4. Hva er COM?

    Automatisering er basert på Component Object Model (COM). COM er en standard programvarearkitektur basert på grensesnitt, og utformet for å ha kode delt inn i selvstendige objekter. Tenk på det som en forlengelse av OOP-paradigmet (Object Oriented Programming), men gjelder for separate 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 levert av dynamiske koblingsbiblioteker (DLL-er) som er installert med operativsystemet. Automatisering bruker mange av disse tjenestene. Et eksempel er "Marshalling"-tjenesten, som pakker klientprogrammets kall til medlemsfunksjonene i serverprogrammets grensesnitt og sender disse, med sine argumenter, til serverprogrammet. Det ser ut til at serverens grensesnitt vises i klientens minneområde, noe som ikke er tilfelle når klienten er en .exe som kjører i sitt eget prosessområde. Marshalling får også returverdiene fra serverens metoder tilbake over prosessgrensene og trygt i hendene på klientens anrop. Det finnes mange andre tjenester som er viktige for automatisering som leveres av de ulike COM-bibliotekene. Kilder til informasjon om disse inkluderer "Inside Ole - Second Edition" av Kraig Brockschmidt, ISBN 1-55615-843-2, "Inside COM" av Dale Rogerson - ISBN 1-57231-349-8, og "Automation Programmer's Reference," ISBN 1-57231-584-9.

  5. Hvordan knytte til den kjørende forekomsten av et Office-program?

    Bruk GetActiveObject()-API-en. Automatiseringsservere registrerer seg selv i ROT -en (kjører objekttabell), via RegisterActiveObject()-API-en. Automatiseringsklienter kan få tak i den kjørende forekomsten med kode, for eksempel:

     

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

    OBS! Hvis det kjøres flere forekomster av Office-programmet du vil legge ved, kan du bare knytte til den første forekomsten som ble startet ved hjelp av GetActiveObject()-API-en.

    Teoretisk sett kan du gjenta ROT for hver enkelt forekomst, men Office-appene registrerer seg ikke selv hvis en annen forekomst allerede er i ROT fordi kallenavnet for seg selv alltid er det samme (det kan ikke skilles uansett). Dette betyr at du ikke kan knytte til noen forekomst bortsett fra den første. Siden Office-appene også registrerer dokumentene sine i ROT, kan du imidlertid knytte til andre forekomster ved å gjenta ROT-en på jakt etter et bestemt dokument, knytte til det og deretter hente programobjektet fra det.
    Du trenger ikke å gjøre dette for PowerPoint, fordi det er et program med én forekomst. du kan bare kjøre én forekomst av den.

  6. Hvordan sende valgfrie parametere?

    Noen metoder har valgfrie parametere. I Visual Basic kan du tilfeldigvis utelate dem når du kaller metoden. Når du ringer med Visual C++, må du imidlertid 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 det Visual Basic gjør bak kulissene.

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

    I utgangspunktet implementerer du hendelsesgrensesnittet du vil fange («vasken»), og setter opp en rådgivende forbindelse med programmet («kilden»).

    Hvis du vil konfigurere veiledningstilkoblingen, får du generelt serverens IConnectionPointContainer og kaller FindConnectionPoint() med IID-en for hendelsesgrensesnittet. Dette gir deg et IConnectionPoint-grensesnitt, og alt som er igjen, er å ringe Advise() med en forekomst av hendelsesgrensesnittet. Serveren vil deretter ringe tilbake gjennom dette grensesnittet når disse hendelsene oppstår.

  8. Automatiseringskoden min er for treg. Hvordan kan jeg gjøre ting raskere?

    En vanlig årsak til hastighetsproblemer med automatisering er gjentatt lesing og skriving av data. Dette er typisk for automatiseringsklienter for Excel. De fleste er imidlertid ikke klar over at disse dataene vanligvis kan skrives eller leses samtidig ved hjelp av SAFEARRAY. Se følgende Microsoft Knowledge Base-artikkel for mer informasjon og informative eksempler:

    179706 HOWTO: Bruke MFC til å automatisere Excel og opprette/formatere en ny arbeidsbok
    Det er også viktig å påpeke at bruk av utklippstavlen noen ganger kan forbedre ytelsen. Du kan for eksempel kopiere dataene til utklippstavlen, og deretter bruke automatisering til å be serveren om å lime inn. Eller omvendt; be serveren om å kopiere til utklippstavlen og lime inn i programmet.

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

    Disse verdiene er kjent som HRESULTs og er definert i winerror.h. Tallene er så store fordi den første biten representerer om det er et feilresultat eller ikke. Du kan bruke ErrLook.Exe som følger med Visual C++ til å oversette disse tallene til meningsfulle beskrivelser.

    Hvis du vil hente en beskrivelse av feilene programmatisk, kan du bruke FormatMessage()-API-en.

    OBS! Hvis du bruker Visual C++ 6.0 og har en variabel som inneholder denne verdien i overvåkingsvinduet for feilsøking, legger du til «, hr» (uten anførselstegn) for å få Visual C++ til å oversette den for deg!

  10. Hva er et typebibliotek?

    Et typebibliotek ligner på en C/C++-topptekstfil. Den inneholder grensesnittene, metodene og egenskapene som en server publiserer. Du kan vise typebiblioteket med OLE/COM Object Viewer (Oleview.exe) som følger med Visual C++. Her er en liste over type bibliotekfilnavnene for Microsoft Office 95, 97 og 2000:



    Office-program | Typebibliotek
    ------------------------+----------------
    Word 95 og tidligere | wb70en32.tlb
    Excel 95 og tidligere | xl5en32.olb
    PowerPoint 95 og tidligere | Powerpoint.tlb
    Access 95 og tidligere | msaccess.tlb
    Binder 95 | binder.tlb
    Planlegg + | 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. Automatiseringskoden min fungerte med Excel 95, men mislykkes med Excel 97. Hva skjer?

    Objektmodellen for Excel gjorde en betydelig endring fra versjon 95 til 97. Excel 95 implementerte alle metodene og egenskapene i én enkelt implementering av IDispatch. Dette betydde at du ofte kunne kalle opp metoder ment for objekt X, fra objekt Y. Dette var ikke en god utforming, så i Office 97 har hvert objekt sin egen separate Idispatch-implementering. Dette betyr at hvis du ber om en metode eller egenskap fra objekt X fra et eget objekt Y, får du feilen 0x80020003, -2147352573, «Fant ikke medlem». Hvis du vil unngå denne feilen, må du kontrollere at det underliggende IDispatch-grensesnittet du ringer fra, er det semantisk riktige.
     

  2. Programmet jeg automatiserer, forblir i minnet når programmet er ferdig. Hva skjer?

    Dette er mest sannsynlig fordi du har glemt å frigi et anskaffet grensesnitt, og du må spore det opp. Her er noen generelle forslag og ting du bør se etter:
     

    • Hvis du bruker #import, er det svært sannsynlig at du kan kjøre inn i en av referansetellingsfeilene som er knyttet til den. Ofte kan feilene omgås, men vanligvis foretrekkes det å bruke en av de andre automatiseringsmetodene. #import fungerer ikke så bra med Office-programmene, fordi typebibliotekene og bruken er ganske kompliserte. Det er også vanskelig å spore opp slike referansetellingsproblemer fordi mange COM-kall på grensesnittnivå er bak kulissene når du bruker #import.

    • Kontroller om du kaller opp noen metoder, for eksempel Åpne eller Ny, som returnerer en IDispatch * (LPDISPATCH), og ignorerer returverdien. Hvis du er det, forlater du dette returnerte grensesnittet og må endre koden slik at du slipper den når du ikke lenger trenger det.

    • Kommenter gradvis deler av koden til problemet forsvinner, og legg det deretter tilbake med omdreining for å finne ut hvor problemet starter.

    • Vær oppmerksom på at noen programmer vil fortsette å kjøre hvis brukeren har "rørt" programmet. Hvis dette skjer mens du automatiserer, vil programmet sannsynligvis fortsette å kjøre etterpå. Office-programmene har en UserControl-egenskap på programobjektet som du kan lese/skrive for å endre denne virkemåten.

    • Noen programmer bestemmer seg også for å fortsette å kjøre hvis det har oppstått nok «handling» i brukergrensesnittet. Hvis du har tenkt at programmet skal avsluttes, kaller du avslutt()-metoden på programobjektet. Word avsluttes uavhengig av referanseantallet når Avslutning kalles. Dette er ikke forventet COM-virkemåte. Excel vil imidlertid bare skjule seg selv, men fortsette å kjøre til alle utestående grensesnitt er utgitt. Generelt sett bør du frigi alle utestående referanser, og bare ringe Quit() hvis du har tenkt å avslutte programmet.

  3. Jeg vet hva jeg vil gjøre som office-programbruker, men hvordan gjør jeg dette programmatisk gjennom automatisering?

    Det du er interessert i, er hvilke objekter, metoder og egenskaper du må bruke. Den beste måten å lære hvordan du navigerer i objektmodellene i Word, Excel og PowerPoint, basert på hva du vil gjøre som bruker, er å bruke makroregistreringen. Bare velg Makro\'Registrer ny makro' fra Verktøy-menyen, utfør oppgaven du er interessert i, og velg deretter Makro\'Stopp registrering.' Når du er ferdig med innspillingen, velger du Makro\Makroer fra Verktøy-menyen, velger makroen du registrerte, og klikker deretter Rediger. Dette tar deg til den genererte VBA-koden som utfører oppgaven du registrerte. Husk at den registrerte makroen ikke vil være den beste mulige koden i de fleste tilfeller, men den gjør det veldig bra for et raskt eksempel.

  4. Kan jeg automatisere et innebygd Office-program?

    Absolutt. Trikset er å få IDispatch-pekeren: dette er gitt i Visual C++ Technical Note 39 (TN039).
     

  5. Hvordan få tilgang til dokumentegenskapene mine i et Office-dokument?

    Dokumentegenskapene er tilgjengelige via automatisering, eller direkte gjennom IPropertyStorage.
     

Trenger du mer hjelp?

Vil du ha flere alternativer?

Utforsk abonnementsfordeler, bla gjennom opplæringskurs, finn ut hvordan du sikrer enheten og mer.

Fellesskap hjelper deg med å stille og svare på spørsmål, gi tilbakemelding og høre fra eksperter med stor kunnskap.

Var denne informasjonen nyttig?

Hvor fornøyd er du med språkkvaliteten?
Hva påvirket opplevelsen din?
Når du trykker på Send inn, blir tilbakemeldingen brukt til å forbedre Microsoft-produkter og -tjenester. IT-administratoren kan samle inn disse dataene. Personvernerklæring.

Takk for tilbakemeldingen!

×