OLE- ja COM-ohjelmoinnin ymmärtäminen

Koko: px
Aloita esitys sivulta:

Download "OLE- ja COM-ohjelmoinnin ymmärtäminen"

Transkriptio

1 OSA VI 599 LUKU LUKU OLE- ja COM-ohjelmoinnin ymmärtäminen Komponenttioliomallin perusteet Oman OLE-automaatio palvelimen luominen OLE-palvelimet ja säilöt

2 600 COM+, COMin seuraava askel Seuraava vaihe COMin kehityksessä tulee olemaan COM+. Microsoftin suunnitelmien mukaan COM+ tulee helpottamaan COM-koodausta siten, että COM-objektit tulevat muistuttamaan C++-olioita ja niitä voidaan luoda C++:n newja delete-avainsanoilla. Visual C++ ei vielä tue COM+:aa, mutta tulevaisuudessa sille lienee saatavilla oma SDK tai Service Pack. Windows 2000 tulee perustumaan COM+:n käyttöön. Sovelluksen tietojen ulkoistaminen Komponenttipohjainen ohjelmointi Kehittyneissä ohjelmointiympäristöissä, kuten Windowsissa, on ohjelmankehitys tullut yhä monimutkaisemmaksi johtuen useista ohjelmointirajapinnoista (API), standardien tarpeesta, versionhallinnasta, kehitystyön nopeudesta ja hajautetusta laskennasta. Tarpeesta yksinkertaistaa tätä kaikkea on saanut alkunsa komponenttiohjelmointitekniikka. Komponentit ovat pieniä ohjelma-alkioita (kuten luokkien instanssit, oliot), jotka suorittavat määrätyn tehtävän hyvin määritettyjen rajapintojen kautta. Toisin kuin oliot, komponentit eivät ole sidoksissa tiettyyn ajossa olevaan ohjelmaan tai edes koneeseen. Komponentteja voidaan kirjoittaa eri ohjelmointikielillä ja ne osaavat kommunikoida rajapintojen kautta myös toisilla ohjelmointikielillä kirjoitettujen komponenttien kanssa. Myös Microsoft on kehittänyt tätä tekniikkaa ja nykyään sen kehittämä komponenttitekniikka tunnetaan nimellä COM (Component Object Model, komponenttiobjektimalli). Olet saattanut tavata tätä sivuavia termejä, kuten OLE (Object Linking and Embedding, objektien linkitys ja upottaminen) sekä ActiveX-kontrollit. Nämä molemmat ovat itse asiassa COM-ohjelmoinnin tiettyjä toteutuksia. Itse COM on kieli- ja laiteriippumaton standardi, joka määrittelee, kuinka oliot kommunikoivat keskenään yhteistä protokollaa käyttäen. Tärkeintä COM-objekteissa ovat niiden liittymät (interface), itse objektit piilottavat toimintansa toteutuksen. Jotta COM-objektin toimintoja voitaisiin hyödyntää, joudutaan sopimaan tarkasti objektin ja sitä käyttävän ohjelman kesken parametrien välityksestä ja tulosten saamisesta. Tämä sopimus asiakasohjelman ja COM-objektin välillä on nimeltään liittymä (interface). Liittymien ympärille voidaan määritellä ja suunnitella kokonaisia ohjelmointirajapintoja (API). Jos olet kirjoittamassa asiakassovellusta, saat sovelluksesi keskustelemaan palvelimelle näiden rajapintojen avulla eikä palvelinohjelmiston valmistajalla ole merkitystä. Vaihtoehtoisesti voit haluta kirjoittaa palvelimen komponentteja, jotka toimivat liittymän määritysten mukaisesti, ja myydä niitä vaihtoehtona kilpailijoiden toteutuksille. Hyvä esimerkki COMin käytöstä on MAPI (Messaging API, sanomanvälitys-api). Kuka tahansa saa kirjoittaa COM-objekteja, jotka

3 suorittavat tähän liittyviä tehtäviä, kuten sanomien tallentamista, siirtämistä ja vastaanottajien luetteloimista osoitekirjaan. Eräs esimerkki näistä palvelinkomponenteista on Microsoft Exchange, mutta muitakin on. Varsinainen toteutuskoodi saattaa poiketa rajustikin eri toteutusten välillä, mutta tärkeintä on, että kaikki COM-objektit toimivat saman liittymämäärityksen mukaan. Näin kaikki näiden palveluiden asiakasohjelmat, kuten Microsoft Outlook, voivat käyttää kaikkien valmistajien MAPI-komponentteja sanomiensa lähettämiseen, vastaanottamiseen ja tallentamiseen. Aivan samoin kukin ohjelmistotoimittaja voi tarjota oman Exchangea tai muita palvelinkomponentteja käyttävän asiakasohjelmansa (kuten monet tekevätkin) tietämättä edes kenen komponentteja käyttävät. Ainoa vaatimus asiakas- ja palvelinkomponenteille on, että ne kutsuvat toisiaan näiden sovittujen liittymämäärittelyjen mukaisesti (eli MAPIn). OSA VI LUKU KATSO MYÖS ActiveX-kontrollien käyttö omassa sovelluksessa, luvusta 9. ActiveX-kontrollien luominen luvussa 26. Lisätietoja MAPIsta luvussa 28. COM-liittymät Liittymä (interface) on määrittely funktiojoukolle ja niiden parametreille. Kaikilla COM-objekteilla on vähintään yksi liittymä ja useilla niitä on monia ja kullakin liittymällä on oma funktiojoukkonsa. Voit kirjoittaa COM-objekteja millä tahansa näitä liittymiä tukevalla kielellä. Toiset kielet sopivat tarkoitukseen tietenkin paremmin kuin toiset. Esimerkiksi Java toimii hyvin, koska kullakin Java-oliolla voi olla useita liittymiä ja se saadaan liitetyksi luonnollisesti COMobjekteihin. COM-objekti toteuttaa varsinaisen liittymän alla olevan koodin, joten ohjelma, joka kutsuu liittymässä olevaa funktiota löytää myös sen toteutuksen, joka suorittaa tietyssä liittymässä määritetylle funktiolle annetun tehtävän. Karkeasti ajatellen COM-liittymän rakenne on suunnilleen samanlainen kuin Visual C++:n virtuaalifunktioiden taulukkorakenne. Voit siis käyttää virtuaalifunktiotaulukkomekanismia COM-liittymien määrittelyyn ja toteutukseen. Tavallisesti virtuaalifunktiot korvataan kantaluokasta johdetulla funktiolla (kun kantaluokan määrittelyssä on käytetty virtual-avainsanaa). Tämän tehdessäsi määritellään tuohon luokkaan liittyvä virtuaalifunktiotaulukko vtable. Liittymien nimeäminen COM-liittymät nimetään monien muiden asioiden tavoin toimintansa mukaan. Yleensä niiden etuliitteeksi on tapana merkitä I. Tällaisia liittymiä ovat esimerkiksi IUnknown, IDispatch, IMoniker ja IMessageFilter.

4 602 Virtuaalifunktiotaulukot Jokaisen muistissa olevan C++-olioilmentymän liitteenä on olion virtuaalifunktiotaulukko (vaikka joskus tämä onkin tyhjä ja ilman alkioita). Jokaisessa taulukon alkiossa on osoitin virtuaalifunktion toteuttavaan koodiin. Aina kun jotain olion virtuaalifunktioista kutsutaan, taulukosta löytyy oikea osoite joko kantaluokan tai johdetun luokan funktiolle. Sovelluksen tietojen ulkoistaminen Pelkkiä virtuaalifunktioita sisältävän C++-luokan määritteleminen on mahdollista. Tällaista luokkaa kutsutaan abstraktiksi kantaluokaksi. Abstraktista kantaluokasta ei voida muodostaa luokan instansseja eli olioita, mutta siitä voidaan silti luoda C++-yhteensopivia COMliittymämäärittelyjä, jotka näyttävät esimerkiksi seuraavilta: class IUnknown { public: virtual HRESULT QueryInterface(REFIID riid, LPVOID FAR* ppvobj)=0; virtual ULONG AddRef()=0; virtual ULONG Release()=0; } Microsoft tarjoaa nämä määrittelyt kaikkien toimittamiensa COMobjektien liittymiin, vaikka saatatkin nähdä funktiot piilotettuina samanlaisiksi laajentuviin makroihin: STDMETHOD(QueryInterface)(THIS_REFIID riid, LPVOID FAR* ppvobj) PURE; STDMETHOD_(ULONG, AddRef)(THIS) PURE; STDMETHOD_(ULONG, Release)(THIS) PURE; Kaikkien COM-objektien tulee toteuttaa näistä kolmesta metodista (funktiosta) koostuva IUnknown-liittymä ja kaikkien liittymien tulee toteuttaa nämä kolme funktiota ennen omien funktioiden määrittelyä. Funktioiden rooli on seuraava: AddRef() Asiakkaan saadessa osoittimen liittymään kasvatetaan sisäistä viittauslukua edustamaan aktiivisten asiakasviittausten määrää. Release() Asiakkaan julkistaessa osoittimen liittymään pienennetään sisäistä viittauslukua yhdellä ja luvun nollautuessa objekti tuhotaan (objekti tekee tämän usein itse). QueryInterface() Asiakas, jolla on osoitin yhteen liittymään, voi pyytää osoitinta toiseen COM-liittymään antamalla vaaditun liittymän ID-tunnuksen (edellisessä esimerkissä riid). Jos pyydetty liittymä on olemassa, AddRef()-funktiota kutsutaan pyydetyn liittymän osoittimella ja se palauttaa ppvobj-osoittimen. Pyydetyn liittymän ID-tunnus (riid) selitetään tarkemmin seuraavassa kappaleessa. Koska jokainen liittymä takuulla toteuttaa nämä yhteiset funktiot, voit

5 OSA VI LUKU kirjoitta asiakasohjelman, joka pyytää COM-objektin instanssia (mikä automaattisesti kutsuu AddRef()-funktiota). Tutki objektin liittymiä QueryInterface():n avulla. Kun olet valmis, kutsu kunkin saamasi liittymäosoittimen Release()-funktiota antaaksesi objektin tuhota itsensä (mikäli kukaan muu ei sitä käytä). Tämä sama funktio toimii aivan samoin kaikille COM-objekteille. Vastaavasti jos teet itse COM-objektin, joudut toteuttamaan siihen viittausten määrän laskennan sekä osoittimen palauttamisen haluttuun liittymään (tai NULL, ellei sellaista ole). Jos liittymä tukisi ainoastaan näitä kolmea funktiota, se olisi varsin hyödytön, joten tavallisesti kehittyneemmät liittymät saavat tämän määrittelyn perintönä ja määritelevät siihen lisäksi omia, käyttökelpoisia liittymiään. vtablen taustalla olevan koodin toteuttamiseen on useita tapoja. Yksinkertaisinta lienee periä oikea C++-luokka (siis ei abstrakti) liittymän määrittelyluokasta ja toteuttaa tarvittavat metodit tähän johdettuun luokkaan. Muistin vapauttaminen COM-objekteissa Koska COM-objekti vastaa itse siihen viittaavien objektien lukumäärän hallinnasta, se joutuu myös vapauttamaan käyttämänsä muistin, kun kaikki sen käyttäjät (asiakkaat) ovat vapauttaneet sen ja viittausluku on nollautunut. Muistia voidaan vapauttaa tuhoamalla C++:n this-osoitin, mikä saa aikaan kutsuvan objektin muistin tuhoamisen. Objektin tuhottua itsensä sen tulee palata viimeisestä funktiosta ilman lisäprosessointia. On oltava tarkkana siinä, ettei objektin jäsenmuuttujia yritetä käyttää, koska objekti ei enää omista muuttujien käyttämää muistia. Liittymän ja luokan ID-tunnukset sekä GUIDtunnukset Kuten aiemmasta kappaleesta huomasit, QueryInterace()-funktio palauttaa osoittimen toiseen COM-objektissa käytössä olevaan liittymään, kunhan annat sille parametrinä halutun liittymän ID-tunnuksen. Kullakin liittymällä on oma ID-tunnuksensa (IID), kuten kaikilla COM-luokillakin (CLSID). Nämä tunnukset ovat 128-bittisiä lukuja, jotka ovat varmasti jokaiselle COM-objektille ja liittymälle yksilöllisiä maailmanlaajuisesti. Tunnuksia kutsutaan GUID:ksi (globally unique ID). Kun kirjoitat uuden COM-objektin tai määrittelet uuden liittymän, voit tehdä näitä lukuja guidgen.exe ohjelmalla. Löydät ohjelman..\visual Studio\VC98\Tools\Bin\-hakemistosta. Ohjelman ajaessasi se luo uuden GUID-tunnuksen ja antaa mahdollisuuden ilmaista sen neljällä eri tavalla (kuva 25.1). Valitset vain tarkoitukseesi sopivan muodon ja kopioit luvun leikepöydälle Copy-painikkeella. Jos napautat New GUID painiketta, guidgen.exe tekee toisen GUID-tunnuksen. Kahta samanlaista numeroa ei tällä ohjelmalla synny ellet ole erityisen pitkäikäinen. Guidgen.exe-ohjelman löytäminen ja käyttäminen Olet saattanut huomata, että guidgen.exe-ohjelman sijainti vaihtelee riippuen Visual C++kääntäjän versioista. Ohjelman paikantaminen onnistuu helposti Käynnistä-valikon Etsi / Tiedostot ja Kansiot -komennolla (Start/ Find/Files and Folders). Ohjelman löydyttyä (esimerkiksi Visual Studio -hakemiston Common\Tools -hakemistosta) voit lisätä sen Visual Studion Tools-valikkoon valitsemalla Tools-valikosta Customizekomennon ja valitsemalla Customize-valintaikkunasta Tools-välilehden ja lisäämällä guidgen.exen työkaluluetteloon.

