Yhteenveto

Tässä artikkelissa vastataan Microsoft Officen automaatiota koskeviin yleisiin kysymyksiin Visual C++:sta.

Lisätietoja

Sisällysluettelo

  1. Mikä automaatio on?

  2. Olen uusi automaatio-osa, mistä löydän hyviä resursseja saadakseni lisätietoja?

  3. Voinko käyttää automaatiota eri tavoin?

  4. Mikä on COM?  

  5. Ohjevalikko liittää Office-sovelluksen käynnissä olevaan esiintymään?

  6. Ohjevalikko valinnaiset parametrit?

  7. Ohjevalikko nähdä Office-sovellusten näyttämiä tapahtumia?  

  8. Automaatiokoodini on liian hidas. Miten voin nopeuttaa asioita?

  9. Mitä nämä valtavat virhearvot, kuten -2147352573 tai 0x80030002, tarkoittavat?

  10. Mikä on tyyppikirjasto?

  11. Automaatiokoodi toimi Microsoft Excel 95:n kanssa, mutta epäonnistuu Microsoft Excel 97:ssä. Miksi?

  12. Miksi automatisoimani sovellus pysyy muistissa, kun ohjelmani on valmis?

  13. Tiedän, mitä haluan tehdä Microsoft Office -sovelluksen käyttäjänä, mutta miten tämä tehdään ohjelmallisesti automaation avulla?

  14. Voinko automatisoida upotetun Microsoft Office -sovelluksen?

  15. Ohjevalikko käyttää asiakirjan ominaisuuksia Microsoft Office -asiakirjassa?

