Aikaisen ja myöhäisen sidonnan käyttäminen automaatiossa

Artikkeleiden käännökset Artikkeleiden käännökset
Artikkelin tunnus: 245115 - Näytä tuotteet, joita tämä artikkeli koskee.
Laajenna kaikki | Kutista kaikki

Tällä sivulla

Yhteenveto

Automaatiopalvelimen sidontatapa voi vaikuttaa useisiin seikkoihin ohjelmassa, kuten suorituskykyyn, joustavuuteen ja ylläpidettävyyteen.

Tässä artikkelissa kuvataan automaatioasiakkaille käytettävissä olevat sidontatyypit sekä käsitellään kummankin menetelmän hyviä ja huonoja puolia.

Enemmän tietoa

Automaatio on prosessi, jossa yksi ohjelmisto-osa vaihtaa tietoja toisen ohjelmisto-osan kanssa tai hallitsee sitä Microsoftin Component Object Modelin (COM) avulla. Se on perusta suurimmalle osalle osienvälistä tietoliikennettä, jota käytetään esimerkiksi Visual Basic- tai Visual Basic for Applications -kielessä, ja siitä on tullut tavallinen osa useimpia ohjelmia.

Automaatio-objekti on perinteisesti mikä tahansa IDispatch-liittymää tukeva objekti. Tämän liittymän avulla asiakkaat voivat kutsua menetelmiä ja ominaisuuksia suorituksen aikana ilman, että niiden pitää tietää suunnittelun aikana tarkalleen se objekti, jonka kanssa ne vaihtavat tietoja. Tätä prosessia kutsutaan myöhäiseksi sidonnaksi. Nykyään termiä automaatio-objekti voidaan käyttää lähes mistä tahansa COM-objektista, mukaan lukien IDispatch-liittymää tukemattomat objektit (jotka eivät siten voi olla myöhään sidottuja). Tässä artikkelissa oletetaan, että automatisoitava objekti tukee molempia sidontatapoja.

Sidonnan kuvaus

Sidonta on prosessi, jossa ohjelmoijan kirjoittamat funktiokutsut yhdistetään todelliseen koodiin (sisäiseen tai ulkoiseen), joka toteuttaa funktion. Se tehdään, kun sovellus käännetään, ja kaikki koodissa kutsutut funktiot on sidottava, ennen kuin koodi voidaan suorittaa.

Tämän prosessin ymmärtämistä helpottaa, kun sidontaa ajatellaan kirjan julkaisemisena. Kuvittele, että koodi on kuin kirjan teksti, jossa olet kirjoittanut tiettyyn kappaleeseen vaikkapa "katso lisätietoja luvun 12 sivulta x". Et tiedä sivunumeroa, ennen kuin kirja on valmis, joten ennen kuin kappale voidaan lukea aiotulla tavalla, kaikki kirjan sivut on sidottava yhteen ja oikea numero lisättävä kappaleeseen. Odotat kirjan "sitomista", ennen kuin voit lisätä viittauksen kirjan muihin osiin.

Ohjelmiston sitominen on samankaltaista. Koodi koostuu osista, jotka on koottava yhteen, ennen kuin koodi voidaan "lukea". Sidonnassa funktioiden nimet korvataan muistiosoitteilla (tai tarkemmin sanottuna muistisiirtymillä), joihin koodi "hyppää", kun funktiota kutsutaan. COM-objekteilla osoite on muistisiirtymä osoitintaulukossa (v-taulukossa), joka objektilla on. Kun COM-funktio sidotaan, se sidotaan v-taulukon avulla.

COM-objektin rakenne on yksinkertainen. Kun koodi sisältää viittauksen objektiin, se sisältää epäsuoran osoittimen v-taulukon yläosaan. V-taulukko on muistiosoitteiden matriisi. Siinä kukin merkintä on eri funktio, jota voidaan kutsua kyseiselle objektille. Teet COM-objektin kolmannen funktion kutsun hyppäämällä taulukossa alaspäin kolme merkintää ja sitten kyseisessä kohdassa annettuun muistiosoitteeseen. Tämä suorittaa funktion koodin ja palauttaa suorittamisen jälkeen takaisin valmiina suorittamaan koodin seuraavan rivin.

+-[Koodi]------------+  +.................................[COM-objekti]...+
|                   |  : +-------------+                                :
|Set obj = Nothing -|--->| objektiosoitin|                                :
|                   |  : +-|-----------+                                :
+-------------------+  :   |   +-----------------+                      :
                       :   +-->| v-taulukko-osoitin |                      :
                       :       +--|--------------+                      :
                       :          |                                     :
                       :          |  +----------------------------+     :
                       :  (3.)   |  | Funktion 1 osoitteen osoitin |     :
                       : (Siirtymä) |  +----------------------------+     :
                       :          |  | Funktion 2 osoitteen osoitin |     :
                       :          |  +----------------------------+     :
                       :          +->| Funktion 3 osoitteen osoitin |     :
                       :             +----------------------------+     :
                       +................................................+

				