6 604 Sovelluksen tietojen ulkoistaminen KUVA 25.1 Guidgen.exe-ohjelma tekee uuden maailmanlaajuisesti yksilöllisen tunnusluvun. Tyypillinen GUID-tunnus näyttää tältä Registry-muotoiltuna: {0793B920-CF75-11d A12AF9} Saatat nähdä saman luvun eri tavoin koodattuna käyttötarkoituksesta riippuen. Esimerkiksi C++-koodissa sama luku kirjoitettaisiin: 128-bittisten numeroiden lukualue 128-bittisillä luvuilla voidaan esittää kokonaislukuarvoja nollasta yli :n! // {0793B920-CF75-11d A12AF9} DEFINE_GUID(<<name>>, 0x0793B920, 0xcf75, 0x11d1, 0x86, 0x47,0x0, 0x40, 0x95, 0xa1, 0x2a, 0xf9); Yleensä 128-bittisen luvun muistaminen ei ole helppoa, joten liittymille ja luokille on tapana antaa kutsumanimiä. Esimerkiksi IUnknown-liittymä tunnettaisiin nimellä IID_Unknown ja nämä nimet voitaisiin liittää 128-bittiseen lukuun DEFINE_GUID-makrolla ja näin tuottaa staattinen QueryInterace()-funktiolle liittymän IDtunnuksena syötettävä tietorakenne. Esimerkiksi seuraava koodi asettaa IID_IDirectDraw2-liittymän osoittimen pidd2 olemassa olevan pidraw direct draw olio-osoittimen mukaan: IDirectDraw2* pidd2 = NULL; HRESULT hr = pidraw- >QueryInterface(IID_IDirectDraw2, (LPVOID *) &pidd2); (Tässä DirectDraw on ainoastaan esimerkki COM-objektista. Lisätietoja Direct Draw:sta löydät halutessasi luvusta 28). Kaikkien COM-luokkien etuliitteenä on CLSID. IID_IDirectDraw2- liittymän toteuttava DirectDraw-olio saataisi olla nimetty CLSID_DirectDraw:ksi.

7 Pohjimmiltaan sekä liittymän että luokan ID-tunnukset ovat kuitenkin GUID-tunnuksia ja vastaavat numeeriset arvot löytyvät näin määritellystä DRAW.h header-tiedostosta: DEFINE_GUID( CLSID_DirectDraw, 0xD7B70EE0, 0x4340, 0x11CF, 0xB0, 0x63,0x00, 0x20, 0xAF, 0xC2, 0xCD, 0x35); DEFINE_GUID( IID_IDirectDraw2, 0xB3A6F3E0, 0x2B43, 0x11CF, 0xA2, 0xDE,0x00, 0xAA, 0x00, 0xB9, 0x33, 0x56); KATSO MYÖS Esimerkki DirectDraw:n ja CoCreateInstance():n käytöstä ja lisätietoja DirectDraw:sta luvussa 28. OSA VI LUKU COM-objektien ilmentymien luominen Kun luot ilmentymän COM-objektista, käynnistyy palvelinprosessi sen ylläpitämiseksi. Palvelinprosessi voi olla oma asiakasohjelmasi, liitetty DLL-kirjasto, paikallisessa koneessa oleva exe-tiedosto tai etäkoneessa oleva ohjelma. Näitä tapauksia kutsutaan suoritusympäristöiksi (konteksteiksi) ja eri vaihtoehdot on esitetty taulukossa TAULUKKO 25.1 COM-koodin suoritusympäristöt Suoritusympäristö Lippu Kuvaus Inproc Server CLSCTX_INPROC_SERVER Koodia ajetaan samassa prosessissa kuin sitä kutsuvaa asiakashjelmaakin. Local Server CLSCTX_LOCAL_SERVER Koodia ajetaan toisessa Exe-ohjelmassa eri proses sissa, mutta samassa koneessa kuin kutsuva ohjelma. Remote Server CLSCTX_REMOTE_SERVER Koodia ajetaan täysin eri koneessa kuin kutsuvaa ohjelmaa. Luokan CLSID-tunnus liitetään COM-objektiin pyydettäessä luovaan ja ylläpitävään.dll- tai.exe-ohjelmaan Windowsin järjestelmärekisterin avulla. Kaikki järjestelmään rekisteröidyt COM-luokat on järjestetty rekisteriin HKEY_CLASSES_ROOT\CLSID avaimen alle GUIDmukaan. Kaikilla on sitten avainalkio rekisteröityjen palvelintyyppien

8 606 Sovelluksen tietojen ulkoistaminen mukaan InprocServer32, LocalServer32 tai RemoteServer32 (tai muutama muu). Näiden rekisteriavaimien alta näet luokan luovan ja sitä ylläpitävän.dll- tai.exe-tiedoston nimen. Esimerkiksi kuvassa 25.2 rekisterieditorissa on esitetty DirectDrawolion CLSID-tunnus ja sen samassa prosessissa käsittelijä DLL, ddraw.dll. KUVA 25.2 Rekisterieditori esittää CLSIDtiedot. Objektien luominen etäkoneessa Jotta voisit luoda objekteja etätietokoneissa, joudut käyttämään CoCreateInstanceEx()-funktiota. Tämä hyödyntää DCOMjärjestelmää (Distributed COM, hajautettu COM), joka mahdollistaa tiedonsiirron verkon tietokoneiden välillä etäproseduurikutsuja (RPC) käyttäen. Asiakaskoneet tulee konfiguroida DCOMCNFG.EXEohjelmalla näiden COMetäpalvelimien rekisteröimiseksi. Nämä palvelimet toteuttavat erikois-com-objektin nimeltä Class Object (luokkaobjekti). Nämä objektit ovat muuten tavallisten COMobjektien kaltaisia, paitsi että ne toteuttavat IClassFactoryliittymän. Kutsumalla tämän liittymän CreateInstance()-funktiota voidaan luoda halutun tyyppinen luokka. Tavallisesti tämä tehdään COM-kirjaston CoCreateInstance()-funktiolla yhden ilmentymän luomiseksi tai CoGetClassObject()-funktiolla osoittimen saamiseksi class factory objektiin. Näitä luokkatehtaita tulisi oikeastaan kutsua objektitehtaiksi, koska ne tekevät objekteja, eivät luokkia. (Luokkia tekevät ohjelmoijat!) CoCreateInstance() määritellään seuraavasti: STDAPI CoCreateInstance(REFCLSID rclsid, LPUNKNOWN punkouter, DWORD dwclscontext, REFIID riid, LPVOID* ppv); Ensimmäinen parametri rclsid on viittaus luotavan luokan CLSIDluokkatunnukseen. Toisena parametrinä (punkother) annetaan yleensä NULL - parametrin käyttö liittyy tavallisesti aggregaatio-nimiseen edistyneeseen COM-tekniikkaan. Halutun palvelintyypin määrittelevän dwclscontext-parametrin arvoksi annetaan yleensä CLSCTX_SERVER, joka on itse asiassa yhdistelmä tietyistä taulukon 25.1 lipuista. Neljäs parametri riid on viittaus uuden COM-objektisi halutun liittymän GUID-tunnukseen ja viimeinen, ppv, on osoitin siihen asiakasohjelman liittymäosoittimeen, joka vastaanottaa uuden objektin annetun liittymän osoittimen. Jos esimekiksi halutaan luoda ilmentymä DirectDraw-objektista ja vastaanottaa osoitin IDirectDraw2-liittymään, koodi olisi seuraavanlainen:

9 OSA VI LUKU IDirectDraw2* pidirectdraw2 = NULL; HRESULT hr = CoCreateInstance(&CLSID_DirectDraw, NULL, CLSCTX_ALL, &IID_IDirectDraw2,, (void**)&pidiecctdraw2); Jos funktio onnistuu, luodaan uusi DirectDraw-objekti ja pidirectdraw2 osoittaa uuden COM-objektin IDirectDraw2- liittymään. Proxy-DLL:t ja parametrien hallinta Kun asiakasohjelmasi saa osoittimen COM-objektin liittymään, sitä ei erityisesti kiinnosta varsinaisen objektin sijainti. Jos COM-objektia kuitenkin ajetaan oman prosessisi ulkopuolella, osoitin ei voi osoittaa suoraan liittymän funktioiden vtable-taulukkoon. Suoraan osoittamisen sijaan luodaan prosessiisi tynkäfunktio, joka näyttää asiakasohjelmallesi paikalliselta liittymäosoittimelta. Kun sitten kutsut funktioita tuon liittymäosoittimen avulla, pinnan alla suorittaa proxy- DLL-kirjasto asiakasohjelmasi ja COM-objektin linkittämisen. Jokainen liittymä myös rekisteröidään Windowsin Järjestelmärekisteriin HKEY_CLASSES_ROOT\Interface avaimen alle GUIDtunnuksen mukaan. Nämä alkiot tallettavat sitten varsinaiset avaimet, kuten ProxystubClsid32, jossa on liittymän funktioita hallitsevan proxy-dll-tiedoston sijainti. Proxy-DLL vastaa parametrien sovittamisesta laiteriippumattomaan muotoon siirtämistä varten. Sen jälkeen saatetaan käyttää etäproseduurikutsua (RPC) etäkoneen COMobjektin funktion kutsumiseksi. Proxy-DLL:iä voidaan tehdä automaattisesti kirjoittamalla määrittelyt IDL-kielellä (Interface Definition Language) ja syöttämällä ne Microsoftin IDL-kääntäjälle (MIDL). Kääntäjä generoi tarpeelliset RPC- ja objektinhallintakoodit proxy- DLL:iin liitettäviksi. Proxy-DLL:ien jakeleminen Jos käsittelet parametrejä eri koneiden välillä DCOMilla, joudut varmistamaan, että proxy- DLL:stä on samat versiot sekä asiakas- että palvelinkoneissa. Liittymien versiointi Vanha ongelma ohjelmistoversioiden hallinnasta saadaan hoidettua yksinkertaisella säännöllä. Sen jälkeen, kun olet julkistanut COMobjektisi suuren yleisön tietoisuuteen, joudut jäädyttämään sen liittymät samanlaisiksi myös tuleviin versioihin. Eli tulevien COMversioiden tulee lisätoimintoja halutessaan lisätä uusia liittymiä ja jättää vanhat ennalleen. Vanhat asiakasohjelmat, jotka eivät tunne muita kuin vanhat liittymät, käyttävät niitä, kun taas uudet voivat pyytää uudempia liittymiä. Uusien liittymien vakiintunut nimeämistekniikka lisää versionumeron

