<map version="0.7.1">
<node TEXT="GKO, luennot 5.-7.8.2004">
<node TEXT="S&#xe4;ikeet" FOLDED="true" POSITION="right">
<node TEXT="Materiaalia:" FOLDED="true">
<node TEXT="Delphi Help: Programming with Delphi, Writing Multi-threaded applications"/>
<node TEXT="Windows SDK: Win32 Programmers Reference, Processes and Threads"/>
</node>
<node TEXT="Perusk&#xe4;sitteit&#xe4;:" FOLDED="true">
<node TEXT="Windows-sovellus koostuu yhdest&#xe4; tai useammasta prosessista, joilla kullakin on oma muisti- ja data-alueensa"/>
<node TEXT="Prosessi koostuu yhdest&#xe4; tai useammasta (mahdollisesti yht&#xe4;aikaisesta) s&#xe4;ikeest&#xe4;, jotka jakavat prosessin datan (=voivat kommunikoida globaalien muuttujien avulla)"/>
<node TEXT="S&#xe4;ie on WIN32:n perusyksikk&#xf6;, jolle j&#xe4;rjestelm&#xe4; jakaa prosessoriaikaa"/>
</node>
<node TEXT="Delphiss&#xe4; s&#xe4;ikeit&#xe4; on helppoa k&#xe4;sitell&#xe4; TThread-luokan avulla" FOLDED="true">
<node TEXT="Thread sis&#xe4;lt&#xe4;&#xe4; Execute-metodin, jonka suorittamisen ajan s&#xe4;ie on aktiivinen">
<node TEXT="Execute-metodissa on yleens&#xe4; silmukka, jossa lopetusehtona ainakin Terminated-attribuutin tutkiminen"/>
</node>
<node TEXT="S&#xe4;ikeen ollessa aktiivinen ajon voi pys&#xe4;ytt&#xe4;&#xe4;/jatkaa Suspend/Resume -metodeilla">
<node TEXT="S&#xe4;ikeen voi luoda k&#xe4;ynninnistettyn&#xe4; tai pys&#xe4;ytettyn&#xe4;"/>
</node>
<node TEXT="Delphin TThread-luokka muistuttaa Javan vastaavaa"/>
</node>
<node TEXT="S&#xe4;ikeet ja Delphi" FOLDED="true">
<node TEXT="VCL-komponentit ajetaan omassa p&#xe4;&#xe4;s&#xe4;ikeess&#xe4;&#xe4;n (=eiv&#xe4;t ole s&#xe4;ieturvallisia!)"/>
<node TEXT="Yleisesti ottaen s&#xe4;ikeet ovat Timerita parempi tapa tehd&#xe4; samanaikaisia toimintoja sovelluksen sis&#xe4;ll&#xe4;"/>
<node TEXT="Jos toisen s&#xe4;ikeen on k&#xe4;sitelt&#xe4;v&#xe4; VCL-komponenttia, se on teht&#xe4;v&#xe4; ep&#xe4;suorasti Synchronize-metodin avulla"/>
<node TEXT="Synchronize odottaa, ett&#xe4; p&#xe4;&#xe4;s&#xe4;ie on p&#xe4;&#xe4;ssyt viestisilmukkaan ja suorittaa annetun koodin p&#xe4;&#xe4;s&#xe4;ikeess&#xe4;"/>
<node TEXT="Lis&#xe4;ksi Windows tarjoaa runsaasti s&#xe4;ikeisiin liittyvi&#xe4; palveluita (Kriittiset alueet, mutexit, semaforit...)"/>
<node TEXT="S&#xe4;ikeiden syv&#xe4;llisempi k&#xe4;sittely menee kurssin yli, mutta s&#xe4;ikeiden hallinta on t&#xe4;rke&#xe4;&#xe4; erityisesti verkko-ohjelmissa (esim. palvelimet)"/>
<node TEXT="Erityisesti resurssien (tietokantayhteydet, tiedostokahvat, globaalit muuttujat) k&#xe4;sittely monis&#xe4;ikeisess&#xe4; sovelluksessa pit&#xe4;isi toteuttaa synkronoidusti">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
<node TEXT="esim. resurssia k&#xe4;sitell&#xe4;&#xe4;n yksi s&#xe4;ie kerrallaan tai s&#xe4;ikeiden j&#xe4;rjestys on muuten kontrolloitu"/>
</node>
<node TEXT="Lis&#xe4;&#xe4; s&#xe4;ikeist&#xe4; esim. kursseilla K&#xe4;ytt&#xf6;j&#xe4;rjestelmien perusteet, Hajautetut j&#xe4;rjestelm&#xe4;t, Rinnakkaislaskenta"/>
</node>
<node TEXT="Esimerkki: automaattilaskuri"/>
</node>
<node TEXT="TPC / IP" FOLDED="true" POSITION="right">
<node TEXT="Materiaalia:" FOLDED="true">
<node TEXT="Delphi Help: Writing Internet Appications"/>
<node LINK="http://delphi.about.com/od/indy/" TEXT="Internet Direct Knowledge Base">
<node TEXT="Yleiskatsaus: Introduction to Indy (Chad Z. Hower)"/>
<node TEXT="Jensen &amp; Anderson: Building Kylix Applications -kirja (luvut 20 ja 21 saatavilla verkossa)"/>
</node>
</node>
<node LINK="http://www.mit.jyu.fi/wikstrom/opetus/tli343/index.html" TEXT="Lis&#xe4;tietoa (ei tule tenttiin...) esim: Sovellusprotokollat-kurssi"/>
<node LINK="http://www.faqs.org/rfcs/rfc793.html" TEXT="TCP-m&#xe4;&#xe4;ritys" FOLDED="true">
<node TEXT="Kuljetuskerroksen protokolla, takaa luotettavan 2-suuntaisen (yhteydellisen) tiedonsiirron, vrt. UDP"/>
<node TEXT="Huom. esim HTTP toimii tcp/ip:n p&#xe4;&#xe4;ll&#xe4;. Jokaista pyydett&#xe4;v&#xe4;&#xe4; websivua kohti avataan uusi yhteys, joka suljetaan web-sivun latauduttua"/>
</node>
<node LINK="http://www.faqs.org/rfcs/rfc791.html" TEXT="IP-m&#xe4;&#xe4;ritys" FOLDED="true">
<node TEXT="Verkkokerroksen protokolla"/>
<node TEXT="Jokaisella IP-verkkoon kytketyll&#xe4; laitteella on 32-bittinen IP-osoite (jaettuna yleens&#xe4; nelj&#xe4;&#xe4;n tavuun...)"/>
<node TEXT="Paikalliseen koneeseen voidaan viitata nimell&#xe4; localhost tai IP-osoitteella 127.0.01"/>
</node>
<node LINK="http://www.iana.org/assignments/port-numbers" TEXT="Porttinumerot" FOLDED="true">
<node TEXT="Kokonaisluku, jolla tunnistetaan k&#xe4;ytett&#xe4;v&#xe4; palvelu"/>
<node TEXT="Palvelin kuuntelee omalle sovellukselleen ominaista porttia"/>
<node TEXT="Tyypillisi&#xe4; porttinumeroita: HTTP: 80, 8080, FTP: 21, SSH: 22 (portit 1024:&#xe4;&#xe4;n asti ovat varattuja)" FOLDED="true">
<node TEXT="Huom. porttinumerot eiv&#xe4;t takaa, ett&#xe4; kysely on tarkoituksenmukainen tai noudattaa oikeaa protokollaa"/>
<node TEXT="(vrt. madot, ddos-hy&#xf6;kk&#xe4;ykset ym)"/>
</node>
</node>
<node TEXT="Yhteystyyppej&#xe4;">
<node TEXT="Socket-yhteydet">
<node TEXT="Standardi rajapinta verkkoprotokollien k&#xe4;ytt&#xf6;&#xf6;n (sek&#xe4; windowsissa ett&#xe4; linuxissa)"/>
<node TEXT="toimivat yleens&#xe4; TCP/IP-yhteyden p&#xe4;&#xe4;ll&#xe4;, my&#xf6;s muut verkot (esim. Novell) mahdollisia"/>
</node>
<node TEXT="Nimetyt putket">
<node TEXT="&quot;tiedostomaista&quot; kahden sovelluksen kommunikointia verkon yli"/>
</node>
<node TEXT="RPC (Remote Procedure Call)"/>
</node>
<node TEXT="Perussovelluksia" FOLDED="true">
<node TEXT="PING - testiyhteys"/>
<node TEXT="TRACERT (traceroute) - selvitt&#xe4;&#xe4; reitityksen osoitteesta toiseen"/>
<node TEXT="Monia TCP/IP -pohjaisia tekstiprotokollia voi testata Telnet -p&#xe4;&#xe4;teyhteydell&#xe4;"/>
</node>
<node TEXT="Asiakas-palvelin -malli:" FOLDED="true">
<node TEXT="Asiakas on prosessi, joka k&#xe4;ynnist&#xe4;&#xe4; yhteyden palvelimeen (esim. webselain, tietokantasovellus)"/>
<node TEXT="Palvelin on prosessi, joka vastaa pyynt&#xf6;ihin. Samanaikaiset pyynn&#xf6;t eri k&#xe4;ytt&#xe4;jilt&#xe4; k&#xe4;sitell&#xe4;&#xe4;n omissa s&#xe4;ikeiss&#xe4;&#xe4;n (esim. webpalvelin, tietokantapalvelin)"/>
</node>
<node TEXT="Delphin verkkokomponentit" FOLDED="true">
<node TEXT="INDY - Internet Direct">
<node TEXT="Open Source -verkkokomponenttikokoelma delphille (socket-yhteyksi&#xe4;, n. 70 asiakas- ja palvelinkomponenttia eri protokollille windowsissa ja linuxissa)"/>
<node TEXT="INDY-komponenttien palvelukutsut ovat blokkaavia (blocking): funktiosta palataan vasta, kun operaatio on suoritettu" FOLDED="true">
<node TEXT="vrt. automaattisesti palaava kutsu: t&#xe4;ll&#xf6;in funktiosta palataan heti ja ohjelmassa t&#xe4;ytyy tarkistaa manuaalisesti my&#xf6;hemmin, mik&#xe4; oli kutsun tulos"/>
<node TEXT="blokkaavat kutsut soveltuvat k&#xe4;ytett&#xe4;viksi omissa s&#xe4;ikeiss&#xe4;&#xe4;n"/>
<node TEXT="jos blokkaava kutsu tehd&#xe4;&#xe4;n p&#xe4;&#xe4;s&#xe4;ikess&#xe4;, k&#xe4;ytt&#xf6;liittym&#xe4; saattaa &apos;pys&#xe4;hty&#xe4;&apos;, kunnes kutsusta palataan (vrt. yleinen windowsin tapahtumak&#xe4;sittelij&#xf6;iden keskeytysongelma)"/>
<node TEXT="INDY-komponentilla TIdAntiFreeze voi korjata pys&#xe4;htymisongelman, vaikka sovelluksessa ei k&#xe4;ytet&#xe4; erillisi&#xe4; s&#xe4;ikeit&#xe4;">
<node TEXT="vrt. VL:n checker -ohjelmaa"/>
</node>
</node>
<node TEXT="Minimaalinen TCP-ip -esimerkki TCPClient-kompoentilla"/>
</node>
<node TEXT="WebBroker">
<node TEXT="Web-palvelinta (esim Apache, IIS) laajentavien palvelinsovellusten tekoon"/>
</node>
<node TEXT="WebSnap">
<node TEXT="WebBrokeria uudempi ja laajennettu j&#xe4;rjestelm&#xe4; palvelinsovelluksiin"/>
<node TEXT="Pit&#xe4;isi mahdollistaa visuaalisen dynaamisten web-sivujen kehityksen (ei kokeiltu viel&#xe4;..) :-)"/>
</node>
</node>
<node TEXT="Esimerkki: TCP/IP-lomake" FOLDED="true">
<node TEXT="huom. vaatii kaveoptvcl-paketin"/>
<node TEXT="tcp/ip lomake toimii yleisk&#xe4;ytt&#xf6;isen&#xe4; tcp-asiakkaana ja palvelimena"/>
<node TEXT="k&#xe4;ytt&#xe4;&#xe4; sis&#xe4;isesti INDY-komponenttien TCP server ja TCP client -komponentteja"/>
<node TEXT="p&#xe4;&#xe4;teohjauksissa kokeitavana chat, telnet-yhteys, www-&quot;selain&quot; ja www-&quot;palvelin&quot;"/>
<node TEXT="TCP/IP-lomaketta voi (ja kannattaa!) k&#xe4;ytt&#xe4;&#xe4; apuna, jos harkkaty&#xf6;ss&#xe4; tarvitsee verkkoyhteyksi&#xe4;"/>
<node TEXT="Omaa &quot;protokollaa&quot; varten voi ottaa mallia esim. VespaCADista"/>
</node>
<node TEXT="Vanha tentti ja VespaCAD">
<node TEXT="huom. k&#xe4;&#xe4;nn&#xe4; vespacadin paketit (kcomp, vespa) ennen varsinaista ohjelmaa ja varmista, ett&#xe4; search path -hakemistossa on kcomp ja tcpip"/>
<node TEXT="Figure on yliluokka piirto-objekteille, tukee mm. skaalausta ja merkkijonoesityst&#xe4;"/>
<node TEXT="Alusta sis&#xe4;lt&#xe4;&#xe4; figuret, tukee niiden liikutusta raahaamalla, osaa ladata ja tallentaa itsens&#xe4; tiedostoon"/>
<node TEXT="Orsi s&#xe4;ilytt&#xe4;&#xe4; Figure-tyyppiset oliot, joita voi raahata Alustaan. Figure kopioidaan raahauksessa"/>
<node TEXT="Piirto-ohjelmaa voi ohjata verkon yli TCP/IP-lomakkeen avulla niin, ett&#xe4; useampi k&#xe4;ytt&#xe4;j&#xe4; voi piirt&#xe4;&#xe4; samanaikaisesti"/>
</node>
</node>
<node TEXT="Sovellusten v&#xe4;linen kommunikointi" POSITION="right">
<node TEXT="Materiaalia: ">
<node LINK="http://www.mit.jyu.fi/vesal/kurssit/winohj/html/winmon/m-7.htm" TEXT="Win-moniste: Kommunikointi ohjelmien v&#xe4;lill&#xe4;"/>
<node TEXT="Windows SDK: Win32 Programmer&apos;s Reference, Interprocess Communications"/>
</node>
<node TEXT="Kommunikointitapoja" FOLDED="true">
<node TEXT="Tiedostot..." FOLDED="true">
<node TEXT="Perustilanne: yksi sovellus tallentaa tiedostoa sovittuun paikkaan, josta toinen sovellus lukee sit&#xe4; s&#xe4;&#xe4;nn&#xf6;llisin v&#xe4;liajoin"/>
<node TEXT="Tekstitiedosto (esim. |-erotellut tietueet) on vanha, mutta toimiva siirtoformaatti yksinkertaissen tietoon"/>
<node TEXT="Nyky&#xe4;&#xe4;n my&#xf6;s XML (k&#xe4;yt&#xe4;nn&#xf6;ss&#xe4; rakenteinen tekstitiedosto) t&#xe4;rke&#xe4; siirtoformaatin metakieli">
<node TEXT="Siis: XML-formaatti ei ratkaise tiedonsiirto-ongelmaa sin&#xe4;ns&#xe4;, mutta tarjoaa standardin tavan rakenteistaa teksti&#xe4;"/>
<node TEXT="XML:n k&#xe4;sittely on edelleen teht&#xe4;v&#xe4; itse (tosin valmiin XML-j&#xe4;sentimet ja XML data binding -ty&#xf6;kalut v&#xe4;hent&#xe4;v&#xe4;t rutiinity&#xf6;t&#xe4;)"/>
</node>
</node>
<node TEXT="Ikkunoiden v&#xe4;liset viestit" FOLDED="true">
<node TEXT="Viestinv&#xe4;litys helppoa, laajojen tietorakenteiden suora v&#xe4;litys pelkill&#xe4; viesteill&#xe4; ei ole k&#xe4;yt&#xe4;nn&#xf6;llist&#xe4;"/>
<node TEXT="Soveltuu mm. ilmoitusten v&#xe4;litt&#xe4;miseen sovelluksen tilasta"/>
<node TEXT="Esimerkki: MultiwinMsg"/>
</node>
<node TEXT="File Mapping: yhteinen virtuaalinen muistialue tiedostossa" FOLDED="true">
<node TEXT="Lis&#xe4;tietoa Windows SDK:ssa"/>
<node TEXT="Jaettua muistia sovellusten v&#xe4;lill&#xe4;"/>
</node>
<node TEXT="Drag &amp; Drop" FOLDED="true">
<node LINK="http://delphi.about.com/library/weekly/aa080399.htm" TEXT="ks. esim delphi.about.com"/>
<node LINK="http://swiss.torry.net/draganddrop.htm" TEXT="komponentteja: torry&apos;s delphi pages"/>
<node TEXT="Tiedostojen raahaustoiminto perustuu windowsin ShellAPI:in"/>
</node>
<node TEXT="Leikep&#xf6;yt&#xe4;" FOLDED="true">
<node TEXT="Voi sis&#xe4;llytt&#xe4;&#xe4; saman tiedon monessa eri formaatissa (esim. RTF, teksti)"/>
<node TEXT="Liitt&#xe4;misen aikana kohdesovellukseen kopioidaan yksityiskohtaisin sovelluksen ymm&#xe4;rt&#xe4;m&#xe4; esitys"/>
<node TEXT="K&#xe4;ytett&#xe4;vyysohje: sovellus ei saa muuttaa leikep&#xf6;yd&#xe4;n sis&#xe4;lt&#xf6;&#xe4; k&#xe4;ytt&#xe4;j&#xe4;n tiet&#xe4;m&#xe4;tt&#xe4;"/>
</node>
<node TEXT="DDE" FOLDED="true">
<node LINK="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/dataexchange/dynamicdataexchange.asp" TEXT="Materiaalia: Microsoft..."/>
<node TEXT="Asiakas/palvelin-mallin mukainen paikallinen tiedonsiirtoprotokolla"/>
<node TEXT="Leikep&#xf6;yd&#xe4;n &quot;ohjelmallinen vastine&quot;: sallii sovellusten vaihtaa tietoa eri formaateissa"/>
<node TEXT="Monipuolisemmat COM-pohjaiset tekniikat ovat korvaamassa DDE:t&#xe4; uudemmissa sovelluksissa, mutta DDE on edelleen toimiva"/>
<node TEXT="Delphiss&#xe4; DDEClient ja DDEServer -komponentit (system-v&#xe4;lilehti)"/>
<node TEXT="Esimerkki: DDE-autolaskuri"/>
<node TEXT="P&#xe4;&#xe4;teohjauksissa &#xe4;&#xe4;nestys"/>
</node>
<node TEXT="OLE / ActiveX" FOLDED="true">
<node LINK="http://www.microsoft.com/com/tech/ActiveX.asp" TEXT="Materiaalia: Microsoft..."/>
<node LINK="http://www.microsoft.com/com/news/drgui.asp" TEXT="Perusteellinen tutoriaali: dr. gui&apos;s gentle introduction to com"/>
<node LINK="http://www.byte.com/art/9709/sec5/sec5.htm" TEXT="David Chappel &amp; David S. Linthicum: ActiveX demystified"/>
<node TEXT="OLE ja ActiveX ovat COM-pohjaisia teknologioita" FOLDED="true">
<node TEXT="COM == Component Object Model, MicroSoftin kaikenkattava komponenttimalli"/>
<node TEXT="COM-komponentti on kokoelma rajapintoja, joiden avulla komponentin kanssa kommunikoidaan"/>
<node TEXT="Kaikkien COM-komponenttien on toteutettava ainakin IUnknown-rajapinta"/>
<node TEXT="Varo markkinointinimien sekamelskaa: " FOLDED="true">
<node TEXT="COM on yleinen Microsoftin komponenttimalli (ks. yll&#xe4;)"/>
<node TEXT="DCOM on hajautettu versio COM-mallista "/>
<node TEXT="COM+ transaktioita tukeva hajautettu COM"/>
<node TEXT="OLE tarkoitti alunperin vain yhdistelm&#xe4;dokumentteja (jotka Win95:n my&#xf6;t&#xe4; m&#xe4;&#xe4;riteltiin COM-pohjaisiksi), mutta sittemmin nime&#xe4; on vlljelty eri COM-pohjaisissa tekniikoissa (esim OLEdb, M$:n uudempi tietokantarajapinta)"/>
<node TEXT="ActiveX-kontrollit tunnettiin aiemmin OLE-controlleina, mutta Internet Explorerin my&#xf6;t&#xe4; M$ tarvitsi uuden nimen WWW:ss&#xe4; py&#xf6;riville sovelluslaajennuksille. Sittemmin my&#xf6;s ActiveX-nime&#xe4; on viljelty eri COM-pohjaissa tekniikoissa (esim. ADO == ActiveX Data Objects, oliorajapinta OLEdb-tietol&#xe4;hteisiin)"/>
</node>
</node>
<node TEXT="OLE = Object Linking and Embedding" FOLDED="true">
<node TEXT="Tarkoittaa k&#xe4;yt&#xe4;nn&#xf6;ss&#xe4; yhdistelm&#xe4;dokumentteja (Compound Documents), jossa dokumentti kootaan eri ohjelmilla tehdyist&#xe4; paloista"/>
<node TEXT="Periaatteessa useimpien win-ohjelmien pit&#xe4;isi tukea, k&#xe4;yt&#xe4;nn&#xf6;ss&#xe4; tarkein OLE-ohjelmisto on Microsoft Office"/>
<node TEXT="Klassinen esimerkki: Word-dokumentti, joka sis&#xe4;lt&#xe4;&#xe4; taulukon"/>
<node TEXT="Dokumenttipalat voivat olla linkitettyj&#xe4; (alidokumentti toisessa tiedostossa) tai upotettuja (p&#xe4;&#xe4;tiedosto sis&#xe4;lt&#xe4;&#xe4; alitiedoston)"/>
<node TEXT="Kun alidokumenttia halutaan editoida, editorisovellus tulee p&#xe4;&#xe4;sovelluksen ali-ikkunaksi" FOLDED="true">
<node TEXT="P&#xe4;&#xe4;sovellus ei ota kantaa alisovelluksen tyyppiin"/>
<node TEXT="Seuraus: kaikki OLEa tukevat sovellukset voivat periaatteessa kommunikoida kesken&#xe4;&#xe4;n, vaikka eiv&#xe4;t tiet&#xe4;isi mit&#xe4;&#xe4;n toisistaan"/>
<node TEXT="K&#xe4;yt&#xe4;nn&#xf6;ss&#xe4; OLE-yhteisk&#xe4;ytt&#xf6; toimii parhaiten Office-dokumenttien yhteisk&#xe4;yt&#xf6;ss&#xe4;"/>
</node>
<node TEXT="Delphi tarjoaa OleContainer-komponentin, jolla OLE-objekteja voi liitt&#xe4;&#xe4; sovellukseen"/>
</node>
<node TEXT="ActiveX = COM-pohjaisia visuaalisia komponentteja" FOLDED="true">
<node TEXT="Laajennettu versio OLE-tekniikasta"/>
<node TEXT="Mahdollistavat mm. komponentin muokkaamisen sovelluksen ulkopuolelta m&#xe4;&#xe4;ritellyill&#xe4; rajapintakutsuilla esim. Visual Basicista (automaatio)"/>
<node TEXT="Internet Explorerin my&#xf6;t&#xe4; my&#xf6;s Internetiss&#xe4;! (tervetuloa uudet virukset ja olematon tietoturvamalli...)"/>
<node TEXT="Esim. Adobe PDF plugin on ActiveX-kontrolli. Huomaa samankaltaisuus OLE-kontrolleihin (Webselaimen sis&#xe4;lle aukeaa &quot;kevennetty&quot; versio adobe readerista)"/>
<node TEXT="Delphi pystyy k&#xe4;ytt&#xe4;m&#xe4;&#xe4;n ActiveX-komponentteja osana omia lomakkeita."/>
<node TEXT="My&#xf6;s Delphi-komponentit voidaan helposti &quot;julkaista&quot; ActiveX-kontrolleina (koska TComponent on COM-yhteensopiva). T&#xe4;ll&#xf6;in niit&#xe4; voi k&#xe4;ytt&#xe4;&#xe4; esim. Visual Basicista."/>
</node>
<node TEXT="Esimerkki: minimaalinen OLE-sovellus OLEContainerilla ja menulla"/>
<node TEXT="Esimerkki: Word-dokumentin ohjaus automaatiolla"/>
<node TEXT="P&#xe4;&#xe4;teohjauksissa PDF-dokumentin avaus ActiveX-komponentilla"/>
</node>
</node>
<node TEXT="Esimerkki: oma makrokieli ja aikataulut" FOLDED="true">
<node TEXT="Makrokielell&#xe4; voi automatisoida ohjelman toimintaa"/>
<node TEXT="&quot;kevennetty versio&quot; OLE-automaatiosta :-)"/>
<node TEXT="Makrokielen komponentit k&#xe4;ytt&#xf6;ohjeineen ovat FormCommands -tiedostossa"/>
<node TEXT="Komennot ovat TParamCommands -luokassa TStrings -s&#xe4;ili&#xf6;ss&#xe4; (hajautustaulu, jossa jokaisen komennon nime&#xe4; vastaa metodiosoitin kohdeohjelmaan)"/>
<node TEXT="Makrot ovat erillisi&#xe4; &quot;ohjelmatiedostoja&quot;, makron voi k&#xe4;ynnist&#xe4;&#xe4; ajamalla varsinaisen ohjelman komentorivilt&#xe4; parametreilla RUN tentti.prg"/>
<node TEXT="Kohdeohjelman p&#xe4;&#xe4;ohjelman alussa tarkistetaan komentoriviparametrit ennen ohjelman varsinaista suoritusta (FormTimeTables.CheckProgram) ja tarvittaessa ajetaan makro-ohjelma. Muussa tapauksessa sovellus k&#xe4;ynnistet&#xe4;&#xe4;n normaalisti."/>
</node>
</node>
<node TEXT="Kertaus ja tilannekatsaus" FOLDED="true" POSITION="left">
<node TEXT="Kertausta: esim. komponentin luominen ja rekister&#xf6;inti, tietokantayhteydet, komponentit ja tapahtumat..."/>
<node TEXT="Viikon teema: sovelluksen hajauttaminen ja sovellusten v&#xe4;linen kommunikointi"/>
<node TEXT="Mit&#xe4; j&#xe4;ljell&#xe4;:" FOLDED="true">
<node TEXT="Monikieliset ohjelmat"/>
<node TEXT="Avustukset"/>
<node TEXT="Asennusohjelmat"/>
<node TEXT="Java"/>
<node TEXT=".Net"/>
<node TEXT="XML-k&#xe4;ytt&#xf6;liittym&#xe4;t"/>
<node TEXT=" =&gt; Tutustmista eri tekniikoihin ja apuohjelmiin, t&#xe4;rkein ohjelmointisis&#xe4;lt&#xf6; on k&#xe4;yty jo"/>
<node TEXT=" =&gt; Sovelletaan aiemmin opittuja asioita"/>
</node>
<node TEXT="Harjoitusty&#xf6;n tarkastelua seuraavalla viikolla?"/>
</node>
<node TEXT="Rajapinnat (liittym&#xe4;t, interfaces)" FOLDED="true" POSITION="left">
<node TEXT="Materiaalia: Delphi Help: Delphi Language Reference, Object Interfaces"/>
<node TEXT="M&#xe4;&#xe4;rittelee metodeja, jotka luokan pit&#xe4;&#xe4; toteuttaa" FOLDED="true">
<node TEXT="C++-terminologiassa abstrakti luokka, jossa kaikki metodit pure virtual-tyyppisi&#xe4;"/>
<node TEXT="Javassa l&#xe4;hes vastaava rajapintamekanismi">
<node TEXT="Sek&#xe4; Delphiss&#xe4; ett&#xe4; Javassa yleinen Object-yliluokka"/>
</node>
<node TEXT="Rajapinnan m&#xe4;&#xe4;rittely muistuttaa luokkam&#xe4;&#xe4;rittely&#xe4;, mutta metodeille ei tehd&#xe4; toteutusta"/>
</node>
<node TEXT="Delphi-luokkia ei voi moniperi&#xe4;, mutta ne voivat toteuttaa useita rajapintoja" FOLDED="true">
<node TEXT="Lis&#xe4;tietoa: Heikki Kainulainen: Moniperint&#xe4; vastaan rajapinnat (LUK)"/>
<node TEXT="L&#xe4;hes moniperint&#xe4;&#xe4; vastaava toiminta saadaan koostamalla ja rajapinnoilla (ks. luk-kuva)"/>
</node>
<node TEXT="Rajapinnoissa oletuksena IUnknown COM-rajapinnan mukaiset metodit" FOLDED="true">
<node TEXT="QueryInterface - metodi, jolla voi kysy&#xe4;, toteuttaako olio m&#xe4;&#xe4;r&#xe4;tyn rajapinnan">
<node TEXT="Metodin k&#xe4;ytt&#xf6; edellytt&#xe4;&#xe4; GUID (Globally Unique Identifier) -numeron m&#xe4;&#xe4;r&#xe4;&#xe4;mist&#xe4;, joka on rajapinnan globaali tunniste"/>
<node TEXT="GUID-m&#xe4;&#xe4;rityksen voi luoda Delphiss&#xe4; CTRL+SHIFT+G - yhdistelm&#xe4;ll&#xe4;"/>
</node>
<node TEXT="_AddRef - lis&#xe4;&#xe4; viitelaskuria"/>
<node TEXT="_Release - v&#xe4;hent&#xe4;&#xe4; viitelaskuria ja poistaa olion, kun viitelaskuri nollassa"/>
<node TEXT="Viitelaskuria k&#xe4;sittelevi&#xe4; metodeja kutsutaan automaattisesti"/>
<node TEXT="COM-objekteilla toteutukset ovat pakollisia">
<node TEXT="Jos AddRef ja Release eiv&#xe4;t toimi, k&#xe4;ytt&#xe4;j&#xe4;n t&#xe4;ytyy itse huolehtia muistinhallinnasta"/>
</node>
<node TEXT="TInterfacedObject, TInterfacedPersistent ja TComponent sis&#xe4;lt&#xe4;v&#xe4;t toimivat toteutukset"/>
</node>
<node TEXT="Delphiss&#xe4; rajapinnat ja luokat eiv&#xe4;t ole samanarvoisia (erityisesti IS -operaattoria ei voi k&#xe4;ytt&#xe4;&#xe4; rajapintojen kanssa">
<node TEXT="Rajapinnan toteuttamisen voi testata IUnknownin QueryInterface-metodilla, Sysutils-kirjaston Supports-funktiolla tai TObject-luokan GetInterface-metodilla"/>
</node>
<node TEXT="Interface-esimerkki"/>
<node TEXT="Rajapintojen k&#xe4;ytt&#xf6;mahdollisuuksia" FOLDED="true">
<node TEXT="Mahdollistavat selke&#xe4;n ja toteutuksesta riippumattoman oliosuunnittelun"/>
<node TEXT="&quot;Moniperint&#xe4;&quot; delegoinnin avulla" FOLDED="true">
<node TEXT="Implements-m&#xe4;&#xe4;re (ks. Delphi help)"/>
<node TEXT="Delegoitavan luokan t&#xe4;ytyy olla TAggregatedObject, muuten muistinhallinta ei toimi oikein"/>
</node>
<node TEXT="&quot;Adapterien&quot; teko: m&#xe4;&#xe4;ritell&#xe4;&#xe4;n rajapinta, jolla voidaan samaistaa eri luokissa olevat loogisesti samanlaiset metodit">
<node TEXT="Esim. interface-esimerkin IAsString"/>
</node>
<node TEXT="Delphiss&#xe4; ei voi tehd&#xe4; suoraan toisiinsa viittavia k&#xe4;&#xe4;nn&#xf6;syksik&#xf6;it&#xe4;. T&#xe4;t&#xe4; voidaan kiert&#xe4;&#xe4; rajapintoja k&#xe4;ytt&#xe4;m&#xe4;ll&#xe4;"/>
<node TEXT="COM- ja CORBA -yhteensopivia komponentteja teht&#xe4;ess&#xe4; (t&#xe4;st&#xe4; lis&#xe4;&#xe4; my&#xf6;hemmin)"/>
</node>
</node>
<node TEXT="DLL" POSITION="left">
<node TEXT="Materiaalia">
<node LINK="http://www.mit.jyu.fi/vesal/kurssit/winohj/html/winmon/m-5.htm#Heading136" TEXT="Win-moniste: Dynaaminen linkitys"/>
<node TEXT="Win32 SDK Reference: Win32 Developer&apos;s Rerefences: Dynamic-Link LIbraries"/>
<node TEXT="Delphi Help: Delphi language reference, Libraries and packages"/>
<node TEXT="BCB Help: DLLs"/>
<node TEXT="Debabrata Sarma: DLLs for Beginners"/>
</node>
<node TEXT="Dynaamisesti linkitetty ohjelmayksikk&#xf6;" FOLDED="true">
<node TEXT="Dynaamisuudesta seuraa, ett&#xe4; kutsuvan ohjelman ei tarvitse tiet&#xe4;&#xe4; kutsuttavan aliohjelman toteutusta"/>
<node TEXT="Kutsurajapinta (parametrityypit ja paluuarvojen tyypit) pit&#xe4;&#xe4; tietysti tiet&#xe4;&#xe4;!"/>
<node TEXT="Mahdollistaa saman koodin kutsumisen eri kielill&#xe4; ja kehitysv&#xe4;lineill&#xe4;" FOLDED="true">
<node TEXT="Huom! K&#xe4;ytt&#xf6;j&#xe4;rjestelm&#xe4;riippuvaista"/>
<node TEXT="DLL:ss&#xe4; oleviin funktioihin on m&#xe4;&#xe4;ritelt&#xe4;v&#xe4; kutsutapa, calling convention - oletuskutsutapa vaihtelee eri kieliss&#xe4;">
<node TEXT="kutsutapa vaikuttaa mm. parametriv&#xe4;lityksen j&#xe4;rjestykseen k&#xe4;&#xe4;nnetyss&#xe4; konekoodissa"/>
<node TEXT="esim. stdcall, fastcall, pascal"/>
<node TEXT="stdcall-kutsutapa on yhteensopiva c(++)-koodin kanssa"/>
</node>
<node TEXT="DLL:ss&#xe4; olevien tiedon siirrett&#xe4;vyys vaihtelee kehitysv&#xe4;lineitt&#xe4;in" FOLDED="true">
<node TEXT="dll ei itsess&#xe4;&#xe4;n sis&#xe4;ll&#xe4; tyyppitietoja (bpl-tiedostot sis&#xe4;lt&#xe4;v&#xe4;t)"/>
<node TEXT="seuraus: windowsin standardityyppej&#xe4; kaytt&#xe4;v&#xe4;t funktiot toimivat aina, mutta...">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
<node TEXT="esim. visual c++ tukee my&#xf6;g globaalien muuttujien ja luokkien sijoittamista dll:iin, mutta n&#xe4;iden toimivuus muilla kehitysv&#xe4;lineill&#xe4; on ep&#xe4;varmaa"/>
<node TEXT="delphill&#xe4; tehtyjen komponenttien ja lomakkeiden hajauttamiseen on parasta k&#xe4;ytt&#xe4;&#xe4; Borlandin pakettitiedostoja"/>
</node>
</node>
<node TEXT="Ohjelman toteutuksen osia voi vaihtaa &quot;lennossa&quot; ilman, ett&#xe4; ohjelmaa tarvitsee k&#xe4;&#xe4;nt&#xe4;&#xe4; uudelleen"/>
<node TEXT="DLL:t voivat sis&#xe4;lt&#xe4;&#xe4; datan ja koodin lis&#xe4;ksi my&#xf6;s resursseja (bittikarttoja, merkkijonotauluja...)"/>
</node>
<node TEXT="Linkitystavat (ks. kuva)" FOLDED="true">
<node TEXT="Staattinen linkitys" FOLDED="true">
<node TEXT="Kaikki k&#xe4;&#xe4;nn&#xf6;syksik&#xf6;t (c:ss&#xe4; obj tai lib, pascalissa dcu) linkitet&#xe4;&#xe4;n k&#xe4;&#xe4;nn&#xf6;ksen j&#xe4;lkeen yhdeksi tiedostoksi"/>
<node TEXT="jos jotain k&#xe4;&#xe4;nn&#xf6;syksikk&#xf6;&#xe4; muutetaan, ohjelma t&#xe4;ytyy linkitt&#xe4;&#xe4; uudelleen"/>
</node>
<node TEXT="Dynaaminen ohjelman k&#xe4;ynnistyess&#xe4;" FOLDED="true">
<node TEXT="C:ss&#xe4; DLL-tiedostoon viitataan LIB-kirjastolla, joka sis&#xe4;lt&#xe4;&#xe4; tiedon DLL:ss&#xe4; olevista funktioista (delphill&#xe4; riitt&#xe4;&#xe4; funktiom&#xe4;&#xe4;ritys external-lis&#xe4;m&#xe4;&#xe4;reell&#xe4;)"/>
<node TEXT="LIB-tiedosto linkitet&#xe4;&#xe4;n staattisesti, DLL ladataan ohjelman alussa ja vapautetaan lopussa"/>
</node>
<node TEXT="Dynaaminen ajonaikainen" FOLDED="true">
<node TEXT="&quot;Totaalisen dynaaminen&quot; linkitys: DLL:st&#xe4; ei tarvitse tiet&#xe4;&#xe4; linkitysaikana mit&#xe4;&#xe4;n"/>
<node TEXT="vrt. dynaaminen muistinvaraus: DLL ladataan ja vapautetaan kesken ohjelman suorituksen tarvittaessa"/>
<node TEXT="DLL.n funktiot t&#xe4;ytyy &quot;onkia&quot; yksi kerrallaan GetProcAddress-funktiolla ja sijoittaa funktio-osoittimilla paikoilleen"/>
</node>
</node>
<node TEXT="DLL jaettuna ohjelmatiedostona" FOLDED="true">
<node TEXT="DLL:n koodi ladataan muistiin vain kerran, vaikka useampi ohjelma k&#xe4;ytt&#xe4;isi sit&#xe4; =&gt; muistin s&#xe4;&#xe4;st&#xf6;&#xe4;">
<node TEXT="Jokainen prosessi saa oman viittauksen globaaliin kekoon, jossa DLL sijaitsee fyysisesti (memory mapping)"/>
<node TEXT="WIN32:ssa dll:n globaalit muuttujat varataan k&#xe4;ytt&#xe4;ville sovelluksille erikseen"/>
</node>
<node TEXT="jokainen dll sis&#xe4;lt&#xe4;&#xe4; oman muistiavaruutensa">
<node TEXT="seuraus: eri sovellukset eiv&#xe4;t voi vaihtaa tietoja vain dll:aa k&#xe4;ytt&#xe4;m&#xe4;ll&#xe4;"/>
<node TEXT="Huom. VL.n win-monisteessa mainittua globaalien muuttujien ongelmaa ei ole 32-bittisess&#xe4; windowsissa."/>
<node TEXT="globaalien muuttujien kanssa edelleen potentiaalisia ongelmia, jos kutsuva sovellus on monis&#xe4;ikeinen"/>
</node>
<node TEXT="kun dll-koodi ladataan ohjelmaan, siit&#xe4; ajetaan alustuskoodi (dll:n &apos;p&#xe4;&#xe4;ohjelma&apos;)"/>
<node TEXT="dll:lle voidaan m&#xe4;&#xe4;ritell&#xe4; my&#xf6;s erillinen &apos;entry point&apos;-funktio">
<node TEXT="entry point-funktiota kutsutaan, kun ohjelma lataa tai poistaa dll:n muistista"/>
<node TEXT="windowsissa kutsutaan my&#xf6;s silloin, kun sovelluksessa k&#xe4;ynnistet&#xe4;&#xe4;n tai lopetetaan s&#xe4;ie"/>
</node>
</node>
<node TEXT="Funktioiden nimist&#xe4;" FOLDED="true">
<node TEXT="C++:lla kirjoitetun DLL.n funktioiden nimet tulevat sekoitetussa (mangled) muodossa">
<node TEXT="DLL:ss&#xe4; olevien funktioiden nimet saa selvitetty&#xe4; IMPDEF-komentoriviohjelmalla"/>
</node>
<node TEXT="Sekoitetun muodon voi v&#xe4;ltt&#xe4;&#xe4; viem&#xe4;ll&#xe4; funktiot C-muodossa ( extern &quot;C&quot; { ... })">
<node TEXT="ei koske Visual C++:aa :-("/>
</node>
<node TEXT="Delphill&#xe4; tehdyiss&#xe4; DLL-tiedostoissa ei ongelmia"/>
<node TEXT="Huom! IMPDEF-ohjelmaa voi k&#xe4;ytt&#xe4;&#xe4; my&#xf6;s esim. Windowsin DLL-kirjastoihin selvitt&#xe4;m&#xe4;&#xe4;n, mit&#xe4; API-kutsuja on k&#xe4;ytett&#xe4;viss&#xe4;..."/>
</node>
<node TEXT="Esimerkki: pvm"/>
</node>
</node>
</map>