Edellä olevassa esimerkissä näkyy, mitä tapahtuu, kun COM-objekti vapautetaan. Koska kaikki COM-objektit perivät IUnknown-liittymästä, taulukon kolme ensimmäistä merkintää ovat menetelmiä IUnknown-liittymälle. Kun sinun on vapautettava objekti, koodisi kutsuu v-taulukon kolmatta funktiota (IUnknown::Release).

Onneksi tämän työn tekee Visual Basic. Visual Basic -ohjelmoijana sinun ei koskaan tarvitse käsitellä v-taulukkoa suoraan. Tämä rakenne on kuitenkin tapa, jolla kaikki COM-objektit sidotaan, joten on tärkeää, että tunnet sen ja ymmärrät, mitä sitominen on.

Aikainen sidonta

Edellä oleva esimerkki kuvaa aikaista sidontaa (eli v-taulukkosidontaa). Tämä sidontamuoto tapahtuu kaikilla COM-objekteilla, kun kutsutaan COM-objektin IUnknown-liittymää. Mutta entä objektin muut funktiot? Miten kutsutaan objektin Refresh-menetelmää tai Parent-ominaisuutta? Nämä ovat mukautettuja funktioita, jotka ovat yleensä yksilöllisiä kullekin objektille. Jos niiden sijainteja v-taulukossa ei voi olettaa, miten funktioiden osoitteet löydetään niiden kutsumista varten?

Vastaus luonnollisesti riippuu siitä, tiedätkö etukäteen, miltä objektin v-taulukko näyttää. Jos tiedät, voit tehdä saman aikaisen sidonnan prosessin objektin mukautetuille menetelmille kuin teit sen IUnknown-menetelmillekin. Tätä tarkoitetaan yleensä, kun puhutaan aikaisesta sidonnasta.

Jos haluat käyttää aikaista sidontaa objektille, sinun on tiedettävä, miltä sen v-taulukko näyttää. Voit tehdä tämän Visual Basicissa lisäämällä viittauksen objektin kuvaavaan tyyppikirjastoon, sen liittymään (v-taulukko) ja kaikkiin funktioihin, jotka objektille voidaan kutsua. Kun tämä on tehty, voit määrittää objektin tietyn tyyppiseksi ja sen jälkeen määrittää objektin ja käyttää sitä v-taulukon avulla. Jos esimerkiksi haluat automatisoida Microsoft Office Excelin käyttämällä aikaista sidontaa, lisäät viittauksen Microsoft Excel 8.0 Object Library -kirjastoon Projekti|Viittaukset-valintaikkunassa ja määrität muuttujan tyypiksi sitten Excel.Application. Tämän jälkeen kaikki objektimuuttujaasi tehdyt kutsut käyttävät aikaista sidontaa:
' Määritä viittaus Microsoft Excel 8.0 Object Library -kirjastoon
' Projekti|Viittaukset-valintaikkunassa (tai Työkalut|Viittaukset, jos käytössä on VB4 tai VBA).

' Määritä objekti aikaisin sidotuksi objektiksi
  Dim oExcel As Excel.Application

  Set oExcel = CreateObject("Excel.Application")

' Visible-ominaisuutta kutsutaan v-taulukon avulla
  oExcel.Visible = True
				
Tämä tapa toimii hyvin useimmissa tapauksissa, mutta mitä jos et tiedä tarkkaa käyttämääsi objektia suunnittelun aikana? Mitä jos sinun esimerkiksi on vaihdettava tietoja useiden Excelin versioiden kanssa tai jopa kokonaan "tuntemattoman" objektin kanssa?

Myöhäinen sidonta

COM sisältää IDispatch-liittymän. IDispatch-liittymää toteuttavilla objekteilla sanotaan olevan dispinterface-liittymä (se on ainoa niiden tukema liittymä) tai kaksoisliittymä (jos niillä on myös mukautettu liittymä, johon voidaan tehdä aikainen sidonta). Asiakkaita, jotka sitovat IDispatch-liittymään, sanotaan myöhään sidottaviksi, koska niiden kutsuma tarkka ominaisuus tai menetelmä määritetään suorituksen aikana käyttämällä niiden etsintään IDispatch-liittymän menetelmiä. Palataan takaisin edellä kerrottuun kirjaesimerkkiin: ajattele sitä alaviitteenä, joka ohjaa sinut takaisin sisällysluetteloon "etsimään" sivunumeron "lukemisen aikana" sen sijaan, että se olisi jo painettu tekstiin.