10 608 Sovelluksen tietojen ulkoistaminen liittymän nimen perään. Jos esimerkiksi alkuperäinen IClassFactoryliittymä on päivitetty lisenssien käyttöä tukevaksi, voivat luokkatehtaat toteuttaa ylimääräisenä metodina liittymän IClassFactory2. Asiakasohjelmat voivat siten pyytää käyttöön liittymää IClassFactory ja hakea kehittyneemmän liittymän IClassFactory2 käyttöön QueryInterface()-funktiolla. Ellei COM-luokan factory-olio tarjoa tätä liittymää, QueryInterface() asettaa liittymäosoittimeksi NULL ja palauttaa S_FALSE-koodin. Koska ainoastaan liittymän määrittelyllä on merkitystä, uuden liittymän toteutuskoodissa voidaan vapaasti käyttää vanhasta versiosta muuttumattomien funktioiden koodia. Microsoft Word: automaatiopalvelin Jos koneeseesi on asennettu Microsoft Outlook ja Microsoft Word, saatat huomata Outlookilla sähköpostiviestiä kirjoittaessasi, että Outlookissa toimivat saman kieliasun tarkistustoiminnot kuin Wordissa. Tämä on esimerkki Wordin toimimisesta automaatiopalvelimena Outlookille. Kieliasun tarkistuksen tekee siis Word toimien näkymättömänä ja Outlookin käynnistämänä taustalla. OLE-automaatio Alkuaan OLE-termi (Object Linking and Embedding) kuvasi eri objektityyppien lisäämistä toisentyyppisten objektien dokumentteihin, esimerkiksi Excel-laskentataulukon lisääminen Word-dokumenttiin. Linkitystä ja upottamista (embedding) tukevat dokumentit (asiakirjat) ovat ns. yhdistelmädokumentteja (compound document). Useassa sovelluksessa Lisää-valikosta löytyy Objekti-komento (Insert/Object). Tätä komentoa tukevat sovellukset käyttävät yhdistelmädokumentteja, joihin voit lisätä objekteja rekisteröityjen OLE-palvelimien luettelosta. Lisätyt objektit voidaan upottaa dokumenttiin eli tallentaa sen mukana, tai linkittää, jolloin dokumenttiin lisätään viittaus toiseen tiedostoon (moniker). Tämä kaksi toimintoa antavat juuri nimen OLElle. Termi on kuitenkin laajentunut kattamaan myös OLE vedä ja pudota toiminnon ja OLE-automaation, jolloin ohjelma voi suorittaa funktioita toisesta ohjelmasta käyttäjän huomaamatta toisen ohjelman olemassaoloa. Dispatch-liittymä Automaatio-ominaisuudet pohjaavat erään COM-objektin pääliittymän, IDispatch-liittymän, määrittelyyn. COM-objekti, joka tarjoaa dispatch-liittymän, sisältää taulukon nimetyistä metodeista (funktioista), tapahtumista (funktioista, jotka rekisteröivät itsensä kutsuttaviksi tietyissä tilanteissa) ja ominaisuuksista (funktioista, jotka hakevat tai asettavat COM-objektin erikoismuuttujia). Asiakasohjelma voi käsitellä tällaista tietoa dynaamisesti (ns. myöhäinen sidonta) ajon

11 OSA VI LUKU aikana ja selvittää automaatio-objektin tietoja. IDispatch-liittymä laajentaa IUnknown-liittymää näillä neljällä funktiolla: GetTypeInfoCount() Kertoo asiakasohjelmalle, onko tyyppitietoa tarjolla. GetTypeInfo() Hakee tyyppitiedot. GetIDsOfNames() Palauttaa joukon taulukon indeksejä (Dispatch ID:t), jotka vastaavat pyydettyjen metodien, tapahtumien tai ominaisuuksien nimiä. Invoke() Kutsuu jotain dispatch-taulukon funktiota välittäen parametrinä dispatch ID:n ja muita VARIANT-tyyppisiä parametrejä ja palauttaa tuloksen VARIANT-tyyppisenä (VARIANTtietotyypistä lisää seuraavassa kappaleessa). - IDispatch-liittymää käyttävät paljon monet OLE-toiminnot, kuten ActiveX-kontrollit, OLE-dokumentit ja Visual Basic Scripting. Funktioiden hakeminen ajon aikana taulukosta on toki paljon hitaampaa kuin liittymän metodien kutsuminen suoraan, mutta se tekee järjestelmästä joustavamman. Kokonaisia tyyppitietokirjastoja voidaan helposti tuottaa.tlb-tiedostoiksi ja näitä käyttäen Visual C++ voi muodostaa nopeasti runkoluokat (dispatch drivers). Näitä voidaan kutsua metodeilla, jotka näyttävät aivan automaatio-objektin paikallisilta metodeilta. Nämä runkoluokat hyväksyvät oikeat parametrit, muuttavat ne VARIANT-taulukoksi ja kutsuvat Invoke()-funktiota oikean OLE-automaatio-objektin kutsumiseksi. VARIANT-tyyppisten arvojen käyttö Koska yhtä ainoaa Invoke()-funktiota kutsutaan monenlaisten OLEautomaatio-objektin funktioiden kutsumiseksi, sen on kyettävä välittämään hyvin monenlaisia parametrejä eri kutsuttaville funktioille. Tämä tehdään välittämällä parametrinä DISPPARAMS-tietorakenne, joka osoittaa VARIANT-tietorakenteiden taulukkoon. VARIANT-tietorakenne on käytännössä C++:n unioni eri OLE:n hallitsemista tietotyypeistä. Siinä on myös VARTYPE-tyyppilippu nimeltään vt, joka kertoo, mitä tietotyyppiä käytetään. Taulukossa 25.2 on esitetty osa VARIANT-tietorakenteen hallitsemista tietotyypeistä. VARIANTissa voi olla myös osoitin kuhunkin objektiin, mikä ilmaistaan nimen eteen lisätyllä p-kirjaimella (esim. plval) ja lisäämällä tyyppilippuun VT_BYREF (esim. VT_I4 VT_BYREF). Kaksoisliittymät Saatat törmätä dual interface - termiin (kaksoisliittymä) COMin ja OLEn yhteydessä. COM-objekti voi tukea kaksoisliittymiä tarjoamalla pääsyn liittymänsä toimintoihin suoran COMliittymän ja dispatch-liittymän kautta. Tämä tarjoaa asiakasohjelmalle molempien tapojen parhaat puolet: nopeat C++ohjelmat pääsevät objektiin käsiksi suoraan nopean suoran COM-liittymän kautta ja Visual Basic ja skriptikielet hitaamman dispatch-liittymän kautta. Variant-taulukoiden välittäminen Voit välittää kokonaisia varianttaulukoita OLE-funktioille COleSafeArray-luokan avulla. Tämä luokka sallii elementtien tyypin ja määrän sekä taulukon dimensioiden määrittämisen, jolloin yhdellä kutsulla voidaan syöttää suuria tietolohkoja. Yksityiskohtia COleSafeArrayluokan käytöstä löydät Microsoftin vakiodokumentoinnista.

12 610 Sovelluksen tietojen ulkoistaminen TAULUKKO 25.2 Osa variant-tietotyypeistä Tietotyyppi Nimi Tyyppilippu Kuvaus unsigned char bval VT_UI1 Yksitavuinen etumerkitön arvo short ival VT_I2 Kaksitavuinen etumerkillinen arvo long lval VT_I4 Nelitavuinen etumerkillinen arvo float fltval VT_R4 Nelitavuinen liukuluku double dblval VT_R8 Kahdeksantavuinen liukuluku BOOL boolval VT_BOOL Nelitavuinen TRUE- tai FALSE-arvo SCODE scode VT_ERROR COM-virhekoodi DATE date VT_DATE COleDateTime-yhteen sopiva liukulukuarvo BSTR bstrval VT_BSTR Visual Basic yhteensopiva merkkijono, joka voidaan muuntaa CStringiksi tai CStringistä IUnknown punkval VT_UNKNOWN Osoitin IUnknownliittymään IDispatch pdispval VT_DISPATCH Osoitin IDispatchliittymään Variantin tietotyypit eivät riipu ohjelmointikielestä ja niitä ymmärtää jokainen OLE-yhteensopiva kieli. BSTR:n (Visual Basic yhteensopiva) ja MFC CString-oliota muunnettaessa voit käyttää CStringin AllocateSysString() ja SetSysString()-funktioita, jotka varaavat uuden BSTR:n ja asettavat olemassa olevan BSTR:n CStringin sisällön mukaiseksi. Käänteisesti muunnettaessa käytetään tyyppimuunnosoperaattoria (char*) tai (const char*) muuttamaan BSTR-merkkijono nollaan päättyväksi merkkijonoksi. COleDateTimehyväksyy myös VARIANT-tietorakenteen suoraan muodostimen parametrinä tai siitä (DATE)-tyyppimuunnoksella

13 irrotetun DATE-tyypin. Variant-tyypit eivät ole varatut ainoastaan IDispatch-liittymälle, vaan niitä käytetään OLEssa useissa paikoissa, kun tarvitaan useantyyppisen tiedon tallentamista ja siirtämistä. OSA VI LUKU Automaatiopalvelimen luominen Useat sovellukset ovat sellaisenaankin jo automaatiopalvelimia (kuten Word, Excel tai Visual Studio). Nämä tarjoavat asiakasohjelmalle IDispatch-liittymän, jolla sovelluksen funktioita, kuten oikeinkirjoitusta, voidaan kutsua. VB Scripting (Visual Basic Scripting) -makrotyökalu käyttää näitä metodeja automaatiopalvelindokumenttien luomiseen ja muokkaamiseen. Aina kun kirjoitat makron jollekin näistä ohjelmista, kirjoitat oikeastaan rajattua Visual Basicia, joka osaa kutsua funktioita kunkin automaatiopalvelimen IDispatch-liittymästä käsin. Automaatiopalvelimiin liitetään yleensä luettava nimi, jonka avulla niiden CLSID-luokkatunnus on löydettävissä. Nämä nimet tallennetaan Järjestelmärekisteriin HKEY_CLASSES_ROOT-avaimen alle ja niillä on automaatiopalvelimen CLSID-tunnukseen viittaavat aliavaimet. Esimerkiksi Microsoft Visual Studiolla on seuraava alkio Järjestelmärekisterissä ja vastaava CLSID-tunnus: HKEY_CLASSES_ROOT\MSDEV.APPLICATION\CLSID = {FB7FDAE2-89B8-11CF-9BE8-00A0C90A632C} Asiakas voi hakea tämän numeerisen arvon syöttämällä CLSIDFromString()-funktiolle selväkielisen merkkijonon (MSDEV.APPLICATION), joka palauttaa osoittimen numeerisen CLSIDarvon (FB7FDAE2-89B8-11CF-9BE8-00A0C90A632C) sisältävään tietorakenteeseen. Tämän jälkeen asiakasohjelma voi luoda taustalla näkymättömänä ajettavan Developer Studion ilmentymän CoCreateInstance()- funktiolla pyytäen osoitinta sen IDispatch-liittymään. Automaatiopalvelimen.exe-ohjelmat voidaan käynnistää /Automation-komentorivilipulla, jolloin niiden ikkunoita ei näytetä. Tässä tilassa ajettaessa palvelimen kanssa kommunikoidaan IDispatch-liittymän avulla. Muun muassa Word, Excel ja monet muut automaatiopalvelimet toimivat näin, jolloin asiakasohjelmat voivat käyttää hyväksi niiden toimintoja käyttäjän tietämättä mitään ohjelmien välisestä tiedonsiirrosta. Ajossa olevien objektien taulukko Ajossa olevat automaatiopalvelimet rekisteröivät itsensä yleensä Running Object Table - taulukkoon (ROT), jotta automaatioasiakkaat voisivat kytkeytyä ajossa olevaan ilmentymään. Tämä rekisteröinti tehdään moniker-nimisen mekanismin avulla, jolla voidaan antaa tunniste ohjelmalle, yhdistelmädokumenteille tai tietolohkoille. Nämä rekisteröidyt ajossa olevat objektit saadaan selville...\microsoft Visual Studio\Common\Tools\IRotview.exeohjelmalla. IRotview-ohjelmaa ajettaessa näytetään ajossa olevat (ja rekisteröidyt) objektit. Esimerkiksi Visual Studio rekisteröi CLSID-luokkatunnuksensa monikeriksi!(fb7fdae2-89b8-11cf-9be8-00a0c90a632c). Jos lataat Microsoft Word -dokumentin, näet dokumentin nimen rekisteröityneenä ROTtaulukossa.

14 612 Sovelluksen tietojen ulkoistaminen Voit luoda sovellusrungon omalle automaatiopalvelimellesi AppWizardilla valitsemalla Automation-asetukset AppWizardin vaiheessa Step 3 (kuva 25.3). KUVA 25.3 Automaatiotuen lisääminen AppWizardilla. Kun luot automaatiosovellusrunkoprojektin, huomaat parin ylimääräisen tiedoston ilmestyvän mukaan. Toinen näistä on.reg, jossa on uuden automaatiopalvelimen vaatimat rekisterilisäykset. Tarvitset tätä tiedostoa ainoastaan, jos aiot asentaa automaatiopalvelimesi toiseen koneeseen asennusohjelmalla. Palvelinohjelmasi tekee kyllä lisäykset Järjestelmärekisteriin automaattisesti, kun ajat sen ilman /Automation-lippua. AppWizard valitsee dokumentillesi automaattisesti uuden CLSID:n GUID-tunnuksen, jonka näet halutessasi.reg-tiedostosta. Jos esimerkiksi luot automaatiopalvelimen sovellusrungon nimeltään Autoserver, generoidaan seuraavat Järjestelmärekisteriin lisättävät alkiot.regtiedostoon: HKEY_CLASSES_ROOT\Autoserver.Document = Autose Document HKEY_CLASSES_ROOT\Autoserver.Document\CLSID = {D11ED783-CFD8-11D1-931D } HKEY_CLASSES_ROOT\Autoserver.Document\CLSID\{D11ED783- CFD8-11D1-931D } = Autose Document HKEY_CLASSES_ROOT\Autoserver.Document\CLSID\{D11ED783- CFD8-11D1-931D }\ProgId = Autoserver.Document HKEY_CLASSES_ROOT\Autoserver.Document\CLSID\{D11ED783- CFD8-11D1-931D }\LocalServer32 = AUTOSERVER.EXE

