OLE- ja COM-ohjelmoinnin ymmärtäminen
|
|
- Satu Heino
- 9 vuotta sitten
- Katselukertoja:
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 Harjoituksen aiheena ovat aliohjelmat ja abstraktit tietotyypit sekä olio-ohjelmointi. Tehtävät tehdään C-, C++- ja Java-kielillä.
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
Harjoitustyö: virtuaalikone
Harjoitustyö: virtuaalikone Toteuta alla kuvattu virtuaalikone yksinkertaiselle olio-orientoituneelle skriptauskielelle. Paketissa on testaamista varten mukana kaksi lyhyttä ohjelmaa. Ohjeita Noudata ohjelman
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
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
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,
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
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,
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ä
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,
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ä
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
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
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
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
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
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
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
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ö...
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
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,
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
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
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ä
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.
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)
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
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
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
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 -
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
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ä
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
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
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
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,
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
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
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
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
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.
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.
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
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
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
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.
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ä).
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ä
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
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
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
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
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.
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ää
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
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
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
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.
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ä
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
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
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
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
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
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
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
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...
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
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
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
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ä
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
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
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
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ä
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
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
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)
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
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
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
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
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
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
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)
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
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,
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)
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
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
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
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
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
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
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,
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
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,
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ä
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
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...