Tämän liittymän toimintaa ohjaavat funktiot GetIDsOfNames ja Invoke. Ensimmäinen niistä yhdistää funktioiden nimet (merkkijonot) tunnukseen (kutsutaan nimellä dispid), joka edustaa funktiota. Kun tiedät kutsuttavan funktion tunnuksen, voit kutsua sitä Invoke-funktion avulla. Tätä menetelmän kutsumista kutsutaan myöhäiseksi sidonnaksi.

Tapa, jolla määrität objektin sitomistavan Visual Basicissa on tässäkin objektin määrityksen avulla. Jos annat objektimuuttujalle Object-määrityksen, kerrot itse asiassa Visual Basicille, että sen tulee käyttää IDispatch-liittymää eli siten myöhäistä sidontaa:
' Myöhäisen sidonnan käyttäminen ei edellytä viittausta tyyppikirjastoon.
' Kun objekti tukee IDispatch-liittymää, menetelmä voidaan paikantaa 
' dynaamisesti ja kutsua suorituksen aikana.

' Määritä objekti myöhään sidotuksi objektiksi
  Dim oExcel As Object

  Set oExcel = CreateObject("Excel.Application")

' Visible-ominaisuutta kutsutaan IDispatch-liittymän avulla
  oExcel.Visible = True
				
Kuten näet, muu osa koodistasi on sama kuin ennen. Ainoa ero aikaisen ja myöhäisen sidonnan välillä (kirjoittamasi koodin suhteen) on muuttujien määrityksessä.

On tärkeää huomata, että "myöhään sidottu" on kutsuttava funktio eikä sen kutsumistapa. Kuten sitomista yleisesti käsittelevästä aiemmasta keskustelusta kävi ilmi, IDispatch on aikaisin sidottu. Tämä tarkoittaa sitä, että Visual Basic tekee kutsun ja määrittää Visible-ominaisuuden v-taulukon merkinnän (IDispatch::Invoke) avulla samalla tavalla kuin minkä tahansa COM-kutsun yhteydessä. COM-objekti vastaa itse kutsun välittämisestä oikealle funktiolle, jotta Excelistä tehdään näkyvä. Tämä epäsuoruus mahdollistaa Visual Basic -asiakkaan kääntämisen (sitomisen kelvolliseen funktion osoitteeseen) niin, että se ei kuitenkaan tiedä tarkkaa työn tekevää funktiota.

Dispid-sidonta

Jotkin automaatioasiakkaat (etenkin MFC ja Visual Basic 3.0, mutta myös Visual Basic 5.0 ja 6.0 ActiveX-komponenttien suhteen) käyttävät myöhäisen sidonnan yhdistelmämuotoa, jota kutsutaan dispid-sidonnaksi. Jos COM-objekti tunnetaan suunnittelun aikana, kutsuttavien funktioiden dispid-kohteet voidaan kopioida välimuistiin ja välittää suoraan IDispatch::Invoke-funktiolle ilman, että GetIDsOfNames-kutsua tarvitsee tehdä suorituksen aikana. Tämä voi parantaa suorituskykyä huomattavasti, sillä kahden COM-kutsun sijaan tarvitsee tehdä vain yksi kutsu funktiota kohden.

Dispid-sidonta ei ole vaihtoehto, joka voidaan tavallisesti valita Visual Basic 5.0:ssa tai 6.0:ssa. Sitä käytetään objekteille, joihin viitataan tyyppikirjastossa mutta jotka eivät sisällä mukautettua liittymää (eli objekteille, joilla on vain dispinterface), ja ActiveX-koostekomponenteille. Yleensä Visual Basic kuitenkin käyttää aikaista sidontaa kohdissa, joissa yleensä käytettäisiin dispid-sidontaa.

Mitä sidontatapaa tulisi käyttää?

Tämän kysymyksen vastaus riippuu yhtä paljon projektin suunnittelusta kuin muistakin tekijöistä. Microsoft suosittelee aikaista sidontaa lähes kaikissa tapauksissa. Myöhäisen sidonnan valitsemiseen saattaa kuitenkin olla syynsä.

Aikainen sidonta on suositeltu tapa. Sen suorituskyky on paras, koska sovellus sitoo suoraan kutsuttavan funktion osoitteeseen, eikä suorituksenaikaisen etsinnän ylimääräistä vaikutusta suorituskykyyn ole. Yleisen suorituksen nopeuden suhteen se on vähintään kaksi kertaa nopeampi kuin myöhäinen sidonta.