15 OSA VI LUKU Toinen lisätiedosto on.odl-tiedosto. Tässä sijaitsee odl-kielinen (Object Definition Language, objektin kuvauskieli) kuvaus, jonka mukaan uudelle automaatiopalvelimelle tehdään tyyppikirjasto. Kun lisäät automaatiopalvelimeesi uusia metodeja tai ominaisuuksia, kirjoitetaan tähän tiedostoon uusia alkioita kuvaamaan funktioiden parametrejä. Et joudu huolehtimaan tämän tiedoston ylläpidosta tai kääntämisestä, vaan tiedostoa päivittää ClassWizard ja se käännetään automaattisesti aina projektia käännettäessä. Listauksessa 25.1 on esimerkki Autoserver-automaatiopalvelimen.odltiedostosta. Palvelimella on ainoastaan yksi metodi, SquareRoot(), joka on määritelty IAutoserver-nimisessä dispatch-liittymässä, rivillä 24. Koko liittymän määrittely on esitetty riveillä Tässä esitetty Autoserver-esimerkki toteuttaa SquareRoot()-metodin, joka palauttaa double-tyyppisen syöttöparametrin double-tyyppistä neliöjuurta kuvaavan arvon. LISTAUS 25.1 LST25_1.CPP Autoserver-nimisen yhden metodin sisältävän automaatiopalvelimen odl-tiedosto MkTypLib- ja MIDLtyyppikirjastot Aiemmin objektien tyyppikirjastot käännettiin odl-tiedostoista MkTypLib-työkalulla. Vastaavasti liittymien idl-tiedostoissa määriteltiin liittymät, muttei kyetty luomaan tyyppikirjastoja. Microsoft on järkeistänyt tilannetta lisäämällä idltiedostoihin tyyppimääritysominaisuudet. Uusi Microsoftin IDL-kääntäjä (MIDL) osaa kääntää sekä.idlettä.odl-tiedostoja (ja MkTypLibohjelmaa ei enää tarvita). Ja vaikka.odl-tiedostoja yhä käytetään, ne eivät ole välttämättömiä tyyppikirjastojen luonnille, koska vaaditut määrittelyt voidaan tehdä.idltiedostoihinkin. 1 // autoserver.odl : type library source for autoserver.exe 2 // This file will be processed by the MIDL compiler to 3 // produce the type library (autoserver.tlb). 4 [ uuid(d11ed784-cfd8-11d1-931d ), version(1.0) ] 5 library Autoserver 6 { 7 importlib("stdole32.tlb"); 8 9 // Primary dispatch interface for CAutoserverDoc [ uuid(d11ed785-cfd8-11d1-931d ) ] 12 dispinterface IAutoserver 13 { 14 properties: 15 // NOTE - ClassWizard will maintain property information here. 16 // Use extreme caution when editing this section. 17 //{{AFX_ODL_PROP(CAutoserverDoc) 1 18 //}}AFX_ODL_PROP methods: 21 // NOTE - ClassWizard will maintain method information here. 22 // Use extreme caution when editing this section. 23 //{{AFX_ODL_METHOD(CAutoserverDoc) 2 24 [id(1)] double SquareRoot(double dinputval); 25 //}}AFX_ODL_METHOD 1 ClassWizard lisää tähän OLEominaisuudet get/set-metodeina. 2 ClassWizard lisää tähän OLEominaisuudet.

16 614 3 Tässä osassa määritellään dokumentti yhden dispatchliittymän luokaksi. Sovelluksen tietojen ulkoistaminen 26 }; 27 // Class information for CAutoserverDoc [ uuid(d11ed783-cfd8-11d1-931d ) ] 3 30 coclass Document 31 { 32 [default] dispinterface IAutoserver; 33 }; 34 //{{AFX_APPEND_ODL}} 35 //}}AFX_APPEND_ODL}} 36 }; AppWizard lisää myös lähdekoodia vakiosovellusrunkoon OLEautomaatiota varten. Sovellusluokan (CMyServerApp) InitInstance()-funktiossa tulee alustaa OLE- ja COM-kirjastot, mikä tehdään kutsumalla AfxOleInit()-funktiota. Löydät myös uuden rivin, joka yhdistää sovelluksen dokumenttimallin uuteen COleTemplateServer-tyyppiseen m_server-muuttujaan: Komentorivin Embedded ja Automation -argumentit Kun asiakasohjelma kutsuu funktioita automaatiopalvelimen.exe-sovelluksesta, automaatiopalvelin (kuten Word) tulee ajaa näkymättömissä taustalla. OLE suorittaa tämän käynnistämällä palvelinohjelman komentoriviltä annetulla /Automation-lipulla. Palvelimen InitInstance()- funktiosta kutsuttu ParseCommandLine()-funktio asettaa CCommandLineInfo-olion m_bautomated-lipun. Sovellus voi sitten tutkia tätä lippua, joka kertoo, että sovellusta ajetaan asiakasohjelman kutsumana automaatiopalvelimena eikä itsenäisenä sovelluksena. Jos ohjelma käynnistetään Embedded-argumentilla, sovellus tietää, että sitä käytetään yhdistelmädokumenttiin upotetun objektin käsittelemiseen. m_server.connecttemplate(clsid, pdoctemplate, TRUE); Tämä mallipalvelin on johdettu COleObjectFactory-luokasta, joka on OLEn oma toteutus luokkatehtaasta. Asiakassovellukset luovat tämän luokkatehtaan avulla uusia ilmentymiä automaatiopalvelimen dokumenttioliosta joko CoCreateInstance()-funktiolla tai funktioilla CoGetClassObject() ja CreateInstance(). Jos sovellusta kutsutaan asiakassovelluksesta automaatiopalvelimena, se voi rekisteröidä OLE-automaatio-objektinsa käyttövalmiiksi seuraavilla InitInstance():n lisäriveillä: if (cmdinfo.m_brunembedded cmdinfo.m_brunautomated) { COleTemplateServer::RegisterAll(); return TRUE; } Muussa tapauksessa voit ajaa automaatiopalvelinta tavallisena sovelluksena ja seuraavat rivit luovat vaadittavat avaimet Järjestelmärekisteriin: m_server.updateregistry(oat_dispatch_object); COleObjectFactory::UpdateRegistryAll(); Kun tutkit AppWizardin tekemää dokumenttiluokkaa, huomaat, että sinnekin on lisätty koodia tekemään dokumentista itsestään automaatio-objekti. Dokumentin dispatch-liittymän ID-tunnus määritellään static

17 const tyyppisenä GUID-arvona: static const IID IID_IAutoserver = {0xd11ed785, 0xcfd8, 0x11d1, {0x93, 0x1d, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0 } }; Itse dispatch-liittymä toteutetaan AppWizardista saatujen makrojen avulla: BEGIN_INTERFACE_MAP(CAutoserverDoc, CDocument) INTERFACE_PART(CAutoserverDoc, IID_IAutoserver, Dispatch) END_INTERFACE_MAP() Toiset makrot puolestaan lisäävät metodeja tähän dispatchhakutaulukkoon. Esimerkiksi Autoserver-dokumenttiin lisätty uusi SquareRoot()-metodi näyttäisi tältä: BEGIN_DISPATCH_MAP(CAutoserverDoc, CDocument) //{{AFX_DISPATCH_MAP(CAutoserverDoc) DISP_FUNCTION(CAutoserverDoc, SquareRoot, SquareRoot, VT_R8, VTS_R8) //}}AFX_DISPATCH_MAP END_DISPATCH_MAP() Merkkijono SquareRoot antaa dispatch-liittymälle metodin nimen ja VT_R8 sekä VTS_R8 liput määrittävät parametrin ja paluuarvon tyypin (eli double-tyyppisiä kaksoistarkkuuden liukulukuja). OSA VI LUKU Älä mene muuttamaan itse näiden makrojen sisältöä ClassWizard huolehtii siitä lisätessäsi uusia automaatiometodeja. Automaatiopalvelimen metodin lisääminen ClassWizardilla 1. Käynnistä ClassWizard näppäilemällä Ctrl+W tai valitsemalla View-valikosta ClassWizard. 2. Valitse Automation-välilehti ja varmista, että Class Name yhdistelmäruudussa on valittu dokumenttiluokka. 3. Lisää uusi metodi Add Method painiketta napauttamalla. 4. Syötä metodin ulkoinen, asiakassovelluksille näkymä nimi, esimerkiksi CAutoserverDoc-luokalle SquareRoot(kuva 25.4). 5. Alla pitäisi näkyä kutsuttavan funktion sisäinen nimi: voit muuttaa nimeä, mutta se jätetään yleensä oletusarvoonsa. 6. Valitse uuden metodin palauttama tietotyyppi Return Type yhdistelmäruudusta. (Autoserver-esimerkissä tämä on double). DISP_FUNCTION-makron parametrit DISP_FUNCTION-makron ensimmäinen parametri kertoo funktion toteuttavan luokan nimen. Toinen parametri määrittää funktion ulkoisen nimen, jonka automaatioasiakkaat näkevät tutkimalla palvelimen dispatch-liittymää. Kolmas parametri on toteutusfunktion nimi ja neljäs määrittää funktion palauttaman VARIANT-tietotyypin. Viimeinen parametri on välilyönnein erotettu luettelo funtiolle välitettyjä VARIANTparametrejä. Nämä parametrit määritellään (AFXDISP.H:ssa) VTS_-alkuisina vakioina, jotka myöhemmin muunnetaan VARIANT-tietotyypin määrittäviksi indekseiksi.

18 616 Sovelluksen tietojen ulkoistaminen KUVA 25.4 Uuden metodin lisääminen automaatiopalvelimeen ClassWizardilla. 7. Anna metodien parametrien nimet Parameter List -luetteloon (tässä ainoa parametri on nimeltään dinputval). 8. Valitse parametrin tyyppi uuden parametrin kohdalta Typesarakeotsikon alta (tässä double). 9. Mikäli asiakassovellus välittää automaatiopalvelimen funktiolle useampia parametrejä, toista vaiheet 7 ja Lisää uusi metodi napauttamalla OK. Metodin tulisi ilmestyä ClassWizardin Automation-välilehdelle ulkoisten nimien joukkoon. 11. Aloita uuden metodin koodin muokkaaminen Edit Code painikkeella. Kun olet lisännyt metodin, voit lisätä siihen toteutuskoodin automaatiopalvelimen tarkoituksen mukaan. Autoserver-esimerkin SquareRoot()-metodi palauttaa yksinkertaisesti syöttöarvon neliöjuuren kutsumalla matematiikkafunktiota sqrt(): #include math.h double CAutoserverDoc::SquareRoot(double dinputval) { return sqrt(dinputval); } Uuden automaatiometodin lisäämiseen tarvittiin siis ClassWizardin toimenpiteet sekä oma toteutuskoodisi. ClassWizard lisää automaattisesti rivit dispatch-hakutaulukkoon (DISPATCH_MAP) ja.odl-tiedostoon