Kysymykset ja vastaukset

  1. Mikä automaatio on? Automaatio (aiemmin OLE Automation) on tekniikka, jonka avulla voit hyödyntää olemassa olevan ohjelman toimintoja ja sisällyttää sen omiin sovelluksiin. Voit esimerkiksi käyttää Microsoft Wordin oikeinkirjoituksen ja kieliopin tarkistustoimintoja sovellukseen ilman, että Microsoft Word näkyy käyttäjillesi. Voit käyttää myös kaikkia Microsoft Excelin kaavio-, tulostus- ja tietojen analysointityökaluja. Tämä tekniikka voi yksinkertaistaa ja nopeuttaa kehitystä huomattavasti.  

  2. Olen uusi automaatio-osa, mistä löydän hyviä resursseja saadakseni lisätietoja? David Kruglinskin "Inside Visual C++" (ISBN:1-57231-565- 2) luku 24 tarjoaa yleiskatsauksen sekä hienoja esimerkkejä. Microsoft Knowledge Base on myös hyvä tietolähde.Jos haluat oppia esimerkin perusteella, katso seuraava artikkeli Microsoft Knowledge Base -tietokannasta:  

    179706 HOWTO Use MFC to Automate Excel & Create/Format a New Workbook

  3. Voinko käyttää automaatiota eri tavoin? Automaatiota voi käyttää kolmella perusmenetelmällä: MFC, #import ja C/C++:  

    • Käytä MFC-funktiota Visual C++ ClassWizard -toiminnolla ja luo "rivitysluokat" Microsoft Office -tyyppikirjastoista. Nämä luokat sekä muut MFC-luokat, kuten COleVariant, COleSafeArray, COleException, yksinkertaistavat automaation tehtäviä. Tätä menetelmää suositellaan yleensä muille käyttäjille, ja useimmissa Microsoft Knowledge Base -esimerkeistä käytetään MFC:tä.

    • #import, uusi direktiivi, joka tuli saataville Visual C++ 5.0:n kanssa, luo VC++ "smart pointers" määritetystä tyyppikirjastosta. Se on erittäin tehokas, mutta sitä ei usein suositella viitelaskentaongelmien vuoksi, joita ilmenee yleensä Käytettäessä Microsoft Office -sovelluksia.

    • C/C++ Automaatio on paljon vaikeampaa, mutta joskus se on tarpeen MFC:n käytön tai #import ongelmien välttämiseksi. Periaatteessa työskentelet sellaisten ohjelmointirajapintojen kanssa kuin CoCreateInstance() ja COM-käyttöliittymät, kuten IDispatch ja IUnknown.

    On tärkeää huomata, että automaation välillä on pieniä eroja C++:sta tavalliseen C:hen verrattuna, koska COM on suunniteltu C++-luokan ympärille.  

  4. Mikä on COM? Automaatio perustuu COM (Component Object Model) -malliin. COM on käyttöliittymään perustuva ohjelmistoarkkitehtuuri, jonka koodi on jaettu itsenäisiin objekteihin. Ajattele sitä OOP (Object Oriented Programming) -paradigmin jatkeena, mutta sitä voidaan käyttää erillisissä sovelluksissa. Jokainen objekti näyttää joukon liitäntöjä, ja kaikki objektin viestintä, kuten alustus, ilmoitukset ja tiedonsiirto, tapahtuu näiden liitäntöjen kautta.COM on myös joukko palveluja, joita tarjoavat käyttöjärjestelmän mukana asennetut DLL-kirjastot. Automaatio käyttää monia näistä palveluista. Yksi esimerkki on "Marshalling"-palvelu, joka pakkaa asiakassovelluksen puhelut palvelinsovelluksen käyttöliittymän jäsenfunktioita varten ja välittää ne argumenteineen palvelinsovellukseen. Se näyttää siltä, että palvelimen käyttöliittymät näkyvät asiakkaan muistitilassa. Näin ei ole silloin, kun asiakas on .exe, joka toimii omassa prosessitilassaan. Järjestelytoiminto saa myös palvelimen menetelmien palautusarvot takaisin prosessin rajojen yli ja turvallisesti asiakkaan puhelun käsiin. On olemassa monia muita automaation kannalta olennaisia palveluita, joita com-kirjastot tarjoavat. Tietolähteitä näistä ovat Kraig Brockschmidtin "Inside Ole - Second Edition", ISBN 1-55615-843-2, Dale Rogersonin "Inside COM" - ISBN 1-57231-349-8 ja "Automation Programmer's Reference", ISBN 1-57231-584-9.

  5. Ohjevalikko liittää Office-sovelluksen käynnissä olevaan esiintymään? Käytä GetActiveObject() -ohjelmointirajapintaa. Automaatiopalvelimet rekisteröityvät ROT(Running Object Table) -ohjelmointirajapintaan RegisterActiveObject() -ohjelmointirajapinnan kautta. Automaatioasiakkaat voivat käyttää käynnissä olevaa esiintymää koodilla, kuten:  

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

    HUOMAUTUS: Jos liitettävässä Office-sovelluksessa on useita esiintymiä, voit liittää vain ensimmäiseen GetActiveObject() -ohjelmointirajapinnan avulla käynnistettyihin instanssiin.Teoriassa voit iteroida rot-funktion kullekin yksittäiselle esiintymälle, mutta Office-sovellukset eivät rekisteröidy, jos toinen esiintymä on jo ROT: ssä, koska monikeri itsessään on aina sama (sitä ei voitu erottaa joka tapauksessa). Tämä tarkoittaa, että et voi liittää mihinkään esiintymään lukuun ottamatta ensimmäistä esiintymää. Koska Office-sovellukset rekisteröivät myös tiedostonsa ROT-tiedostoon, voit liittää ne onnistuneesti muihin esiintymiin iteroimalla ROT:n etsimällä tiettyä asiakirjaa, liittämällä sen ja hakemalla sitten Sovellus-objektin siitä.Tätä ei tarvitse tehdä PowerPointissa, koska se on yhden esiintymän sovellus. käytössä voi olla vain yksi esiintymä.

  6. Ohjevalikko läpäise valinnaisia parametreja? Joillakin menetelmillä on valinnaisia parametreja. Visual Basicissa voit jättää ne satunnaisesti pois, kun kutsut menetelmää. Kun soitat Visual C++ -toiminnolla, sinun on kuitenkin läpäistävä erityinen VARIANTTI, jonka .vt-kenttä on VT_ERROR ja .scode-kenttä on DISP_E_PARAMNOTFOUND. Tuo on:  

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

    Visual Basic tekee tätä kulissien takana.

  7. Ohjevalikko nähdä Office-sovellusten näyttämiä tapahtumia? Periaatteessa otat käyttöön tapahtumaliittymän, jonka haluat nähdä ("pesuallas"), ja määrität neuvontayhteyden sovellukseen ("lähde").Yleensä neuvontayhteyden määrittämiseksi saat palvelimen IConnectionPointContainer-kutsun ja kutsut FindConnectionPoint() tapahtumaliittymän IID-tunnisteella. Tämä antaa sinulle IConnectionPoint-käyttöliittymän, ja jäljellä on vain kutsua neuvonta() tapahtumaliittymän esiintymän kanssa. Palvelin soittaa sitten takaisin tämän käyttöliittymän kautta, kun nämä tapahtumat tapahtuvat.

  8. Automaatiokoodini on liian hidas. Miten voin nopeuttaa asioita? Automaation nopeusongelmien yleinen syy on tietojen toistuva lukeminen ja kirjoittaminen. Tämä on tyypillistä Excelin automaatioasiakkaille. Useimmat eivät kuitenkaan ole tietoisia siitä, että nämä tiedot voidaan yleensä kirjoittaa tai lukea kerralla SAFEARRAY-toiminnolla. Lisätietoja ja informatiivisia esimerkkejä on seuraavassa Microsoft Knowledge Base -artikkelissa:

    179706 HOWTO: Käytä MFC:tä Excelin automatisoinnissa ja uuden työkirjan luonti/muotoileminen On myös tärkeää huomauttaa, että leikepöydän käyttäminen voi joskus parantaa suorituskykyä. Voit esimerkiksi kopioida tiedot leikepöydälle ja pyytää sitten palvelinta liittämään ne automaation avulla. Tai päinvastoin; pyydä palvelinta kopioimaan leikepöydälle ja liittämään sovellukseen.

  9. Mitä nämä valtavat virhearvot, kuten -2147352573 tai 0x80030002 tarkoittavat? Näitä arvoja kutsutaan HRESULT-arvoiksi, ja ne määritellään kohteessa winerror.h. Luvut ovat niin suuria, koska ensimmäinen bitti ilmaisee, onko se virhetulos. Visual C++:n mukana toimitetun ErrLook.Exe-apuohjelman avulla voit muuntaa nämä luvut kuvaaviksi kuvauksi.Jos haluat ohjelmallisesti saada virheiden kuvauksen, voit käyttää FormatMessage() -ohjelmointirajapintaa.

    HUOMAUTUS: Jos käytät Visual C++ 6.0 -näppäinyhdistelmää ja sinulla on muuttuja, joka sisältää tämän arvon virheenkorjausikkunassa, lisää ", hr" (ilman lainausmerkkejä) siihen, jotta Visual C + + kääntää sen puolestasi!

  10. Mikä on tyyppikirjasto? Tyyppikirjasto muistuttaa C/C++-otsikkotiedostoa. Se sisältää palvelimen julkaisemat käyttöliittymät, menetelmät ja ominaisuudet. Voit tarkastella tyyppikirjastoa Visual C++:n mukana tulevalla OLE/COM-objektien katseluohjelmalla (Oleview.exe). Seuraavassa on luettelo Microsoft Office 95:n, 97:n ja 2000:n kirjaston tiedostonimistä: Office-sovelluksen | Kirjoita kirjasto ------------------------+---------------- Word 95 ja aiemmat | wb70en32.tlb Excel 95 ja aiemmat | xl5en32.olb PowerPoint 95 ja aiemmat | Powerpoint.tlb Access 95 ja aiemmat | 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 Kaavio 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. Automaatiokoodi toimi Excel 95:n kanssa, mutta epäonnistuu Excel 97:ssä. Mitä on tekeillä? Excelin objektimallissa on tehty merkittäviä muutoksia versiosta 95 versioon 97. Excel 95 toteutti kaikki menetelmänsä ja ominaisuutensa yhdessä IDispatch-toteutuksessa. Tämä tarkoitti sitä, että usein pystyi kutsumaan objektille X tarkoitettuja menetelmiä objektista Y. Tämä ei ollut hyvä rakenne, joten Office 97:ssä jokaisella objektilla on oma erillinen Idispatch-toteutus. Tämä tarkoittaa sitä, että jos pyydät menetelmää tai ominaisuutta objektista X erillisestä objektista Y, saat virheilmoituksen 0x80020003 -2147352573 "Jäsentä ei löydy". Tämän virheen välttämiseksi sinun on varmistettava, että pohjana oleva IDispatch-käyttöliittymä, josta soitat puheluita, on semanttisesti oikea.  

  2. Sovellus, jota automatisoin, pysyy muistissa, kun ohjelmani on valmis. Mitä on tekeillä? Todennäköisesti tämä johtuu siitä, että olet unohtanut julkaista hankitun käyttöliittymän ja sinun on jäljitettävä se. Seuraavassa on joitakin yleisiä ehdotuksia ja etsittävää:  

    • Jos käytät #import, on hyvin todennäköistä, että sinulla on jokin siihen liittyvistä viittausten laskentavirheistä. Usein virheitä voidaan kiertää, mutta yleensä on suositeltavaa käyttää jotakin muuta automaatiomenetelmää. #import ei toimi kovin hyvin Office-sovellusten kanssa, koska sen tyyppikirjastot ja käyttö ovat melko monimutkaisia. Tällaisia viitelaskentaongelmia on myös vaikea jäljittää, koska monet käyttöliittymätason COM-puhelut ovat kulissien takana, kun käytetään #import.

    • Tarkista, kutsutko menetelmiä, kuten Avaa tai Uusi, jotka palauttavat IDispatch * (LPDISPATCH) -arvon, ja ohittaa palautusarvon. Jos olet, hylkäät tämän palautetun käyttöliittymän ja sinun on muutettava koodia niin, että vapautat sen, kun sitä ei enää tarvita.

    • Kommentoi koodin osia vähitellen, kunnes ongelma katoaa, ja lisää se sitten harkiten takaisin, jotta voit selvittää, mistä ongelma alkaa.

    • Huomaa, että jotkin sovellukset pysyvät käynnissä, jos käyttäjä on "koskettanut" sovellusta. Jos näin tapahtuu automatisoinnin aikana, sovellus pysyy todennäköisesti käynnissä sen jälkeen. Office-sovelluksilla on Sovellus-objektissa UserControl-ominaisuus, jonka avulla voit muuttaa tätä toimintoa lukemalla tai kirjoittamalla.

    • Jotkin sovellukset päättävät myös pysyä käynnissä, jos käyttöliittymän toiminto on riittävä. Jos aiot poistua sovelluksesta, kutsu sen Lopeta()-menetelmää Sovellus-objektissa. Word sammuu riippumatta sen viitemäärästä, kun Lopeta-toimintoa kutsutaan. Tämä ei ole odotettua COM-toimintaa. Excel kuitenkin piilottaa itsensä oikein, mutta pysyy käynnissä, kunnes kaikki erinomaiset käyttöliittymät on julkaistu. Yleensä sinun on julkaistava kaikki avoimet viittaukset ja kutsuttava Lopeta(), jos aiot lopettaa sovelluksen.

  3. Tiedän, mitä haluan tehdä Office-sovelluksen käyttäjänä, mutta miten tämä tehdään ohjelmallisesti automaation avulla? Sinua kiinnostavat objektit, menetelmät ja ominaisuudet, joita sinun on käytettävä. Paras tapa oppia siirtymään Wordin, Excelin ja PowerPointin objektimalleissa käyttäjänä tehtäväsi perusteella on käyttää makrontallennusta. Valitse Työkalut-valikosta Makro\'Tallenna uusi makro', suorita haluamasi tehtävä ja valitse sitten Makro\'Lopeta tallennus.' Kun tallennus on valmis, valitse Työkalut-valikosta Makro\Makrot, valitse tallentamasi makro ja valitse sitten Muokkaa. Tämä vie sinut luotuun VBA-koodiin, joka suorittaa tallentamasi tehtävän. Muista, että tallennettu makro ei useimmissa tapauksissa ole paras mahdollinen koodi, mutta se toimii erittäin hyvin nopeassa esimerkissä.

  4. Voinko automatisoida upotetun Office-sovelluksen? Ehdottomasti. IDispatch-osoittimen hankkiminen on hankalaa: tämä annetaan Visual C++ Technical Note 39 (TN039) -päivityksessä.  

  5. Ohjevalikko käyttää asiakirjan ominaisuuksia Office-asiakirjassa? Tiedoston ominaisuudet ovat käytettävissä automaation kautta tai suoraan IPropertyStoragen kautta.  

Tarvitsetko lisäohjeita?

Haluatko lisää vaihtoehtoja?

Tutustu tilausetuihin, selaa harjoituskursseja, opi suojaamaan laitteesi ja paljon muuta.