Aikainen sidonta tarjoaa myös tyyppisuojauksen. Kun komponentin tyyppikirjastoon on määritetty viittaus, Visual Basic tarjoaa IntelliSense-tuen, joka auttaa koodaamaan jokaisen funktion oikein. Visual Basic myös varoittaa, jos parametrin tai palautusarvon tietotyyppi on virheellinen, mikä säästää paljon aikaa koodin kirjoittamisessa ja virheenkorjauksessa.

Myöhäisestä sidonnasta on hyötyä tilanteissa, joissa objektin tarkkaa liittymää ei tunneta suunnittelun aikana. Jos sovellus pyrkii vaihtamaan tietoja useiden tuntemattomien palvelinten kanssa tai jos sen on kutsuttava funktioita nimeltä (esimerkiksi Visual Basic 6.0:n CallByName-funktion avulla), sinun on käytettävä myöhäistä sidontaa. Myöhäisestä sidonnasta on hyötyä myös kierrettäessä yhteensopivuusongelmia sellaisen osan eri versioiden välillä, jonka liittymää on muokattu tai sovitettu virheellisesti versioiden välillä.

Aikaisen sidonnan edut tekevät siitä parhaan valinnan aina, kun sitä voidaan käyttää.

Yhteensopivuuden säilyttäminen eri versioiden välillä

Jos käytät osaa, jota et jakele edelleen asennuspaketin mukana, ja et ole varma tarkasta versiosta, jonka kanssa vaihdetaan tietoja suorituksen aikana, kiinnitä erityistä huomiota siihen, että teet aikaisen sidonnan osan jokaisen version kanssa yhteensopivaan liittymään tai (joissakin tapauksissa) käytät myöhäistä sidontaa ja teet kutsun menetelmälle, joka saattaa esiintyä jossakin tietyssä versiossa, ja palautat siististi tilanteessa, jossa menetelmää ei ole asiakasjärjestelmään asennetussa versiossa.

Microsoft Office -sovellukset ovat hyvä esimerkki tällaisista COM-palvelimista. Office-sovellukset laajentavat tavallisesti liittymiään, jotta ne lisäävät uusia toiminta tai korjaavat versioiden välisiä aiempia puutteita. Jos sinun on automatisoitava jokin Office-sovellus, Microsoft suosittelee, että sidot asiakkaan järjestelmässä asennettuna mahdollisesti olevaan tuotteen vanhimpaan versioon. Jos sinun on esimerkiksi pystyttävä automatisoimaan Excel 95, Excel 97, Excel 2000 ja Excel 2002, käytä Excel 95:n tyyppikirjastoa (XL5en32.olb), jotta yhteensopivuus kaikkien näiden versioiden välillä säilyy.

Office-sovellukset myös osoittavat, että suuria kaksoisliittymiä käyttävillä objektimalleilla voi olla rajoituksia pakkaamisessa ja lähettämisessä joissakin ympäristöissä. Käytä IDispatch-liittymää, jotta koodi toimisi parhaiten kaikissa ympäristöissä. Lisätietoja yhteensopivuuden säilyttämisestä työskenneltäessä Office-sovellusten kanssa saat napsauttamalla seuraavaa artikkelin numeroa, jolloin pääset lukemaan artikkelin Microsoft Knowledge Base -tietokannassa:
247579 Office-sovellusten automatisointiin tulee käyttää DISPID-sidontaa aina, kun se on mahdollista (tämä artikkeli saattaa olla englanninkielinen)

Suositukset

Lisätietoja COMista, v-taulukoista ja automatisoinnin käyttämisestä on seuraavissa kirjoissa:
Rogerson, Dale, Inside COM, MSPRESS, ISBN: 1-57231-349-8.

Curland, Matt, Advanced Visual Basic 6, DevelopMentor, 0201707128.

Ominaisuudet

Artikkelin tunnus: 245115 - Viimeisin tarkistus: 23. marraskuuta 2007 - Versio: 7.1
Artikkelin tiedot koskevat seuraavia tuotteita:
  • Microsoft Office Ultimate 2007
  • Microsoft Office Enterprise 2007
  • Microsoft Office Professional 2007
  • Microsoft Office Professional Plus 2007
  • Microsoft Office Standard 2007
  • Microsoft Office Home and Student 2007
  • Microsoft Office Basic 2007
  • Microsoft Office Standard Edition 2003
  • Microsoft Office XP Developer Edition
  • Microsoft Office 2000 Developer Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic 6.0 Enterprise Edition
Hakusanat: 
kbinfo kbautomation KB245115

Anna palautetta

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com