19 vaadittujen OLE-automaatiopalvelimen tyyppitietojen lisäämiseksi. Kun käännät uuden automaatiopalvelimesi, huomaat, että.odl-tiedosto on käännetty yhdessä lähdekoodisi kanssa. Käännöstulos löytyy Debughakemistosta (tai Release).tlb-tiedostona, jossa on uusien dispatchmetodien tyyppitietokirjaston määrittelyt. OSA VI LUKU Tämän tyyppikirjaston avulla voit tehdä asiakasohjelmassa OLE dispatch ohjainluokan (mikä esitetään seuraavassa kappaleessa). Omien tyyppikirjastojen jakelu kannattaa, koska joku saattaa haluta kirjoittaa oman asiakasohjelmansa kutsumaan automaatiopalvelintasi. Voit ladata esimerkiksi Microsoftin webbipalvelusta ( Wordin tyyppikirjastoja ja rakentaa oman asiakasohjelmasi käyttämään metodeja Wordista. Automaatioasiakasohjelman luominen Voit luoda automaatiopalvelinten ilmentymiä ja kutsua niiden metodeja millaisesta asiakasohjelmasta tahansa. Ensimmäinen tehtävä näissä on OLE-kirjastojen alustaminen. Tämä tehdään yksinkertaisesti kutsumalla sovellusluokan InitInstance()-funktiossa AfxOleInit()- funktiota: BOOL CAutoclientApp::InitInstance() { AfxOleInit(); } Tämän jälkeen voit luoda OLE dispatch ohjainluokan tyyppikirjastosta ClassWizardilla ja näin yksinkertaistaa automaatiopalvelimen metodien kutsumista. Tyyppikirjastot Muista, että staattiset kirjastot (.lib) ja dynaamiset linkkikirjastot (.dll) tallentavat suoritettavan koodin, mutta tyyppikirjastot (.tlb) ainoastaan OLEautomaatiopalvelimien parametrien ja paluuarvon tyyppimäärittelyt. Automaatiopalvelimen suoritettava koodi sijaitsee itse automaatiopalvelinohjelmassa. Jos esimerkiksi imuroit Microsoft Wordin tyyppikirjaston, käytössäsi on ainoastaan tieto siitä, kuinka Wordin funktioille välitetään parametrit ja mitä tuloksia ne palauttavat. Näiden funktioiden kutsumiseksi tulee koneessasi olla itse Word asennettuna. Dispatch ohjainluokan lisääminen tyyppikirjastosta ClassWizardilla 1. Käynnistä ClassWizard näppäilemällä Ctrl+W tai valitsemalla View-valikosta ClassWizard. 2. Valitse Automation-välilehti. 3. Napauta Add Class painiketta ja valitse valikosta From a Type Library komento. 4. Etsi selaamalla haluttu tyyppikirjasto. Tämä saattaa olla.tlb-,.olb- tai.dll-tiedostossa.

20 618 Sovelluksen tietojen ulkoistaminen 5. Kun olet löytänyt halutun tiedoston, kaksoisnapauta sitä ja valitse Open, jolloin saat esiin Confirm Classes valintaikkunan. 6. Voit muuttaa kustakin tuotavasta luokasta generoitavien luokkien ja toteutustiedostojen oletusnimiä valitsemalla luokan ja muuttamalla nimet Class Name-, Header File- ja Implementation File tekstiruutuihin. 7. Tuo valitut luokat projektiin napauttamalla OK. Dispatch-ohjainluokkien nimet On harmillinen sattuma, että ClassWizardin tekemien dispatch-ohjainluokkien oletusnimet alkavat I:llä. Tämä sekoittaa luokan nimen COMliittymämäärittelyyn (nämä ovat kaksi eri asiaa). OLEn dispatchohjainluokka on vain kätevä paketointitapa automaatiopalvelinobjektin kutsumiseksi IDispatch-liittymän Invoke()- funktiolla. Älä siis sekoita dispatch-ohjainluokkien nimiä COM-liittymien nimiin. Tässä voisit käyttää edellisessä esimerkissä tuotettua tyyppikirjastoa (autoserver.tlb) tiedostojen autoserver.cpp ja autoserver.h generoimiseksi. Näissä on IAutoserver dispatch ohjainluokka. Dispatch-ohjainluokalla on tynkäfunktioita, jotka kutsuvat (apufunktion kautta) Invoke-funktiota oikean automaatiopalvelimen dispatch-liittymän funktion kutsumiseksi taulukosta haetun funktion ID-tunnuksen mukaan. Esimerkiksi Autoserver-palvelimen SquareRoot()-funktio näyttää tältä dispatch-ohjainluokassa: double IAutoserver::SquareRoot(double dinputval) { double result; static BYTE parms[] = VTS_R8; InvokeHelper(0x1, DISPATCH_METHOD, VT_R8, (void*)&result, parms, dinputval); return result; } Edellisen InvokeHelper()-funktion ensimmäinen parametri (0x1) on SquareRoot()-funktion ID-tunnus automaatiopalvelimen dispatchliittymän funktiotaulukossa. Toinen parametri on lippu, joka määrittää, että kyseessä on metodin, eikä tapahtuman tai ominaisuuden käsittelyn kutsu. Kolmas parametri on paluuarvo, joka tallennetaan resultmuuttujaan. Neljäs parametri, parms, määrittää parametrien formaatin. Tämän jälkeen tulevat varsinaiset parametrit, jotka InvokeHelper() paketoi DISPPARMS-tietorakenteeksi Invoke()- funktiolle. Ennen kuin pääset käyttämään näitä automaatiopalvelimen funktioita, joudut hankkimaan voimassa olevan dispatch-osoittimen olioon. Kun tutkit dispatch-ohjainluokan header-tiedostoa, huomaat, että se on johdettu COleDispatchDriver-luokasta. Tämän luokan jäsenfunktioiden avulla voidaan luoda osoitin dispatch-liittymän.

21 OSA VI LUKU Voit kutsua dispatch-ohjainluokan CreateDispatch()-metodia ja syöttää sille OLEn ymmärtämän haluttuun luokkaan liitetyn merkkijonon (esimerkiksi Autoserver.document ). Tämän jälkeen CreateDispatch()-funktio etsii parametriin liitetyn CLSID-tunnuksen Järjestelmärekisteristä ja luo halutun automaatiopalvelinluokan ilmentymän. Funktion onnistuessa palautetaan TRUE ja ohjainluokan metodeja päästään kutsumaan. Listauksessa 25.2 on osa uuden projektiin tuodun dispatch-ohjainluokan ilmentymän luovasta koodista. Lisäksi koodi luo dispatchliittymän ja kutsuu automaatiopalvelimen metodia. Voit tehdä valintaikkunasovelluksen Autoclient automaatiopalvelimen koodin testaamiseksi. Lisää listauksen 25.2 koodi valintaikkunasovelluksen OnInitDialog()-funktion loppuun (tiedostoon autoclientdlg.cpp). Rivin 1 #include-lause kuuluu lähdekooditiedoston alkuun. Kun käännät ja ajat sovelluksen, tulisi sen näyttää kuvan 25.2 sanomaruutu. Automaatiopalvelin ladataan ajettavaksi automaattisesti neliöjuuren laskemista varten. LISTAUS 25.2 LST25_2.CPP Automaatiopalvelimessa olevan funktion alustaminen ja kutsuminen dispatch-ohjainluokan kautta 1 // Include the dispatch driver class header file 2 #include autoserver.h 3 4 //.. Function declaration 5 6 // ** Initialize the dispatch driver class 7 IAutoserver IAutoserver; 8 9 // ** Create an instance of the server and connect 10 // ** to ites dispatch interface 11 if (IAutoserver.CreateDispatch("Autoserver.document")) 1 12 { 13 // ** Call the SquareRoot method on the server program 14 double dnumber = 36.0; 15 double droot = IAutoserver.SquareRoot(dNumber); // ** Display the result 18 CString strmsg; 19 strmsg.format("root of %f = %f\n",dnumber,droot); 20 AfxMessageBox(strMsg); 21 } Automaatio-objektin Järjestelmärekisteriasetukset Automaatio-objektien luettelo löytyy HKEY_CLASSES_ROOTrekisteriavaimen alta. Jokaisen automatiopalvelimen alla on CLSID-avain, jossa on kunkin automaatiopalvelimen yksilöivää 128-bittistä GUID-arvoa vastaava merkkijono. 1 CreateDispatch() hakee annetun nimen CLSID:n ja kutsuu CoCreateInstance()-funktiota pyytäen dispatch-liittymää.

22 620 Sovelluksen tietojen ulkoistaminen Listauksen 25.2 rivillä 2 otetaan koodiin mukaan #include-lauseella dispatch-ohjainluokan määrittely (joka on luotu tyyppikirjastosta). Riveillä 6 21 on moodi, joka kutsuu automaatiopalvelinta. Dispatchohjainluokan ilmentymä määritellään rivillä 7. CreateDispatch()- jäsenmetodia kutsutaan rivillä 11 automaatiopalvelimen dokumenttiolion ilmentymän luomiseksi ja funktio myös tallentaa dispatchliittymäosoittimensa (m_ldispatch-jäseneen). Jos yhteys onnistuu, kutsutaan rivin 15 SquareRoot()-metodia ja sen paluuarvo, droot, näytetään sanomaruudussa rivillä 20 (kuva 25.5). Kun IAutoserverluokan voimassaoloalue päättyy, vapautetaan dispatch-liittymä automaattisesti luokan tuhoajafunktiossa. Vaihtoehtoisesti voit kutsua dispatch-ohjaimen ReleaseDispatch()- jäsenfunktiota dispatch-ohjaimen vapauttamiseksi. Ohjaimella on myös funktiot AttachDispatch() ja DetachDispatch() dispatch-liittymäosoittimen liittämistä ja jo yhdistetyn osoittimen irrottamista varten automaatiopalvelinoliosta. KUVA 25.5 OLE-automaatioesimerkin toiminta.

23 OSA VI LUKU OLE-säilöt, -palvelimet ja minipalvelimet OLE-palvelin on sovellus, joka voidaan käynnistää säilösovelluksesta käsin. Esimerkiksi Excel-laskentataulukko voidaan lisätä ja sitä voidaan muokata Wordissä. Tässä tapauksessa Word toimii OLE-säilönä (container) ja Excel OLE-palvelinsovelluksena. Sovellukset voivat olla sekä OLE-säilöjä että OLE-palvelimia, jolloin ne voivat toimia jommassa kummassa roolissa. Word ja Excel ovat hyviä esimerkkejä tästä, koska voit lisätä Exceliin Word-dokumentteja ja päinvastoin. Aito palvelin voi toimia sovelluksena itsenäisesti tai säilöön lisättynä objektina, mutta minipalvelimet voidaan ainoastaan käynnistää säilösovelluksesta. OLE-säilöt tarjoavat Lisää-valikossa Objekti-komennon (Insert/ Object). Esimerkiksi Windowsin WordPad on OLE-palvelin. Voit testata OLE-palvelimia WordPadin avulla valitsemalla sen Lisäävalikosta Objekti-komennon. Tällöin näet luettelon rekisteröidyistä OLE-palvelimista, jotka voidaan liittää WordPad-dokumenttiin. Kun OLE-palvelinobjekti lisätään dokumenttiin, sitä voidaan muokata paksulla katkoviivalla rajatussa suorakulmiossa. Tämä toimenpide on nimeltään paikallaan aktivointi (in-place activation) ja sen aluksi säilö syöttää palvelimelle lippuarvoja, verbejä. Kun OLE-palvelinobjekti ei ole enää aktiivinen, sen reunus häviää näkyvistä ja objektina näytetään siihen viimeksi piirretty kuva (tämän tallentaa ja esittää metatiedostopiirtopinta). Kun objekti on aktiivinen, sen reunus näytetään ja paikallaan aktivoitavan palvelinobjektin valikkokomennot lisätään säilösovelluksen valikkoon. Säilödokumentti osaa serialisoida siihen upotetun dokumentin tiedot tavallisia serialisointifunktioita käyttäen. Palvelimen dokumentit saavat säilödokumentilta CArchive-olion, jotta kukin palvelinolio voisi serialisoida omat tietonsa. Voit luoda OLE-palvelimen ja OLE-säilön sovellusrungon AppWizardilla, mutta osa säilön ja palvelimen yhteisestä toiminnasta joudutaan kuitenkin toteuttamaan koodaamalla, jotta molemmat toimisivat kunnolla. OLE-palvelimen sovellusrunkoon joudutaan paikallaan editointia varten lisäämään kaksi luokkaa. Toinen näistä on palvelinalkioluokka, joka on johdettu COleServerItem-kantaluokasta. Tämä edustaa säilössä esitettyä upotettua alkiota ja se osaa piirtää alkion OnDraw()- Aktiiviset dokumentit Saatat törmätä termiin Active Documents OLE-palvelimien ja säilöjen yhteydessä. Kyseessä on varsin uusi ActiveX:ään liittyvä tekniikka, joka laajentaa OLEsäilö/palvelin -arkkitehtuuria antamalla upotetuille objekteille mahdollisuuden hallita koko säilön työaluetta (eikä pientä kehystä) ja muokata suoraan säilön kehystä, valikoita ja työkalurivejä. Saat lisätietoa aktiivisista dokumenteista Microsoftin dokumentoiinnista hakemalla IOleDocumentliittymää ja siihen liittyviä liittymiä. Yhdistelmädokumentit: upotus ja linkitys Vaikka upotettu dokumentti on tallennettu täysin asiakassovelluksen yhdistelmädokumenttiin (compound document), linkitetyt objektit takllennetaan ainoastaan monikereina. Moniker on pieni objekti, joka yksilöi, missä oikea tieto on ja kuinka se tulee esittää ja näyttää asiakassovelluksessa.

24 622 Sovelluksen tietojen ulkoistaminen funktiolla säilön pyynnöstä. Luokalla on myös OnDoVerb()-funktio, joka käsittelee säilön pyynnöt esittää, avata tai piilottaa säilöön upotettu alkio. Säilö voi myös siirtää tietoa palvelimen kanssa palvelinalkion tarjoaman IOleObject-liittymän kautta. Toinen paikallaan editointi ikkunassa käytettävä luokka on johdettu luokasta COleIPFrameWnd. Tämän luokan avulla toteutetaan palvelimen omat työkalurivit ja valikot säilön työkalurivien ja valikoiden paikalle palvelimen aktivoituessa. Säilölle tehty sovellusrunko lisää ainoastaan yhden luokan, joka on johdettu COleClientItem-kantaluokasta. Tällä uudella luokalla on useita funktioita, joiden avulla yhdistelmädokumenttiin voidaan luoda linkitettyjä tai upotettuja alkioita ja ylläpitää niitä. Se tarjoaa myös säilöpuolen linkin palvelinalkiolle siirtäen tietoa DoVerb()-funktion kautta. Lisäksi luokan funktioilla saadaan ylläpidettyä palvelinalkion paikkaa ja aktivointitilaa. Kun räätälöit näitä kahta palvelinluokkaa ja yhtä säilöluokkaa, voit hyödyntää varsin mutkikkaitakin paikallaan editointi ominaisuuksia säilön sovellusikkunassa. Palvelimen eikä säilönkään tarvitse tietää, millaisessa säilösovelluksessa sitä käytetään tai millainen objekti siihen on upotettu. Kunhan sekä palvelin- että säilöalkiot toimivat saman standardin mukaan, ne voidaan liittää toimimaan saumattomasti yhdessä ja näyttämään käyttäjälle yhdeltä ja samalta sovellukselta.

815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset

815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset Harjoituksen aiheena ovat aliohjelmat ja abstraktit tietotyypit sekä olio-ohjelmointi. Tehtävät tehdään C-, C++- ja Java-kielillä.

Lisätiedot

Component Object Model

Component Object Model 341 L U K U 8 Component Object Model Oppitunti 1: COM arkkitehtuuri 342 Oppitunti 2: Etähallinta 352 Oppitunti 3: Sanomarajapinnat 357 Oppitunti 4: Säiemallit 365 Oppitunti 5: ActiveX-kontrollit 369 Laboratorio

Lisätiedot

Harjoitustyö: virtuaalikone

Harjoitustyö: virtuaalikone Harjoitustyö: virtuaalikone Toteuta alla kuvattu virtuaalikone yksinkertaiselle olio-orientoituneelle skriptauskielelle. Paketissa on testaamista varten mukana kaksi lyhyttä ohjelmaa. Ohjeita Noudata ohjelman

Lisätiedot

ActiveX-kontrollien käyttö

ActiveX-kontrollien käyttö OSA II LUKU 9 181 9 LUKU Kehittyneiden ActiveX-kontrollien lisääminen projektiisi Kontrollin ominaisuuksien ja tyylien muokkaaminen Kontrollista saadun tiedon hyödyntäminen ohjelmassa 182 ActiveX-kontrollit

Lisätiedot

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena Ohjelmointikielet ja -paradigmat 5op Markus Norrena Ko#tehtävä 4 Viimeistele "alkeellinen kuvagalleria". Käytännössä kaksi sivua Yksi jolla voi ladata kuvia palvelimelle (file upload) Toinen jolla ladattuja

Lisätiedot

4. Lausekielinen ohjelmointi 4.1

4. Lausekielinen ohjelmointi 4.1 4. Lausekielinen ohjelmointi 4.1 Sisällys Konekieli, symbolinen konekieli ja lausekieli. Lausekielestä konekieleksi: - Lähdekoodi, tekstitiedosto ja tekstieditorit. - Kääntäminen ja tulkinta. - Kääntäminen,

Lisätiedot

Jypelin käyttöohjeet» Ruutukentän luominen

Jypelin käyttöohjeet» Ruutukentän luominen Jypelin käyttöohjeet» Ruutukentän luominen Pelissä kentän (Level) voi luoda tekstitiedostoon "piirretyn" mallin mukaisesti. Tällöin puhutaan, että tehdään ns. ruutukenttä, sillä tekstitiedostossa jokainen

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 3 vastaukset Harjoituksen aiheena ovat imperatiivisten kielten muuttujiin liittyvät kysymykset. Tehtävä 1. Määritä muuttujien max_num, lista,

Lisätiedot

Usean näkymän luominen

Usean näkymän luominen OSA V 471 LUKU 20 20 LUKU Dynaamisten ja staattisten jakajaikkunoiden käyttö Resurssienhallinnan kaltaisen käyttöliittymän tekeminen sovelluksiin ja hallinta ilman ikkunan jakamista 472 Kehittyneet dokumentti/näkymä

Lisätiedot

Attribuutit. Copyright IT Press Tämän e-kirjan kopiointi, tulostaminen ja jakeleminen eteenpäin luvatta on kielletty.

Attribuutit. Copyright IT Press Tämän e-kirjan kopiointi, tulostaminen ja jakeleminen eteenpäin luvatta on kielletty. 8 Attribuutit Useimmat ohjelmointikielet on suunniteltu tavoitteena määrätty joukko ominaisuuksia. Kun esimerkiksi ryhdyt tekemään kääntäjää, mietit millainen uudella kielellä tehty sovellus on rakenteeltaan,

Lisätiedot

JReleaser Yksikkötestaus ja JUnit. Mikko Mäkelä 6.11.2002

JReleaser Yksikkötestaus ja JUnit. Mikko Mäkelä 6.11.2002 JReleaser Yksikkötestaus ja JUnit Mikko Mäkelä 6.11.2002 Sisältö Johdanto yksikkötestaukseen JUnit yleisesti JUnit Framework API (TestCase, TestSuite) Testien suorittaminen eri työkaluilla Teknisiä käytäntöjä

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 15.3.2010 T-106.1208 Ohjelmoinnin perusteet Y 15.3.2010 1 / 56 Tiedostoista: tietojen tallentaminen ohjelman suorituskertojen välillä Monissa sovelluksissa ohjelman

Lisätiedot

Skype for Business pikaohje

Skype for Business pikaohje Skype for Business pikaohje Sisällys KOKOUSKUTSU... 2 ENNEN ENSIMMÄISEN KOKOUKSEN ALKUA... 4 LIITTYMINEN KOKOUKSEEN SKYPE FOR BUSINEKSELLA... 5 LIITTYMINEN KOKOUKSEEN SELAIMEN KAUTTA... 6 LIITTYMINEN KOKOUKSEEN

Lisätiedot

Kirkkopalvelut Office365, Opiskelijan ohje 1 / 17 IT Juha Nalli 22.12.2015

Kirkkopalvelut Office365, Opiskelijan ohje 1 / 17 IT Juha Nalli 22.12.2015 Kirkkopalvelut Office365, Opiskelijan ohje 1 / 17 Oppilaat saavat vuoden 2016 alusta käyttöönsä oppilaitoksen sähköpostin ja muita palveluita Microsoftin Office365:sta. Oppilaiden sähköposti on muotoa

Lisätiedot

Kieliversiointityökalu Java-ohjelmistoon. Ohje

Kieliversiointityökalu Java-ohjelmistoon. Ohje Kieliversiointityökalu Java-ohjelmistoon Ohje 2/6 SISÄLLYSLUETTELO 1 YLEISTÄ OHJELMASTA... 3 2 PÄÄ-IKKUNA...4 3 YLÄVALIKKO... 4 3.1 TIEDOSTO... 4 3.2 TOIMINTO... 4 3.3 ASETUKSET... 5 3.4 OHJE... 5 4 VÄLILEHDET...5

Lisätiedot

Sovellusarkkitehtuurit

Sovellusarkkitehtuurit HELIA TiKo-05 1 (9) Sovellusarkkitehtuurit ODBC (Open Database Connectivity)... 2 JDBC (Java Database Connectivity)... 5 Middleware... 6 Middleware luokittelu... 7 Tietokanta -middleware... 8 Tapahtumamonitorit

Lisätiedot

Olio-ohjelmointi Javalla

Olio-ohjelmointi Javalla 1 Olio-ohjelmointi Javalla Olio-ohjelmointi Luokka Attribuutit Konstruktori Olion luominen Metodit Olion kopiointi Staattinen attribuutti ja metodi Yksinkertainen ohjelmaluokka Ohjelmaluokka 1 Olio-ohjelmointi

Lisätiedot

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta C++ - perusteet Java-osaajille luento 5/7: operaattoreiden ylikuormitus, oliotaulukko, parametrien oletusarvot, komentoriviparametrit, constant, inline, Operaattoreiden ylikuormitus Operaattoreiden kuormitus

Lisätiedot

Office 365 palvelujen käyttöohje Sisällys

Office 365 palvelujen käyttöohje Sisällys Office 365 palvelujen käyttöohje Sisällys Sisäänkirjautuminen... 2 Office 365:n käyttöliittymä... 3 Salasanan vaihto... 5 Outlook-sähköpostin käyttö... 7 Outlook-kalenterin käyttö... 10 OneDriven käyttö...

Lisätiedot

JUnit ja EasyMock (TilaustenKäsittely)

JUnit ja EasyMock (TilaustenKäsittely) OHJELMISTOJEN TESTAUS JA HALLINTA Syksy 2015 / Auvo Häkkinen JUnit ja EasyMock (TilaustenKäsittely) Tehtävässä tarvittava koodi löytyy osoitteella http://users.metropolia.fi/~hakka/oth/mockesimerkki.zip

Lisätiedot

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++? JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS Teemu Saarelainen teemu.saarelainen@kyamk.fi Lähteet: http://java.sun.com/docs/books/tutorial/index.html Vesterholm, Kyppö: Java-ohjelmointi,

Lisätiedot

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2 6. Metodit 6.1 Sisällys Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2 Oliot viestivät metodeja kutsuen Olio-ohjelmoinnissa ohjelma

Lisätiedot

MDI-sovellusten kehittäminen

MDI-sovellusten kehittäminen OSA V 491 LUKU 21 21 LUKU MDI-sovelluksen luominen Siirtyminen dokumentti, näkymä- ja kehysluokan välillä Sovelluksen kehittäminen MFC;n monidokumentti/näkymä-arkkitehtuurilla 492 Kehittyneet dokumentti/näkymä-tekniikat

Lisätiedot

Sisältö. 22. Taulukot. Yleistä. Yleistä

Sisältö. 22. Taulukot. Yleistä. Yleistä Sisältö 22. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko metodin parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 22.1 22.2 Yleistä

Lisätiedot

Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014

Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014 Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014 Kirjoita jokaiseen palauttamaasi konseptiin kurssin nimi, kokeen päivämäärä, oma nimi ja opiskelijanumero. Vastaa kaikkiin tehtäviin omille konsepteilleen.

Lisätiedot

4.2. ALIOHJELMAT 71. Tulosvälitteisyys (call by result) Tulosvälitteinen parametri kopioidaan lopuksi

4.2. ALIOHJELMAT 71. Tulosvälitteisyys (call by result) Tulosvälitteinen parametri kopioidaan lopuksi 4.2. ALIOHJELMAT 71 sisältyä kaikki tarvittavat kontrollia ohjaavat rakenteet. Jos se on lause (yleensä lohko), niin on ratkaistava, miten paluuarvo ilmaistaan. Joissakin kielissä (esimerkiksi Pascal)

Lisätiedot

4. Luokan testaus ja käyttö olion kautta 4.1

4. Luokan testaus ja käyttö olion kautta 4.1 4. Luokan testaus ja käyttö olion kautta 4.1 Olion luominen luokasta Java-kielessä olio määritellään joko luokan edustajaksi tai taulukoksi. Olio on joukko keskusmuistissa olevia tietoja. Oliota käsitellään

Lisätiedot

Taulukot. Jukka Harju, Jukka Juslin 2006 1

Taulukot. Jukka Harju, Jukka Juslin 2006 1 Taulukot Jukka Harju, Jukka Juslin 2006 1 Taulukot Taulukot ovat olioita, jotka auttavat organisoimaan suuria määriä tietoa. Käsittelylistalla on: Taulukon tekeminen ja käyttö Rajojen tarkastus ja kapasiteetti

Lisätiedot

Osoitin ja viittaus C++:ssa

Osoitin ja viittaus C++:ssa Osoitin ja viittaus C++:ssa Osoitin yksinkertaiseen tietotyyppiin Osoitin on muuttuja, joka sisältää jonkin toisen samantyyppisen muuttujan osoitteen. Ohessa on esimerkkiohjelma, jossa määritellään kokonaislukumuuttuja

Lisätiedot

Haaga-Helia/IltaTiko ict2tcd005: Ohjelmiston suunnittelutaito 1/7 Anne Benson. Tällä opintojaksolla käytämme VS:n kolmen kokonaisuuden luomiseen:

Haaga-Helia/IltaTiko ict2tcd005: Ohjelmiston suunnittelutaito 1/7 Anne Benson. Tällä opintojaksolla käytämme VS:n kolmen kokonaisuuden luomiseen: Haaga-Helia/IltaTiko ict2tcd005: Ohjelmiston suunnittelutaito 1/7 Microsoft SQL käyttö Yleistä VisualStudiosta Tällä opintojaksolla käytämme VS:n kolmen kokonaisuuden luomiseen: - sovellushallintaan -

Lisätiedot

Tietueet. Tietueiden määrittely

Tietueet. Tietueiden määrittely Tietueet Tietueiden määrittely Tietue on tietorakenne, joka kokoaa yhteen eri tyyppistä tietoa yhdeksi asiakokonaisuudeksi. Tähän kokonaisuuteen voidaan viitata yhteisellä nimellä. Auttaa ohjelmoijaa järjestelemään

Lisätiedot

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä Matti Luukkainen 10.12.2009 Tässä esitetty esimerkki on mukaelma ja lyhennelmä Robert Martinin kirjasta Agile and Iterative Development löytyvästä

Lisätiedot

Ohjelmointitaito (ict1td002, 12 op) Kevät 2008. 1. Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen raine.kauppinen@haaga-helia.

Ohjelmointitaito (ict1td002, 12 op) Kevät 2008. 1. Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen raine.kauppinen@haaga-helia. Ohjelmointitaito (ict1td002, 12 op) Kevät 2008 Raine Kauppinen raine.kauppinen@haaga-helia.fi 1. Java-ohjelmoinnin alkeita Tietokoneohjelma Java-kieli ja Eclipse-ympäristö Java-ohjelma ja ohjelmaluokka

Lisätiedot

KEMI-TORNIONLAAKSON KOULUTUSKUNTAYHTYMÄ LAPPIA LANGATON VIERAILIJAVERKKO 2(7) VERKKOYHTEYDEN MÄÄRITTELY WINDOWS XP:LLE (WINDOWS XP SP3)

KEMI-TORNIONLAAKSON KOULUTUSKUNTAYHTYMÄ LAPPIA LANGATON VIERAILIJAVERKKO 2(7) VERKKOYHTEYDEN MÄÄRITTELY WINDOWS XP:LLE (WINDOWS XP SP3) LANGATON VIERAILIJAVERKKO 1(7) LANGATTOMAN VIERAILIJAVERKON KÄYTTÖ Kemi-Tornionlaakson koulutuskuntayhtymä Lappia tarjoaa vierailijoiden, opiskelijoiden ja henkilökunnan käyttöön suojatun langattoman verkon

Lisätiedot

T740103 Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

T740103 Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010 12. Periytyminen Johdantoa Käytännössä vähänkään laajemmissa ohjelmissa joudutaan laatimaan useita luokkia, joiden pitäisi pystyä välittämään tietoa toisilleen. Ohjelmien ylläpidon kannalta olisi lisäksi

Lisätiedot

WWW-sivut HTML-kielellä esitettyä hypertekstiaineistoa

WWW-sivut HTML-kielellä esitettyä hypertekstiaineistoa WWW ja tietokannat WWW-sivut HTML-kielellä esitettyä hypertekstiaineistoa tekstiä, kuvia, hyperlinkkejä Staattiset sivut kirjoitettu kerran, muuttaminen käsin ongelmana pysyminen ajantasalla Ylläpito hankalaa,

Lisätiedot

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa(); Sisällys 7. Oliot ja viitteet Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen. Viitteiden käsittelyä: sijoitus, vertailu ja varautuminen null-arvoon. Viite metodin paluuarvona.. 7.1 7.2 Olio

Lisätiedot

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla 2.5. YDIN-HASKELL 19 tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla kirjaimilla. Jos Γ ja ovat tyyppilausekkeita, niin Γ on tyyppilauseke. Nuoli kirjoitetaan koneella

Lisätiedot

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista Sisällys 1. Omat operaatiot Yleistä operaatioista. Mihin operaatioita tarvitaan? Oman operaation määrittely. Yleisesti, nimeäminen ja hyvä ohjelmointitapa, määreet, parametrit ja näkyvyys. HelloWorld-ohjelma

Lisätiedot

Hiirisanomiin vastaaminen

Hiirisanomiin vastaaminen OSA II LUKU 8 163 8 LUKU Reagointi käyttäjän painaessa tai vapauttaessa hiiren painikkeen Omien funktioiden käyttö, kun hiiri liikkuu Hiirikoordinaattien käsittely ja valitun alueen tutkiminen 164 Näppäinpainallusten

Lisätiedot

Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit

Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit Liite E - Esimerkkiprojekti E Esimerkkiprojekti Olet lukenut koko kirjan. Olet sulattanut kaiken tekstin, Nyt on aika soveltaa oppimiasi uusia asioita pienen, mutta täydellisesti muotoiltuun, projektiin.

Lisätiedot

1 Tehtävän kuvaus ja analysointi

1 Tehtävän kuvaus ja analysointi Olio-ohjelmoinnin harjoitustyön dokumentti Jyri Lehtonen (72039) Taneli Tuovinen (67160) 1 Tehtävän kuvaus ja analysointi 1.1 Tehtävänanto Tee luokka, jolla mallinnetaan sarjaan kytkettyjä kondensaattoreita.

Lisätiedot

Rakenteiset tietotyypit Moniulotteiset taulukot

Rakenteiset tietotyypit Moniulotteiset taulukot C! Rakenteiset tietotyypit Moniulotteiset taulukot 22.2.2018 Agenda Rakenteiset tietotyypit Vilkaisu 6. kierroksen tehtäviin Moniulotteiset taulukot Esimerkki Seuraava luento to 8.3. Ilmoittautuminen ohjelmointikokeeseen

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 7.2.2011 T-106.1208 Ohjelmoinnin perusteet Y 7.2.2011 1 / 39 Kännykkäpalautetteen antajia kaivataan edelleen! Ilmoittaudu mukaan lähettämällä ilmainen tekstiviesti

Lisätiedot

1. Omat operaatiot 1.1

1. Omat operaatiot 1.1 1. Omat operaatiot 1.1 Sisällys Yleistä operaatioista. Mihin operaatioita tarvitaan? Oman operaation määrittely. Yleisesti, nimeäminen ja hyvä ohjelmointitapa, määreet, parametrit ja näkyvyys. HelloWorld-ohjelma

Lisätiedot

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1 Ohjelmoinnin peruskurssi Y1 CSE-A1111 30.9.2015 CSE-A1111 Ohjelmoinnin peruskurssi Y1 30.9.2015 1 / 27 Mahdollisuus antaa luentopalautetta Goblinissa vasemmassa reunassa olevassa valikossa on valinta Luentopalaute.

Lisätiedot

Javan perusteita. Janne Käki

Javan perusteita. Janne Käki Javan perusteita Janne Käki 20.9.2006 Muutama perusasia Tietokone tekee juuri (ja vain) sen, mitä käsketään. Tietokone ymmärtää vain syntaksia (sanojen kirjoitusasua), ei semantiikkaa (sanojen merkitystä).

Lisätiedot

Sisältö. 2. Taulukot. Yleistä. Yleistä

Sisältö. 2. Taulukot. Yleistä. Yleistä Sisältö 2. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.1 2.2 Yleistä

Lisätiedot

2. Olio-ohjelmoinista lyhyesti 2.1

2. Olio-ohjelmoinista lyhyesti 2.1 2. Olio-ohjelmoinista lyhyesti 2.1 Sisällys Yleistä. Oliot ja luokat. Attribuutit. Olioiden esittely ja alustus. Rakentajat. Olion operaation kutsuminen. 2.2 Yleistä Olio-ohjelmointia käsitellään hyvin

Lisätiedot

SSH Secure Shell & SSH File Transfer

SSH Secure Shell & SSH File Transfer SSH Secure Shell & SSH File Transfer TIETOHALLINTO Janne Suvanto 1.9 2002 Sisällysluettelo Sisällysluettelo... 1 Yleistä... 2 SSH Secure Shell ohjelman asetukset... 3 POP3 tunnelin asetukset... 6 Yhteyden

Lisätiedot

Written by Administrator Monday, 05 September 2011 15:14 - Last Updated Thursday, 23 February 2012 13:36

Written by Administrator Monday, 05 September 2011 15:14 - Last Updated Thursday, 23 February 2012 13:36 !!!!! Relaatiotietokannat ovat vallanneet markkinat tietokantojen osalta. Flat file on jäänyt siinä kehityksessä jalkoihin. Mutta sillä on kuitenkin tiettyjä etuja, joten ei se ole täysin kuollut. Flat

Lisätiedot

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen Metodit Metodien määrittely Metodin parametrit ja paluuarvo Metodien suorittaminen eli kutsuminen Metodien kuormittaminen 1 Mikä on metodi? Metodi on luokan sisällä oleva yhteenkuuluvien toimintojen kokonaisuus

Lisätiedot

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. IX Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. IX Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton 2015 syksy 2. vsk IX Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton Sisältö 1. Johdanto luontimalleihin 2. Proxy 3. Factory Method 4. Prototype 5. Singleton Suunnittelumallit Proxy et.

Lisätiedot

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

812341A Olio-ohjelmointi Peruskäsitteet jatkoa 812341A Olio-ohjelmointi 2106 Peruskäsitteet jatkoa Luokkakohtaiset piirteet n Yhteisiä kaikille saman luokan olioille n Liittyvät luokkaan, eivät yksittäiseen olioon n Kaikki ko. luokan oliot voivat käyttää

Lisätiedot

JWT 2016 luento 11. to 21.4.2016 klo 14-15. Aulikki Hyrskykari. PinniB 1097. Aulikki Hyrskykari

JWT 2016 luento 11. to 21.4.2016 klo 14-15. Aulikki Hyrskykari. PinniB 1097. Aulikki Hyrskykari JWT 2016 luento 11 to 21.4.2016 klo 14-15 Aulikki Hyrskykari PinniB 1097 1 Viime luennolla o AJAX ja JSON, harjoitustyön tehtävänanto, vierailuluento avoimesta datasta Tänään o APIt rajapinnoista yleisesti

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 1.4.2009 T-106.1208 Ohjelmoinnin perusteet Y 1.4.2009 1 / 56 Tentti Ensimmäinen tenttimahdollisuus on pe 8.5. klo 13:00 17:00 päärakennuksessa. Tämän jälkeen

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2009 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2009 1 / 28 Puhelinluettelo, koodi def lue_puhelinnumerot(): print "Anna lisattavat nimet ja numerot." print

Lisätiedot

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä Sisälls 7. Oliot ja viitteet Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen.. Viitteiden vertailu. Varautuminen null-arvoon. Viite metodin paluuarvona.. Muuttumattomat ja muuttuvat merkkijonot.

Lisätiedot

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma. 2. Taulukot 2.1 Sisältö Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.2 Yleistä

Lisätiedot

Käyttöohje. Energent MagiCAD plugin

Käyttöohje. Energent MagiCAD plugin Käyttöohje Energent MagiCAD plugin Sisältö 1. Yleistä 1 Dokumentin sisältö... 1 Ohjelman asennus... 1 Vaadittavat ohjelmistot... 1 Asennus... 1 Ohjelman käynnistys... 2 2. Toiminnallisuudet 3 Insert Energent

Lisätiedot

CUDA. Moniydinohjelmointi 17.4.2012 Mikko Honkonen

CUDA. Moniydinohjelmointi 17.4.2012 Mikko Honkonen CUDA Moniydinohjelmointi 17.4.2012 Mikko Honkonen Yleisesti Compute Unified Device Architecture Ideana GPGPU eli grafiikkaprosessorin käyttö yleiseen laskentaan. Nvidian täysin suljetusti kehittämä. Vuoden

Lisätiedot

JavaRMI 1 JAVA RMI. Rinnakkaisohjelmoinnin projekti 1 osa C Tekijät: Taru Itäpelto-Hu Jaakko Nissi Mikko Ikävalko

JavaRMI 1 JAVA RMI. Rinnakkaisohjelmoinnin projekti 1 osa C Tekijät: Taru Itäpelto-Hu Jaakko Nissi Mikko Ikävalko JavaRMI 1 JAVA RMI Rinnakkaisohjelmoinnin projekti 1 osa C Tekijät: Taru Itäpelto-Hu Jaakko Nissi Mikko Ikävalko JavaRMI 2 Table of Contents...1 JAVA RMI...1 Yleistä...4 Arkkitehtuuri...5 Java RMI kerrosarkkitehtuuri...5

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 9.2.2009 T-106.1208 Ohjelmoinnin perusteet Y 9.2.2009 1 / 35 Listat Esimerkki: halutaan kirjoittaa ohjelma, joka lukee käyttäjältä 30 lämpötilaa. Kun lämpötilat

Lisätiedot

Ohjelmointi 1 Taulukot ja merkkijonot

Ohjelmointi 1 Taulukot ja merkkijonot Ohjelmointi 1 Taulukot ja merkkijonot Jussi Pohjolainen TAMK Tieto- ja viestintäteknologia Johdanto taulukkoon Jos ohjelmassa käytössä ainoastaan perinteisiä (yksinkertaisia) muuttujia, ohjelmien teko

Lisätiedot

Harjoitus 7. 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Harjoitus 7. 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti: Harjoitus 7 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti: class Lintu //Kentät private int _siivenpituus; protected double _aivojenkoko; private bool _osaakolentaa; //Ominaisuudet public int

Lisätiedot

15. Ohjelmoinnin tekniikkaa 15.1

15. Ohjelmoinnin tekniikkaa 15.1 15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Lueteltu tyyppi enum. Override-annotaatio. Geneerinen ohjelmointi. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien

Lisätiedot

Mainosankkuri.fi-palvelun käyttöohjeita

Mainosankkuri.fi-palvelun käyttöohjeita Mainosankkuri.fi-palvelun käyttöohjeita Sisällys 1. Johdanto... 1 2. Sisäänkirjautuminen... 1 3. Palvelussa navigointi... 2 4. Laitteet... 2 5. Sisällönhallinta... 4 6. Soittolistat... 7 7. Aikataulut...

Lisätiedot

Microsoft Visual Studio 2005

Microsoft Visual Studio 2005 Sovelluksen jako palvelimiksi: Palvelin on sille annettuun vastuulliseen tehtävään erikoistunut sovellusosa. Käyttöliittymäpalvelin (Web-palvelin) vastaa käyttöliittymän toteuttamisesta. Web-palvelin toteuttaa

Lisätiedot

Uutta Remote Support Platform 3.0 -versiossa

Uutta Remote Support Platform 3.0 -versiossa Uutta Remote Support Platform for SAP Business One Asiakirjaversio: 1.0 2012-10-08 Kaikki maat Typografiset merkintätavat Kirjasintyyli Esimerkki Näytöstä lainatut sanat tai merkit. Näitä ovat kenttien

Lisätiedot

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen Sisällys 6. Metodit Oliot viestivät metodeja kutsuen. Kuormittaminen. Luokkametodit (ja -attribuutit).. Metodien ja muun luokan sisällön järjestäminen. 6.1 6.2 Oliot viestivät metodeja kutsuen Oliot viestivät

Lisätiedot

Sukupuu -ohjelma. Ossi Väre (013759021) Joni Virtanen (013760641)

Sukupuu -ohjelma. Ossi Väre (013759021) Joni Virtanen (013760641) Sukupuu -ohjelma Ossi Väre (013759021) Joni Virtanen (013760641) 7.11.2011 1 Johdanto Toteutimme C -kielellä sukupuuohjelman, johon käyttäjä voi lisätä ja poistaa henkilöitä ja määrittää henkilöiden välisiä

Lisätiedot

Siirtyminen Outlook 2010 -versioon

Siirtyminen Outlook 2010 -versioon Tämän oppaan sisältö Microsoft Microsoft Outlook 2010 näyttää hyvin erilaiselta kuin Outlook 2003. Tämän oppaan tarkoituksena on helpottaa uuden ohjelman opiskelua. Seuraavassa on tietoja uuden käyttöliittymän

Lisätiedot

11. oppitunti III. Viittaukset. Osa. Mikä on viittaus?

11. oppitunti III. Viittaukset. Osa. Mikä on viittaus? Osa III 11. oppitunti Viittaukset Kahdessa viime luvussa opit käyttämään osoittimia kohteiden käsittelyyn vapaalla muistialueella sekä viittaamaan noihin kohteisiin epäsuorasti. Tässä luvussa käsiteltävät

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 11: Olioiden toteuttaminen Riku Saikkonen 28. 11. 2011 Sisältö 1 Miten oliot ja metodikutsut toimivat? 2 Oliot Minkä luokan metodia kutsutaan? Python-esimerkki

Lisätiedot

Ohje kehitysympäristöstä. Dokumentti: Ohje kehitysympäristöstä.doc Päiväys: 15.03.2005 Projekti : AgileElephant

Ohje kehitysympäristöstä. Dokumentti: Ohje kehitysympäristöstä.doc Päiväys: 15.03.2005 Projekti : AgileElephant AgilElephant Tekijä: Petri Kalsi Omistaja: ElectricSeven Dokumentti:.doc Päiväys: 15.03.2005 Aihe: Sivu 1 of 6 Dokumenttihistoria Muutoshistoria Revision Revision Yhteenveto muutoksista Revision tekijä

Lisätiedot

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU Ohjelmointi 2 Jussi Pohjolainen TAMK» Tieto- ja viestintäteknologia Tietotyypeistä C++ - kielessä useita tietotyyppejä Kirjaimet: char, wchar_t Kokonaisluvut: short, int, long Liukuluvut: float, double

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op) ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 22. huhtikuuta 2016 Vastaa kaikkiin tehtäviin. Tee jokainen tehtävä erilliselle konseptiarkille! Kirjoittamasi luokat, funktiot ja aliohjelmat

Lisätiedot

17. Javan omat luokat 17.1

17. Javan omat luokat 17.1 17. Javan omat luokat 17.1 Sisällys Application Programming Interface (API). Pakkaukset. Merkkijonoluokka String. Math-luokka. Kääreluokat. 17.2 Java API Java-kielen Application Programming Interface (API)

Lisätiedot

Dokumentit, näkymät ja kehykset

Dokumentit, näkymät ja kehykset OSA III 249 LUKU 12 12 LUKU Single document interface sovelluksen luominen MFC:n dokumentti-näkymä rakennetta hyödyntävän sovelluksen kehittäminen Dokumentti-, näkymä-, kehys- ja dokumenttimalliluokat

Lisätiedot

Luento 5. Timo Savola. 28. huhtikuuta 2006

Luento 5. Timo Savola. 28. huhtikuuta 2006 UNIX-käyttöjärjestelmä Luento 5 Timo Savola 28. huhtikuuta 2006 Osa I Shell-ohjelmointi Ehtolause Lausekkeet suoritetaan jos ehtolausekkeen paluuarvo on 0 if ehtolauseke then lauseke

Lisätiedot

7. Oliot ja viitteet 7.1

7. Oliot ja viitteet 7.1 7. Oliot ja viitteet 7.1 Sisällys Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen. Viitteiden sijoitus. Viitteiden vertailu. Varautuminen null-arvoon. Viite metodin paluuarvona. Viite metodin

Lisätiedot

Kehitysympäristö LUKU. Developer Studio kehitysympäristön alkeet. Liikkuminen projektin työtilassa ja sen eri näkymissä

Kehitysympäristö LUKU. Developer Studio kehitysympäristön alkeet. Liikkuminen projektin työtilassa ja sen eri näkymissä OSA I LUKU 2 23 2 LUKU Developer Studio kehitysympäristön alkeet Liikkuminen projektin työtilassa ja sen eri näkymissä Projektien hallinnan vaatimat asetukset 24 Developer Studio - ympäristön räätälöinti

Lisätiedot

Pedacode Pikaopas. Web Service asiakasohjelman luominen

Pedacode Pikaopas. Web Service asiakasohjelman luominen Pedacode Pikaopas Web Service asiakasohjelman luominen Pikaoppaan sisältö Pikaoppaassa kuvataan, Netbeans-työkalulla luodaan valmista olemassa olevaa Web Service palvelua käyttävä asiakasohjelma. Opas

Lisätiedot

Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat:

Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat: 1. Luokan jäsenet Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat: class luokan_nimi tyypit: enum, struct, class, typedef

Lisätiedot

20. Javan omat luokat 20.1

20. Javan omat luokat 20.1 20. Javan omat luokat 20.1 Sisällys Application Programming Interface (API). Pakkaukset. Merkkijonoluokka String. Math-luokka. Kääreluokat. 20.2 Java API Java-kielen Application Programming Interface (API)

Lisätiedot

Opera Hotel Edition. Arvonlisäverokantojen muutos Operaan 01.07.2010. Finland. Toukokuu 2010 MICROS-Fidelio Finland Oy, Hotel Systems HelpDesk

Opera Hotel Edition. Arvonlisäverokantojen muutos Operaan 01.07.2010. Finland. Toukokuu 2010 MICROS-Fidelio Finland Oy, Hotel Systems HelpDesk Opera Hotel Edition Arvonlisäverokantojen muutos Operaan 01.07.2010 Toukokuu 2010 MICROS-Fidelio Finland Oy, Hotel Systems HelpDesk Sivu / Page: 1 / 15 Document revision history Version Revision Author

Lisätiedot

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit IDL - proseduurit 25. huhtikuuta 2017 Viimeksi käsiteltiin IDL:n interaktiivista käyttöä, mutta tämä on hyvin kömpelöä monimutkaisempia asioita tehtäessä. IDL:llä on mahdollista tehdä ns. proseduuri-tiedostoja,

Lisätiedot

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang Sisällys 20. Javan omat luokat Application Programming Interface (API). Pakkaukset. Merkkijonoluokka String. Math-luokka. Kääreluokat. 20.1 20.2 Java API Java-kielen Application Programming Interface (API)

Lisätiedot

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo 15.2.2006

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo 15.2.2006 TURUN YLIOPISTO DEMO III Informaatioteknologian laitos tehtävät Olio-ohjelmoinnin perusteet / Salo 15.2.2006 1. Tässä tehtävässä tarkastellaan erääntyviä laskuja. Lasku muodostaa oman luokkansa. Laskussa

Lisätiedot

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python 8. marraskuuta 2010 Ohjelmointi Perusteet Peruskäsitteitä Olio-ohjelmointi Pythonin alkeet Esittely Esimerkkejä Muuttujat

Lisätiedot

Java-kielen perusteet

Java-kielen perusteet Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, literaalivakio, nimetty vakio Tiedon merkkipohjainen tulostaminen 1 Tunnus Java tunnus Java-kirjain Java-numero

Lisätiedot

Kaakkois-Suomen Ammattikorkeakoulu Oy Mikkelin Ammattikorkeakoulu Oy Kymenlaakson Ammattikorkeakoulu Oy

Kaakkois-Suomen Ammattikorkeakoulu Oy Mikkelin Ammattikorkeakoulu Oy Kymenlaakson Ammattikorkeakoulu Oy Opiskelijoiden OneDriveohje Kaakkois-Suomen Ammattikorkeakoulu Oy Mikkelin Ammattikorkeakoulu Oy Kymenlaakson Ammattikorkeakoulu Oy Ohjeen nimi Opiskelijoiden OneDrive-ohje Vastuuhenkilö Mari Jokiniemi

Lisätiedot

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python 31. tammikuuta 2009 Ohjelmointi Perusteet Pythonin alkeet Esittely Esimerkkejä Muuttujat Peruskäsitteitä Käsittely

Lisätiedot

Visual Basic -sovelluskehitin Juha Vitikka

Visual Basic -sovelluskehitin Juha Vitikka Visual Basic -sovelluskehitin Helsinki 30.10.2000 Seminaari HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos Visual Basic sovelluskehitin Seminaari: Ohjelmistotuotantovälineet Tietojenkäsittelytieteen

Lisätiedot

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014 18. syyskuuta 2014 IDL - proseduurit Viimeksi käsiteltiin IDL:n interaktiivista käyttöä, mutta tämä on hyvin kömpelöä monimutkaisempia asioita tehtäessä. IDL:llä on mahdollista tehdä ns. proseduuri-tiedostoja,

Lisätiedot

Qt perusteet. Juha-Matti Vanhatupa. (vanhan kurssin Graafisen käyttöliittymän ohjelmointi materiaalia)

Qt perusteet. Juha-Matti Vanhatupa. (vanhan kurssin Graafisen käyttöliittymän ohjelmointi materiaalia) Qt perusteet Juha-Matti Vanhatupa (vanhan kurssin Graafisen käyttöliittymän ohjelmointi materiaalia) Sisältö Käännösprosessi MetaObjectSystem Hyödyt Qt:n moduulit Qt käyttöliittymän muistinhallinta Debug-tulosteet

Lisätiedot

Maastotietokannan torrent-jakelun shapefile-tiedostojen purkaminen zip-arkistoista Windows-komentojonoilla

Maastotietokannan torrent-jakelun shapefile-tiedostojen purkaminen zip-arkistoista Windows-komentojonoilla Maastotietokannan torrent-jakelun shapefile-tiedostojen purkaminen zip-arkistoista Windows-komentojonoilla Viimeksi muokattu 5. toukokuuta 2012 Maastotietokannan torrent-jakeluun sisältyy yli 5000 zip-arkistoa,

Lisätiedot

Rajapinta (interface)

Rajapinta (interface) 1 Rajapinta (interface) Mikä rajapinta on? Rajapinta ja siitä toteutettu luokka Monimuotoisuus ja dynaaminen sidonta Rajapinta vs periytyminen 1 Mikä rajapinta on? Rajapintoja käytetään, kun halutaan määritellä

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 8.2.2010 T-106.1208 Ohjelmoinnin perusteet Y 8.2.2010 1 / 38 Debuggeri Tyypillinen tilanne: ohjelma on kirjoitettu, Python-tulkki ei valita virheistä, mutta ohjelma

Lisätiedot

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo Concurrency - Rinnakkaisuus Group: 9 Joni Laine Juho Vähätalo Sisällysluettelo 1. Johdanto... 3 2. C++ thread... 4 3. Python multiprocessing... 6 4. Java ExecutorService... 8 5. Yhteenveto... 9 6. Lähteet...

Lisätiedot