COM-asiakkaat. Tässä luvussa. Ennen kuin aloitat. Oppitunti 1: COM-asiakasohjelmat 404. Oppitunti 2: COM-objektien uudelleen käyttö 414
|
|
- Sanna Laine
- 8 vuotta sitten
- Katselukertoja:
Transkriptio
1 403 L U K U 1 0 COM-asiakkaat Oppitunti 1: COM-asiakasohjelmat 404 Oppitunti 2: COM-objektien uudelleen käyttö 414 Laboratorio 10: UploadStockData-komponentin toteutus 421 Kertaus 431 Tässä luvussa Tässä luvussa opit lisää siitä, kuinka sovellukset ja komponentit toimivat COMpalvelinkomponenttien asiakkaina ja kuinka ne hyödyntävät komponenttien tarjoamia palveluja. Opit, kuinka Microsoft Visual C++:n kääntäjä yksinkertaistaa COM-asiakkaan koodin kirjoittamista. Opit myös, kuinka tehdään COMobjekteja, jotka voivat sisältää toisia COM-objekteja. Ennen kuin aloitat Ennen kuin aloitat tämän luvun läpikäymisen sinun tulisi lukea luvut 2-9 ja suorittaa niihin liittyvät tehtävät.
2 404 Microsoft Visual C MCSD Training Kit Oppitunti 1: COM-asiakassovellukset Tällä oppitunnilla luodaan yksinkertainen sovellus, joka käyttää luvun 9 harjoituk-sissa tehtyä Encoder COM-komponenttia. Sovellus käyttää MIDLkääntäjän EncodeServer.idl-tiedostosta luomia header-tiedostoja. Oppitunnin jälkipuoliskolla kerrotaan Visual C++ -kääntäjän ominaisuukista, jotka tukevat COM-asiakassovellusten ja komponenttien luomista ja luodaan EncodeClientsovellus uudelleen näiden menetelmien avulla. Tämän oppitunnin jälkeen: Tiedät, kuinka asiakassovellus voi käyttää MIDL-kääntäjän generoimia header-tiedostoja. Tunnet Visual C++ COM -kääntäjä tuen ominaisuudet. Tiedät, kuinka tyyppikirjasto tuodaan projektiin. Oppitunnin arvioitu kesto: 30 minuuttia COM-palvelimen Header-tiedostot Luvussa 9 opit, kuinka MIDL-kääntäjä muodostaa header-tiedostot, joiden kautta COM-palvelimen rajapinta ja GUID-määrittelyt saadaan C ja C++ - asiakkaiden käyttöön. Nämä tiedostot on generoitu Encoder-komponentille ja ne ovat nimiltään EncodeServer.h ja EncodeServer_i.c. EncodeServer_i.c-tiedosto sisältää seuraavan koodin, jossa määritellään Encoder-komponentin määrittämät GUID:t helposti luettavina (ja kirjoitettavina) vakioina: const IID IID_IEncoder = 0x69F4B926,0x6641,0x11D3,0x93,0x4B,0x00,0x80,0xC7,0xFA,0x0C,0x3E; const IID LIBID_ENCODESERVERLib = 0x69F4B91A,0x6641,0x11D3,0x93,0x4B,0x00,0x80,0xC7,0xFA,0x0C,0x3E; const CLSID CLSID_Encoder = 0x69F4B917,0x6641,0x11D3,0x93,0x4B,0x00,0x80,0xC7,0xFA,0x0C,0x3E; The IID and CLSID types are defined earlier in the file as C structures that represent a GUID. At the heart of the EncodeServer.h file is the following C++ declaration (comments have been removed for clarity): MIDL_INTERFACE( 69F4B D3-934B-0080C7FA0C3E ) IEncoder : public Iunknown
3 Luku 10 COM-asiakkaat 405 public: virtual HRESULT STDMETHODCALLTYPE EncodeString( const BSTR instring, BSTR RPC_FAR *outstring) = 0; virtual HRESULT STDMETHODCALLTYPE get_key( short RPC_FAR *pval) = 0; ; virtual HRESULT STDMETHODCALLTYPE put_key( short newval) = 0; Tämä koodi määrittelee abstraktin luokan IEncoder (joka on periytetty abstraktista luokasta IUnknown), joka sisältää IEncoder COM-rajapinnan julkistamia metodeja vastaavat jäsenmetodit. MIDL_INTERFACE-makro yhdistää Microsoftin erityisen declspec(uuid())-määrittäjän avulla rajapinnan GUID:n luokan kanssa. Avainsanaa uuidof() voidaan tällä tavoin soveltaa luokkaan liitetyn vakio-guid:n esille saamiseen. Asiakasohjelmat käyttävät näihin header-tiedostoihin talletettuja määrittelyjä apuna luodessaan IEncoder-luokkaan osoittimia, jotka voidaan välittää funktiolle CoCreateInstance(), seuraavassa esimerkissä esitetyllä tavalla: IEncoder * pserver; HRESULT hr = ::CoCreateInstance(CLSID_Encoder, NULL, CLSCTX_INPROC_SERVER, IID_IEncoder, (void **) &pserver); Jos tämä fuktion kutsu onnistuu luomaan Encoder COM-objektin, pservermuuttuja ottaa vastaan osoittimen COM-objektin vtableen. pserver-osoitinta voidaan tämän jälkeen käyttää kutsuttaessa IEncoder-rajapinnan metodeja. Jotta saisimme paremman käsityksen EncodeServer.h ja EncodeServer_i.c header-tiedostojen käytöstä, teemme yksinkertaisen konsoliohjelman, EncodeHello, joka esittää Encoder COM-objektin avulla koodatun Hello World - tekstin. EncodeHello-sovelluksen luominen 1. Valitse Visual C++:n File-valikosta New. Valitse projektin tyypiksi Win32 Console Application ja kirjoita projektin nimeksi EncodeHello. Napauta OK. 2. Valitse Win32 Console Application Wizardin vaiheessa 1 A simple application ja napauta Finish. Luo projekti napauttamalla OK.
4 406 Microsoft Visual C MCSD Training Kit 3. Kopioi Resurssienhallinnassa tiedostot EncodeServer.h ja EncodeServer_i.c EncodeServer-projektin kansiosta EncodeHello-projektin kansioon. 4. Etsi ja avaa FileViewissä EncodeHello.cpp-tiedosto. Lisää tiedoston alkuun seuraavat rivit: #include <iostream.h> #include EncodeServer.h #include EncodeServer_i.c 5. Lisää Main()-funktion runkoon koodia niin, että se näyttää seuraavalta: (Tämä koodi on asennettu oheisrompulta tiedostoon CH10_01.cpp.) int main(int argc, char* argv[]) ::CoInitialize(NULL); IEncoder * pserver; HRESULT hr = ::CoCreateInstance(CLSID_Encoder, NULL, CLSCTX_INPROC_SERVER, IID_IEncoder, (void **) &pserver); if(succeeded(hr)) short nkey = 1; cout << Enter a code key between -5 and 5: ; cin >> nkey; wchar_t wstrhello[16] = L Hello World! ; BSTR bstrhello = ::SysAllocString(wstrHello); BSTR bstrcodedhello; HRESULT hr = pserver->put_key(nkey); if(failed(hr)) goto ComError; hr = pserver->encodestring(bstrhello, &bstrcodedhello); if(failed(hr)) goto ComError; char strout[16]; wcstombs(strout, bstrcodedhello, 16); cout << \n << strout << \n\n ; ComError: if(failed(hr)) cout << COM Error << \n\n ; ::SysFreeString(bstrHello); ::SysFreeString(bstrCodedHello);
5 Luku 10 COM-asiakkaat 407 pserver->release(); ::CoUninitialize(); return 0; CoInitialize()-funktio kutsuu CoInitializeEx()-funktiota parametrillä COINIT_APARTMENTTHREADED. Luvun 8 oppitunnilla 4 opit, kuinka CoInitializeEx()-funktiota täytyy kutsua COM-kirjastojen alustamiseksi nykyisessä säikeessä ja luotavan COM-objektin säiemallin määrittämiseksi. Jokaista CoInitialize() tai CoInitializeEx() -funktion kutsua kohden täytyy suorittaa CoUninitialize()-funktion kutsu, joka sulkee nykyisen säikeen COM-kirjaston. EncodeHello.cpp-tiedoston koodi on hyvin suoraviivainen luodaan Encoder COM -objektin ilmentymä, Key-ominaisuudelle asetetaan käyttäjän antama ar-vo, ja Hello World! -merkkijono koodataan kutsumalla EncodeString()-metodia. Huomaa funktion loppupuolella oleva IUnknown::Release()-kutsu. Luvun 8 oppitunnilla 1 opit, että käytettäessä CoCreateInstance()-funktiota rajapinnan osoittimen hankkimiseen, palvelimen viittauslaskimen arvoa kasvatetaan. Viittauslaskimen arvon pienentäminen rajapinnan osoittimen käytön loputtua on asiakkaan vastuulla ja se suoritetaan Release()-kutsulla. 6. Varmista EncodeHello-sovelluksen toimivuus kääntämällä ja käynnistämällä. Visual C++ -kääntäjän tuki COM:lle Microsoft esitteli Visual C++ 5.0:ssa joukon luokkia ja C++-kielen laajennuksia, jotka yksinkertaistavat COM-asiakasohjelmien tekemistä. Näihin kuuluvat _com_ptr_t, joka on COM-rajapinnan osoittimen kapseloiva osoitinluokka ja _bstr_t- ja _variant_t-luokat, jotka kapseloivat BSTR- ja VARIANTtietotyypit. Mukana on myös COM-poikkeusluokka _com_error. Saat nämä luokat käyttöösi sisällyttämällä (#include-komennolla) koodiisi comdef.htiedoston. Toinen uusi Visual C++ 5.0:ssa tullut uusi piirre on #import-direktiivi, joka generoi C++-headertiedostoja COM-palvelinobjektin tyyppikirjaston pohjalta. Näissä headertiedostoissa käytetään laajasti _com_ptr_t-luokkaa ja käytetään _bstr_t ja _variant_t -luokkia siellä, missä BSTR- ja VARIANTtietotyypit ovat käytössä. Visual C++:n COM-kääntäjän ominaisuudet on kuvattu tarkemmin seuraavissa jaksoissa.
6 408 Microsoft Visual C MCSD Training Kit _com_ptr_t _com_ptr_t-luokka on malliluokka, joka kapseloi COM-rajapinnan osoittimen. Luokka sisältää jonkin verran lisäkoodia, joka yksinkertaistaa viittausten laskemista. _com_ptr_t-objekti kutsuu kapseloidun rajapinnan IUnknown::AddRef() ja IUnknown::Release() -metodeja puolestasi varmistaakseen, että rajapinnan sisältämien COM-objektien elinaikaa käsitellään oikein. AddRef()-funktiota kutsu-taan automaattisesti, kun _com_ptr_t-objekti luodaan olemassaolevan rajapinnan osoittimen kopiona, ja Release()-funktiota kutsutaan automaattiseti, kun _com_ptr_t-objektin käyttö loppuu. Vaikka tämä älykäs toiminto tekeekin lähdekoodista luettavampaa, älä anna _com_ptr_t-luokan vaivuttaa itseäsi väärään turvallisuuden tunteeseen. Sinun tulisi olla koko ajan selvillä koodissa käytetyistä COM-objekteista, ja tietää koska AddRef() ja Release() -funktioita tulee kutsua vaikka älykäs osoitin tekisikin sen puolestasi. Yksinkertaisin tapa _com_ptr_t-mallin alustamiseen tiettyyn rajapintatyyppiin on luoda _com_ptr_t-objekti _COM_SMARTPTR_TYPEDEF-makron avulla. Tämä makro ottaa määrätyn rajapinnan nimen ja yksilöllisen GUID:n ja määrittelee _com_ptr_t, jonka nimeksi tulee rajapinnan nimi varustettuna etuliitteellä Ptr. Esi-merkiksi tiedostossa, joka sisältää EncodeServer.h ja EncodeServer_i.c header-tiedostot, seuraava rivi määrittelee_com_ptr_t sovituksen IEncoderPtr:lle: _COM_SMARTPTR_TYPEDEF(IEncoder, uuidof(iencoder)); Alustetun tyypin ilmentymät voivat tämän jälkeen kutsua com_ptr_t:n jäsenfunktiota CreateInstance(), jonka avulla ne saavat osoittimen COMpalvelimelle seuraavasti: IEncoderPtr penc ; penc.createinstance(clsid_encoder); Osoitinta voidaan tämän jälkeen käyttää rajapinnan metodien kutsumiseen hyödyntämällä com_ptr_t:n ylikuormittamaa ->-operaattoria seuraavasti: int n = 3; HRESULT hr = penc->put_key(n); Huomaa, että _com_ptr_t:n jäsenfunktioita kutsutaan käyttämällä piste-operaattoria (kuten kutsuttaessa CreateInstance()) ja että rajapinnan metodeja kutsutaan käyttämällä ylikuormitettua ->-operaattoria (kuten put_key()-metodia kutsuttaessa juuri nähtiin). On myös mahdollista luoda _com_ptr_t-objekteja olemassaolevasta COMrajapinnan osoittimesta tai kopioimalla toisesta _com_ptr_t-objektista. Visual C++:n ohje antaa tarkemmat ohjeet AddRef() ja Release() -metodien käytöstä näissä tapauksissa.
7 Luku 10 COM-asiakkaat 409 _bstr_t _bstr_t-objekti kapseloi BSTR-tietotyypin. Luokka huolehtii resurssien allokoinnista ja deallokoinnista käyttämällä SysAllocString() ja SysFreeString() -funktioiden sisäisiä kutsuja ja käyttää viittausten laskentaa käyttääkseen muistia tehokkaasti. Luokka sisältää joukon operaattoreita, joiden avulla voit käyttää _bstr_t-objektia yhtä helposti kuin CString-objektia. Yksi operaattori, jota ei kuitenkaan tarjota käyttöön, on & address of -operaattori, joten et voi välittää _bstr_t-objektin osoitetta funktioille, jotka odottavat BSTR*-objektia. _variant_t _variant_t-objekti on ohut kääre VARIANT-tietotyypille. Luokka hoitaa kapseloidun VARIANT-tyypin luomisen ja tuhoamisen käyttämällä sisäisiä API-funktioiden VariantInit() ja VariantClear() -kutsuja. _variant_t-objekti sisältää muodostimen ja operaattorit, joiden avulla VARIANT-tyypin luominen ja käsitteleminen on helppoa. _com_error _com_error-objekti edustaa COM:n poikkeuksia ja kapseloi lähes kaikkien COM-rajapintojen metodien palauttamat HRESULT-koodit. _com_errorobjektin voidaan nostaa _com_raise_error()-funktiolla. Lisätietoja _com_error-objektista saat luvun 13 oppitunnilla 2. Import-direktiivi Esikäsittelijän #import-direktiivin avulla voidaan generoida C++ header-tiedosto COM-objektista ja sen rajapinnoista tyyppikirjaston pohjalta. Tämä on hyödyllistä, jos et pääse käsiksi MIDL-luomaan header-tiedostoon; tyyppikirjasto on lähes aina käytettävissä, koska se on tavallisesti sidottu palvelimen DLL tai EXE -tiedostoon. #import-esikäsittelijä luo myös joukon älykkäitä osoittimia, joiden avulla voidaan käsitellä COM-objektin rajapintoja. Kun käytät #import-direktiiviä, Visual Studion C-kääntäjän esikäsittelijä luo kaksi otsikkotiedostoa, joissa tyyppikirjaston sisältö on rakennettu uudelleen C++-lähdekoodiksi. Pääotsikkotiedosto vastaa MIDL:n muodostamaa tiedostoa, jossa se määrittelee C++-funktiot, joita käytetään COM-objektin julkistaman rajapinnan metodien kutsumiseen. Se määrittelee myös lisäfunktioita, jotka käärivät sisäänsä suorat rajapintojen metodit tarjoten käyttöön ominaisuudet ja metodit samaan tapaan kuin Visual Basic -asiakkaat. Ominaisuuksia voidaan käsitellä luokan jäsenmuuttujien kautta, ja metodit on kiedottu niin, että paluuarvoina annetaan [out, retval]-parametrit. HRESULT-arvo käännetään jos se ilmoittaa virheestä, nostetaan _com_error-poikkeus. _bstr_t ja _variant_t luokkia käytetään näiden kiedottujen funktioiden argumenttien ja paluuarvojen tyyppeinä aina kun se muu-ten on mahdollista.
8 410 Microsoft Visual C MCSD Training Kit Pääotsikkotiedoston nimi on sama kuin vastaavan tyyppikirjaston tai dynaamisesti linkitetyn tiedoston nimi, lukuun ottamatta tarkenninta.tlh. Toisella otsikkotiedostolla on sama nimi kuin tyyppikirjastolla lukuun ottamatta.tli-tarkenninta. Toinen otsikkotiedosto sisältää kääntäjän muodostamat käärefunktiot ja se sisällytetään (#include-komnnon avulla) pääotsikkotiedostoon. Molemmat otsikkotiedostot sijoitetaan output-hakemistoon. Kääntäjä lukee ja kääntää ne, mikäli pääotsikkotiedosto on osoitettu #include-direktiivillä. Pääotsikkotiedosto sisältää COM-objektien julkistamien rajapintojen älykkäiden osoittimien määritelmät. _COM_SMARTPTR_TYPEDEF-makroa käytetään kaikkien tyyppikirjastossa määriteltyjen _com_ptr_t-mallien muodostamiseen. comdef.h-tiedosto, joka sisältää kääntäjän tukiluokkien määrittelyt, sisällytetään.tlh-tiedostoon. Seuraavassa harjoituksessa näet, kuinka #import-direktiiviä käytetään tyyppikirjaston tuomiseen ja kuinka asiakasohjelmassa käytetään muodostettuja osoittimia ja käärefunktioita. Muokkaamme aiemmin tässä luvussa tehtyä EncodeHello-sovellusta. EncodeServer-tyyppikirjaston tuominen 1. Palaa EncodeHello-projektiin. Etsi FileViewissä StdAfx.h-tiedosto. 2. Lisää //AFX_INSERT_LOCATION-kommentin eteen seuraavan kaltainen rivi: #import C:\EncodeServer\Debug\EncodeServer.dll no_namespace Varmista, että kirjoitat EncodeServer.dll-tiedostolle oikean polun. Se on todennäköisesti koneellasi erilainen kuin mallissa. no_namespace-attribuutti täytyy määritellä. Näin varmistetaan, että tyyppikirjastosta generoitu luokka määritellään globaaliin nimialueeseen. 3. Tallenna ja sulje StdAfx.h-tiedosto. Napauta FileViewissä hiiren kakkospainikkeella StdAfx.cpp-tiedostoa ja valitse pikavalikosta Compile StdAfx.cpp. 4. Kun käännös on valmis, etsi tiedostot EncodeServer.tlh ja EncodeServer.tli EncodeServer\Debug -kansiosta. Tarkista.tlh-tiedoston sisältö. Huomaa, että IEncoderPtr-osoittimen määrittely on tehty seuraavalla rivillä: _COM_SMARTPTR_TYPEDEF(IEncoder, uuidof(iencoder)); Huomaa myös seuraavat jäsenfunktioiden määrittelyt IEncoder-struktuurin määrittelyssä: // Property data declspec(property(get=getkey,put=putkey)) short Key;
9 Luku 10 COM-asiakkaat 411 // Wrapper methods for error-handling _bstr_t EncodeString (_bstr_t instring); short GetKey (); void PutKey (short pval); // Raw methods provided by interface virtual HRESULT stdcall raw_encodestring (BSTR instring, BSTR * outstring) = 0; virtual HRESULT stdcall get_key (short * pval) = 0; virtual HRESULT stdcall put_key (short pval) = 0; Lopussa olevat raaka -metodit ovat vastaavia kuin MIDL-kääntäjän EncodeServer.h-tiedostoon muodostamat. Kääremetodit näyttävät kuitenkin paljon enemmän tavallisen C++-luokan sisältämiltä metodeilta. Huomaa, että Key-jäsenmuuttujan määrittelyssä käytetään declspec(property)-määrittelijää. Sen avulla luokan käyttäjät pystyvät käsittelemään Get ja Put -funktioita käyttämällä Key-muuttujaa sijoituslauseen vasemmalla ja oikealla puolella. Huomaa myös, että nämä funktiot käyttävät _bstr_t-luokkaa argumentteina ja paluuarvoina. Käärefunktioiden toteutukset ovat tiedostossa EncodeServer.tli. GetKey()- funktion toteutus, joka seuraa tuonnempana, havainnollistaa, kuinka [out, retval] parametrit välitetään takaisin paluuarvoina ja kuinka HRESULT-arvo tulkataan ja mahdollisesti aiheutetaan poikkeus. inline short IEncoder::GetKey () short _result; HRESULT _hr = get_key(&_result); if (FAILED(_hr)) _com_issue_errorex(_hr, this, uuidof(this)); return _result; Nyt kun tyyppikirjasto on tuotu, voidaan sovelluksen koodia muuttaa niin, että siinä hyödynnetään tyyppikirjaston tuomisen seurauksena syntyneitä luokkia. EncodeHello-sovelluksen koodin muokkaaminen 1. Poista seuraavat #include-direktiivit EncodeHello.cpp-tiedoston alusta: #include EncodeServer.h #include EncodeServer_i.c
10 412 Microsoft Visual C MCSD Training Kit 2. Muutetaan EncodeHello-sovelluksen Main()-funktio seuraavanlaiseksi: (Tämä koodi on asennettu oheisrompulta tiedostoon CH10_02.cpp.) int main(int argc, char* argv[]) CoInitialize(NULL); IEncoderPtr pserver; HRESULT hr = pserver.createinstance( uuidof(encoder)); if(succeeded(hr)) short nkey = 1; cout << Enter a code key between -5 and 5: ; cin >> nkey; _bstr_t bstrhello = Hello World! ; _bstr_t bstrcodedhello; try pserver->key = nkey; bstrcodedhello = pserver->encodestring(bstrhello); cout << \n << (const char *) bstrcodedhello << \n\n ; catch(_com_error e) cout << e.errormessage() << \n\n ; ::CoUninitialize(); return 0; Huomaa tässä esimerkissä, että sovelluksen koodi sijoitetaan omaan koodilohkoonsa CoInitialize() ja CoUninitialize() kutsujen väliin. Näin varmistetaan, että pserver-muuttuja poistuu käytöstä ennen CoUninitialize()-funktion kutsua, joka sulkee COM-kirjastot. Kun pserver on tarpeeton, _com_ptr_t-tuhoaja kutsuu kapseloidun IEncoder-osoittimen Release()-metodia. Jos tämä tapahtuu sen jälkeen, kun COM-kirjastot on suljettu, katastrofi on valmis.
11 Luku 10 COM-asiakkaat 413 Huomaat, että tämä koodi on paljon helpompilukuinen kuin aiempi versio, ja että se muistuttaa läheisesti tavallista C++-koodia, jossa ei käytetä COM:a. Älä anna ulkonäön pettää on joka tapauksessa mahdotonta kirjoittaa tehokasta ja virheetöntä COM-koodia tuntematta allaolevaa tekniikkaa. Oppitunnin yhteenveto MIDL-kääntäjä muodostaa otsikkotiedostoja, joiden avulla COM-palvelimen rajapinnat ja GUID-määrittelyt saadaan käyttöön C ja C++ -asiakkaiden lähdekoodissa. Näissä tiedostoissa märitellään rakenteet, joita voidaan käyttää COM-objektin muodostamien rajapintojen käsittelmiseen. GUID määrittelyjen luettavat versiot määritellään myös. Visual C++ COM -kääntäjä sisältää #import-lauseen, jonka avulla voit luoda COM-objektin ja sen rajapintojen otsikkotiedostot tyyppikirjastossa olevien tietojen perusteella. Muodostetuissa tiedostoissa käytetään paljon _com_ptr_tosoitinluokkaa, _com_error-poikkeusluokkaa ja muita Microsoftin omia C++kielen laajennuksia, joiden avulla COM-rajapinta kääritään ja helpotetaan asiakkaan ohjelmointia. _bstr_t ja _variant_t -luokat helpottavat BSTR ja VARIANT-tietotyyppien käyttämistä.
12 414 Microsoft Visual C MCSD Training Kit Oppitunti 2: COM-objektien uudelleenkäyttö Yksi olio-ohjelmoinnin tärkeimmistä eduista on mahdollisuus koodin uudelleenkäyttöön. Kun olet luonut objektin, joka suorittaa tarkasti määritellyn palvelun tehokkaasti ja virheettömästi, haluat todennäköisesti käyttää kyseistä objektia useita kertoja. Tällä oppitunnilla opit eri tapoja, joilla COM-objekti voi käyttää muiden COM-objektien palveluja. Erityisesti käsitellään kahta tavallisinta uudelleenkäyttötekniikkaa, sisällytystä ja koostamista. Nämä tekniikat mahdollistavat olemassaolevan COM-objektin upottamisen kehitettävään COM-objektiin, paljastamalla upotetun objektin rajapinnat sen sisältävän objektin rajapintoina. Tämän oppitunnin jälkeen: Tiedät eron toteutuksen ja rajapintojen periyttämisen välillä. Tiedät sisällyttämisen ja koostamisen välisen eron objekteja uudellen käytettäessä. Tiedät, kuinka koostettavan objektin IUnknown-rajapinta toteutetaan. Tiedät, kuinka koostaminen toteutetaan ATL:ssä. Oppitunnin arvioitu kesto: 30 minuuttia Objektien uudelleenkäyttö C++:ssa ja COM:ssa C++-ohjelmoijat käyttävät yleensä valmiita luokkia käyttämällä joko sisällytys (containment) tai periyttämis (inheritance) -tekniikkaa. Sisällyttäminen tarkoittaa objektin määrittämistä luokan sisällä, kuten seuraavassa esimerkissä nähdään: #include Acme.h // Contains AcmeViewer class definition // Defines the member functions SetFile() and Display() class MyViewer protected: AcmeViewer m_obj; public: MyViewer() m_obj.setfile( C:\images\scully.gif, AV_TYPE_GIF); DisplayGif() m_obj.display(); Tässä koodissa määritellään yksinkertainen luokka MyViewer, joka sisältää valmiiksi olemassaolevan AcmeViewer-luokan ilmentymän. MyViewer uudelleenkäyttää AcmeViewer-luokan koodin. MyViewer-muodostin luo sisäl-
13 Luku 10 COM-asiakkaat 415 lytetyn AcmeViewer-objektin, ja MyViewer::DisplayGif()-funktio käyttää AcmeViewer-objektin tarjoamia palveluja. MyViewer-luokka voi hallita AcmeViewer-objektin käyttöä ja tapaa, jolla objektin palveluja käytetään. Periyttäminen on tehokas uudelleenkäyttömenetelmä, joka on keskeinen osa C++-kieltä. AcmeViewer-luokasta aikaisemmin saamiesi tietojen perusteella pitäisi olla itsestään selvää, että seuraava määrittely: #include Acme.h class MyViewer : public AcmeViewer public: MyViewer() SetFile( C:\images\scully.gif, AV_TYPE_GIF); antaa mahdollisuuden kutsua AcmeViewer-luokan suojattuja ja suojaamattomia jäsenfunktioita MyViewer-objektin jäsenfunktioina, seuraavasti: MyViewer aviewer; aviewer.display(); COM tukee sisällyttämistä, mutta ei tue periyttämistä samalla tavalla kuin C++. Edellisessä esimerkissä MyViewer-luokka perii AcmeViewer-luokan tarjoamat toiminnot. AcmeViewer-luokan suojatut ja suojaamattomat jäsenfunktiot ovat MyViewer-luokan käytettävissä. Tällaisessa tapauksessa puhutaan toteutuksen periyttämisestä. COM ei tue toteutuksen periyttämistä. COM erottaa COM-objektin tarjoaman rajapinnan ja sen varsinaisen toteutuksen loogisesti toisistaan. Julkistettu COMrajapinta, joka identifioidaan maailmalla GUID:nsa perusteella on muuttumaton sen on taattu pysyvän muuttumattomana. Vaikka olisi olemassa monia COMobjekteja, jotka toteuttavat rajapinnan määrittämän toiminnallisuuden useilla eri tavoilla, asiakas tietää aina, kuinka näiden objektien kanssa kommunikoidaan. Ra-japinta edustaa COM-palvelimen ja asiakkaan välistä sopimusta, joka määrittelee, millaista tietoa objekti odottaa saavansa ja millaista tietoa se palauttaa. Toteutuksen periyttäminen tekee periytetystä luokasta riippuvaisen kantaluokan toteutuksesta. Jos kantaluokan toteutus muuttuu, periytyminen voi lakata toimimasta oikein ja tarvitsisi näin ollen toteutuksensa muuttamista. Tämä aiheuttaa ongelmia suurissa ohjelmointitöissä, erityisesti, jos kantaluokan lähdekoodi ei ole käytettävissä. COM-objektien rajapinnan ja toteutuksen erottaminen toisistaan pienentää näitä ongelmia, mutta tarkoittaa samalla, että et voi uudelleenkäyttää COM-komponentteja periyttämällä niitä toisistaan kuten C++-luokkia.
14 416 Microsoft Visual C MCSD Training Kit COM tukee periyttämisen muotoa, jota kutsutaan rajapinnan periyttämiseksi. Rajapinnat tehdään C++:ssa vain virtuaalifunktioita sisältävinä abstrakteina luokkina, jotka määrittelevät, mutta eivät toteuta, rajapinnan metodit. Periyttämällä rajapinnan toisesta määrittelet vtablen rakenteen. Vtable sisältää toteutettujen metodien osoittimet. Seuraava määrittely esimerkiksi luo oikein rakennetun vtablen, joka sisältää osoittimet kolmelle IUnknown-metodille, joita seuraavat IEncoder-metodien osoittimet: IEncoder : public IUnknown // IEncoder methods declared here Rajapintojen periyttämisen tekee mahdolliseksi COM-rajapintojen muuttumattomuus. Voit periyttää COM-rajapinnan mistä tahansa toisesta COM-rajapinnasta ja voit olla varma, ettei kukaan muuta kantarajapintaa tietämättäsi ja näin sekoita vtableasi. Sisällyttäminen ja koostaminen COM-objektien tekijät voivat uudelleenkäyttää olemassa olevia COM-objekteja, joko sisällyttämällä (containment) tai koostamalla (aggregation). Termit sisällyttäminen ja koostaminen viittaavat tapaan, jolla toinen objekti (ulompi objekti, outer object) uudelleen käyttää toista objektia (sisempi objekti, inner object). Sisällyttäminen COM:n sisällyttäminen toimii samaan tapaan kuin C++:n sisällyttämistekniikka, josta kerrottiin aiemmin tällä oppitunnilla. Ulompi objekti luo sisemmän objektin (tavallisesti kutusmalla CoCreateInstance()-funktiota) ja varastoi viittauksen sisempään objektin tietojäseneensä. Ulompi objekti toteuttaa sisemmän objektin rajapinnat sovitinrajapintojen avulla. Sovitinrajapinta ohjaa metodien kutsut sisemmälle objektille. Kuvassa 10.1 nähdään, kuinka ICar-rajapinnan sisältävä COM-objekti sisältää COM-objektin, jolla on IVehicle-rajapinta ja kuinka ulompi objekti julkistaa molemmat rajapinnat.
15 Luku 10 COM-asiakkaat 417 Kuva 10.1 COM:n sisällyttäminen Ulomman objektin ei tarvitse julkistaa kaikkia sisemmän objektin rajapintoja. Kuten C++ sisällyttämisessäkin, ulomman objektin rajapinta kontrolloi sisemmän objektin rajapintojen käsittelyä, ja voi myös kontrolloida tapaa, jolla sisemmän kontrollin rajapintoja käytetään. Ulompi objekti ei ohjaa mitään sisemmän objektin IUnknown-rajapinnalle meneviä kutsuja eteenpäin, koska sisemmällä objektilla ei ole mitään tietoa ulomman objektin julkistamista rajapinnoista. Jos esimerkiksi kuvassa 10.1 kuvatun objektin asiakas pyytää IUnknown-osoittimen, se olettaa voivansa käyttää tämän osoittimen avulla ICar-rajapintaa siinä kuin IVehicle-rajapintaakin. Sisemmän objektin IUnknown-rajapinnan osoitin ei pysty käsittelemään ICar-osoittimelle meneviä palvelupyyntöjä. Koostaminen Kuten sisällytettäessäkin, ulompi objekti varastoi sisemmän objektin IUnknown-rajapintaan kohdistuvat viittaukset. Kuitenkin sisällyttämisestä poiketen ulompi objekti julkistaa sisemmän objektin suoraan asiakkaan käsiteltäväksi sen sijaan, että loisi sitä vastaavan rajapinnan edustajan. Näin ollen koostettaessa vältytään metodikutsujen edelleenohjaamisen sisällyttämisessä aiheuttamalta lisäkuormalta. Seuraavan sivun kuvassa 10.2 nähdään, kuinka sisemmän objektin rajapinta julkistetaan koostettaessa.
16 418 Microsoft Visual C MCSD Training Kit Kuva 10.2 Koostaminen COM:ssa Jotta koostaminen onnistuisi, sisemmän objektin täytyy olla koostettava (aggregatable) se on pitänyt ohjelmoida niin, että se tukee koostamista. Koska ulomman objektin asiakkaat voivat nyt saada sisemmän objektin julkistamisen rajapintojen osoittimet, ne voivat kutsua sisemmän objektin IUnknown-rajapinnan metodeja. Koska sisempi objekti ei voi käsitellä QueryInterface(), AddRef() ja Release() -palvelupyyntöjä ulomman objektin puolesta, asiakkaan sisemmän objektin IUnknown-rajapinnalle tekemät kutsut täytyy delegoida ulomman objektin IUnknown-rajapinnalle (controlling unknown). Huomio Pidä mielessä, että koostetun objektin asiakas ei ole millään lailla tietoinen koostamisesta, joka on asiakkaan näkökulmasta toteutukseen liittyvä yksityiskohta. Asiakas näkee yhden COM-objektin, jolla on yksi IUnknownosoitin. Jos asiakas saa sisemmän objektin rajapinnan osoittimen, se olettaa sen olevan ulomman objektin julkistaman rajapinnan osoitin. Kun ulompi objekti kutsuu sisempää objektia, se käyttää CoCreateInstance()- funktion toista argumenttia kontrolloivan unknown-osoittimen välittämiseen objektin luokkatehtaalle. Jos tämä osoite ei ole NULL, sisempi objekti tietää, että se on koostettu ja delegoi ulkoisilta asiakkailta tulevat IUnknown-metodien kutsut kontrolloivalle rajapinnalle. Sisemmän objektin täytyy kuitenkin kyetä käsittelemään ulkoisten asiakkaiden IUnknown-metodien kutsut (jotka ohjataan eteenpäin) erilailla kuin ne IUnknown-metodien kutsut, jotka ovat peräisin kontrolloivalta unknowlta (ja joita ulompi objekti käyttää saadakseen yhteyden rajapintoihin ja kontrolloidakseen koostettujen objektien elinaikaa). Tästä syystä koostettavan COM-objektin täytyy sisältää kaksi versiota IUnknown-rajapinnasta: delegoiva ja ei-delegoiva
17 Luku 10 COM-asiakkaat 419 versio. Ulompi komponentti kutsuu ei-delegoivia IUnknown-metodeja; ulkoiset asiakkaat kutsuvat delegoivia IUnknown-metodeja. Delegoivat metodit uudelleenohjaavat kutsut kontrolloivalle unknown:lle (jos objekti on koostettu), tai ei-delegoivalle unknown:lle (jos objektia ei ole koostettu). Koostaminen ATL:ssä ATL sisältää joukon makroja ja kantametodeja, jotka helpottavat komponenttien koostamista. Koostettava (sisempi) objekti luodaan käyttämällä ATL Object Wizardia uuden COM-objektin lisäämiseen ATL-projektiin ja määrittämällä, että komponentti tukee koostamista. Sopivat valinnat tehdään Attributes-sivulta, joka nähdään kuvassa Kuva 10.3 ATL Object Wizardin koostamisasetukset Oletuksena ATL COM-objektit ovat koostettavia. Ei-koostettava objekti luodaan valitsemalla vaihtoehto No aggregation-ryhmästä. Only-valinnan seurauksena luodaan objekti, jota voidaan käyttää vain koostettuna. Ulomman objektin toteuttaminen 1. Lisää IUnknown-osoitin luokan objektiin ja alusta se muodostimessa arvolla NULL. Tässä harjoituksessa viittaamme tähän osoittimeen nimellä m_punkinner. 2. Määrittele luokan määrittelyn sisällä makro DECLARE_GET_ CONTROLLING_UNKNOWN. Tässä makrossa määritellään funktio GetControllingUnknown(). 3. Ylikuormita metodit FinalConstruct() ja FinalRelease(). Ne ovat CComObjectRootBase-kantaluokan metodeja, joita kutsutaan viimeisimmässä vaiheessa COM-objekteja luotaessa ja tuhottaessa. 4. FinalConstruct()-metodissa kutsutaan CoCreateInstance()-funktiota ja välitetään sille luotavan sisemmän objektin CLSID ensimmäisenä argument-
18 420 Microsoft Visual C MCSD Training Kit tina. Välitä GetControllingUnknown()-funktion palauttama arvo toisena argumenttina, jolloin sisempi objekti saa kontrolloivan IUnknownosoittimen. Välitä m_punkinner-osoittimen osoitin viidentenä argumettina, sisemmän objektin IUnknown-rajapinnan osoitinta varten. Seuraavassa näet esimerkin ylikuormitetusta FinalConstruct()-funktiosta: HRESULT FinalConstruct() return CoCreateInstance(CLSID_InnerObject, GetControllingUnknown(), CLSCTX_ALL, IID_IInnerObject, &m_punkinner); 5. Kutsu FinalRelease-metodissa sisemmän objketin IUnknown::Release()- metodia. 6. Lisää COM_INTERFACE_ENTRY_AGGREGATE-makroa käyttämällä mer-kintä sisemmän objektin rajapinnoista ulomman objektin COM-karttaan. Makro on COM_INTERFACE_ENTRY-makron erikoistunut versio, joka käsittelee koostettuja objekteja. COM_INTERFACE_ENTRY_AGGREGATE ottaa ylimääräisen IUnknown * -argumentin, joka osoittaa sisemmän objektin unknownrajapintaan. 7. Lisää sisemmän objektin rajapinnan määritykset ulomman objektin.idltiedostoon ja viittaus tähän rajapintaan [coclass]-osaan. Oppitunnin yhteenveto C++-ohjelmoijat ovat tottuneet käyttämään periyttämistä koodia uudelleenkäytettäessä. COM tekee selkeän eron rajapinnan ja sen toteutuksen välille ja vaatii, että rajapinta pysyy maailmanlaajuisesti muuttumattomana. Tästä syystä COM voi tukea rajapintojen periyttämistä (rajapintojen määrittelyjen uudelleenkäyttämistä), mutta ei toteutuksen periyttämistä. COM tukee kahta koodin uudelleenkäyttötapaa: koostamista ja sisällyttämistä. Nämä tekniikat riippuvat suhteesta, jolla ulompi objekti uudelleenkäyttää sisempää objektia. Kun sisempi objekti on sisällytetty, sen rajapintoja ei julkisteta suoraan asiakkaille, vaan asiakkaat käyttävät niitä ulomman objektin sovittimien kautta. Koostettu objekti julkistaa rajapintansa suoraan asiakkaalle. Kun objekteja koostetaan, täytyy sisempi ja ulompi objekti toteuttaa niin, että asiakas voi käsitellä vain kontrolloivaa rajapintaa ulomman objektin IUnknown-rajapinnan osoitinta. ATL sisältää joukon makroja ja kantaluokkia, jotka helpottavat komponenttien koostamista.
19 Luku 10 COM-asiakkaat 421 Laboratorio 10: UploadStockData-komponentin toteutus Tässä laboratoriossa tehdään laboratoriossa 9 luodun UploadStockData-komponentin toteutus. Teemme IUploadStockData-rajapinnan ConnectToDatabase(), Disconnect() ja UploadRecord() -metodien toteutukset. Nämä metodit käyttävät ADO-kirjastoa Stocks-tietokantaan yhdistymiseen. Kertaa luvun 7 oppitunnin 3 tiedot ADO:sta. Tässä laboratoriossa kirjoitetaan STUpload-sovelluksen Data-valikon Uploadkomennon toteuttamiseen tarvittava koodi. Käyttäjä voi tämän komennon avulla kopioida avattuna olevan dokumentin tiedot Stocks-tietokantaan. Laboratorion suorittaminen edellyttää, että olet asentanut SQL Serverin ja olet pystyttänyt Stocks-tietokannan johdanto-osassa kuvatulla tavalla. Yhteystietotiedoston luominen UploadStockData-komponentti luo ADO Connection-objektin Stockstietokantayhteyttä varten. Connection-objektille täytyy välittää tiedot palvelun toimittajasta, tietokannasta ja turvallisuusasetuksista yhteysmerkkijonossa. Esimerkiksi oman STUpload-sovelluksesi ADO data -kontrollin käyttämä versio yhteysmerkkijonosta on seuraava: Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Stocks;Data Source=(local) Kun sovellusta jaetaan myös muille käyttäjille, ei ole viisasta kovakoodata yhteystietoja sovelluksen lähdekoodiin, koska silloin muutokset tietokanta ja verkkoasetuksiin vaatisivat toimiakseen sovelluksen uudelleenkääntämistä ja -jakelua. Tämän tapaisten ongelmien välttämiseksi, yhteystiedot määritellään erityisessä yhteystietotiedostossa. Yhteystietotiedoston tarkennin on.udl. Kun OLE DB on asennettu koneellesi, voit konfiguroida yhteystietotiedoston käyttämällä yksinkertaista käyttöliittymää. Kun yhteystietotiedosto on konfiguroitu, asetetaan yhteysmerkkijono viittaamaan tiedostoon seuraavasti: File Name=C:\DataLinks\STLink.udl Yhteystietotiedoston konfiguroiminen tai uudelleenjakaminen onnistuu helposti asiakkaan koneella, jos asetukset muuttuvat. Yhteystietotiedoston luominen 1. Luo Resurssienhallinnassa uusi kansio kiintolevyn juurihakemistoon. Anna kansion nimeksi DataLinks. 2. Napauta DataLinks-kansiota resurssienhallinnan vasemmassa osassa. Napauta hiiren kakkospainikkeella oikeassa osassa ja valitse New-valikosta Microsoft Data Link.
20 422 Microsoft Visual C MCSD Training Kit 3. Anna tiedostolle uusi nimi STLink.udl. 4. Aloita tietojen muokkaaminen kaksoisnapauttamalla STLink.udl-tiedostoa. 5. Valitse Data Link Properties -dialogin Provider-sivulta Microsoft OLE DB Provider for SQL Server. 6. Valitse Connection-sivulta (kuvassa 10.4) palvelimeksi paikallinen tietokone. Valitse Use Windows NT Integrated security, tai kirjoita sopiva SQL Server -tilin nimi ja salasana. Kuva 10.4 Yhteystietotiedoston muokkaaminen 7. Valitse palvelimelta Stocks-tietokanta. Kokeile yhteyttä napauttamalla Test Connection. 8. Sulje ikkuna napauttamalla OK ja tallenna asetukset tiedostoon napauttamalla uudelleen OK. IUploadStockData-rajapinnan metodien toteuttaminen Laboratorion tässä osassa palataan STLoadData-projektiin ja toteutetaan UploadStockData-komponentin julkistaman IUploadStockData-rajapinnan ConnectToDatabase(), Disconnect() ja UploadRecord() metodit. Näiden harjoitusten aikana opit, kuinka asiakas voi käyttää ADO:n tarjoamia COMrajapintoja työskennellessään OLE DB -tietolähteen kanssa. Ensin täytyy tuoda ADO tyyppikirjasto, jotta GUID määrittelyt saadaan projektissa käyttöön ja jotta saadaan muodostettua älykkäät osoittimet ADO rajapintoihin.
21 Luku 10 COM-asiakkaat 423 ADO-tyyppikirjaston tuominen 1. Avaa STUpload.dsw-työtilatiedosto Visual Studioon. Varmista, että koko Build-työkalurivi on näkyvissä ja valitse sitten STLoadData-projekti alasvetovalikosta. 2. Avaa FileViewissä Header Files -kansio, joka on STLoadData Files:in alla. Kaksoisnapauta StdAfx.h-tiedostoa. 3. Lisää seuraava rivi tiedoston loppuun ennen kommenttia // AFX_INSERT_LOCATION : #import C:\Program Files\Common Files\System\ado\msado15.dll \ no_namespace rename( EOF, adoeof ) Tiedoston msado15.dll polku saattaa olla koneellasi erilainen. Varmista, että koodiin tulee oikea polku. Huomaa myös, että esimerkissä on merkkiä \ käytetty jakamaan lause kahdelle riville. 4. Tallenna ja sulje StdAfx.h-tiedosto. 5. Napauta FileViewissä hiiren kakkospainikkeella StdAfx.cpp-tiedostoa Source Files -kansiossa. Valitse pikavalikosta Compile StdAfx.cpp. Kääntäjä käsittelee StdAfx.h-tiedostossa olevan #import-komennon ja luo tiedostot msado15.tlh ja msado15.tli Debug-kansioon. Nämä tiedostot sisältävät ADO-rajapintojen GUID-määrittelyt ja älykkäät osoittimet. Rajapinnat ovat nyt käytettävissä STLoadData-projektissa. UploadStockData-komponentti ottaa yhteyden tietokantaan yhden ADO Connection-objektin kautta. Objektia käytetään kutsumalla UploadRecord()- metodia. Tämä Connection-objekti toteutetaan komponenttiluokan jäsenmuuttujana ja se avataan ja suljetaan käyttämällä ConnectToDatabase() ja Disconnect() -metodeja. Connection-objektin toteutus 1. Lisää seuraava protected-tietojäsen CUploadStockData-luokan määrittelyyn UploadStockData.h-tiedostoon: _ConnectionPtr m_pconnection; 2. Lisää samassa tiedostossa olevaan CUploadStockData-luokan muodostimeen seuraava rivi: m_pconnection = NULL;
22 424 Microsoft Visual C MCSD Training Kit 3. Etsi UploadStockData.cpp-tiedostosta CUploadStockData:: ConnectToDatabase()-funktio. Lisää funktioon koodia niin, että se näyttää seuraavalta: STDMETHODIMP CUploadStockData::ConnectToDatabase() // Test to see if we re connected already if(m_pconnection) return S_OK; HRESULT hr = m_pconnection.createinstance( uuidof(connection)); if(failed(hr)) return hr; hr = m_pconnection->open(l File Name=C:\\STLink.UDL, L, L, -1); if(failed(hr)) return hr; return S_OK; Muista, että m_pconnection-muuttuja on _com_ptr_t-osoitin, joka osoittaa ADO Connection-objektin julkistamaan rajapintaan. 4. Etsi CUploadStockData::Disconnect()-funktio. Lisää funktioon koodia niin, että se näyttää seuraavalta: STDMETHODIMP CUploadStockData::Disconnect() if(m_pconnection) m_pconnection->close(); m_pconnection = NULL; return S_OK; Voit nyt lisätä IUploadStockData::UploadRecord()-metodin toteuttamiseen tarvittavan koodin. UploadRecord()-metodin toteutus 1. Valitse Project-valikosta Settings. Varmista, että STLoadData-projekti on valittuna vasemmalta. Valitse Project Settings -dialogin C/C++-sivun Category-valikosta C++ Language. Napauta Enable exception handling -valintaa ja napauta OK.
23 Luku 10 COM-asiakkaat Etsi UploadStockData.cpp-tiedostosta CUploadStockData:: UploadRecord()-funktio. Lisää funktioon koodia niin, että se näyttää seuraavalta: (Tämä koodi on asennettu oheisrompulta tiedostoon CH10_03.cpp.) STDMETHODIMP CUploadStockData::UploadRecord(BSTR fund, DATE date, double price, BSTR uplby, DATE upldate) // Test for live connection to data source if(m_pconnection == NULL) return E_FAIL; // Create recordset _RecordsetPtr precordset; HRESULT hr = precordset.createinstance( uuidof(recordset)); if(failed(hr)) return hr; try // Open recordset _variant_t vconnection = m_pconnection.getinterfaceptr(); hr = precordset->open(l pricehistory, vconnection, adopenforwardonly, adlockoptimistic, adcmdtabledirect); if(failed(hr)) return hr; // Add new record, set fields to new values and update hr = precordset->addnew(); if(failed(hr)) throw_com_error(hr); precordset->fields->getitem(l ph_fund )->Value = fund; precordset->fields->getitem(l ph_date )->Value = date; precordset->fields->getitem(l ph_price )->Value = price; precordset->fields->getitem(l ph_uploadedby )->Value = uplby; precordset->fields->getitem(l ph_uploaddate )-> Value = upldate; hr = precordset->update(); if(failed(hr)) throw_com_error(hr); catch(_com_error e) // very unsophisticated error handling try precordset->close();
24 426 Microsoft Visual C MCSD Training Kit catch(...) // Close() may throw another exception return E_FAIL; precordset->close(); return S_OK; Huomaa, että olemassaoleva Connection-objekti m_pconnection välitetään argumenttina Recordset Open()-metodille. Yksityiskohtaisempaa tietoa Open()-metodin muista argumenteista saat hakemalla Visual C++:n ohjeesta merkkijonolla ADO. Huomaa myös, että ADO Recordset-objektin AddNew() ja Update() metodeja käytetään yhdessä lisättäessä uutta tietoa. Uusi tietue lisätään tietojoukkoon AddNew()-metodilla, kentien arvot (käsitellään Recordset -objektin Fields-kokoelman kautta) muutetaan, ja tietokanta päivitetään kutsumalla Update()-metodia. 3. Voit nyt kääntää STLoadData-projektin, jolloin STLoadData.dll COMpalvelin luodaan ja rekisteröidään uudelleen. STUpload-sovelluksen Upload Data -komennon toteuttaminen Laboratorion seuraavassa osassa toteutetaan STUpload-sovelluksen Datavalikon Upload-komento. Sovellukseen lisätään myös käyttöliittymäkomentokäsittelijä, jonka avulla valikon ja työkalurivin komento saadaan käyttöön dokumentin ollessa ladattunan sovellukseen. Upload Data -komennon toteuttaminen 1. Sulje kaikki Visual Studion editorissa avoinna olevat dokumentit. 2. Valitse Build työkalurivin alasvetovalikosta STUpload-projekti. 3. Avaa ClassWizard painamalla CTRL+W. Valitse Message Maps -välilehden Class name -alasvetovalikosta CSTUploadDoc-luokka. 4. Luo COMMAND ja UPDATE_COMMAND_UI -käsittelijät OnDataUpload() ja OnUpdateDataUpload() tunnisteelle ID_DATA_UPLOAD. Valitse OnUpdateDataUpload()-funktio Member functions -luettelosta ja siirry funktion toteutukseen napauttamalla Edit Code.
25 Luku 10 COM-asiakkaat Toteuta CSTUploadDoc::OnUpdateDataUpload()-funktio seuraavasti: (Tämä koodi on asennettu oheisrompulta tiedostoon CH10_04.cpp.) void CSTUploadDoc::OnUpdateDataUpload(CCmdUI* pcmdui) // Enable the UploadData command only if there is // data on file and a fund currently selected for viewing BOOL benable = GetCurrentFund().IsEmpty()? FALSE : TRUE; pcmdui->enable(benable); 6. Lisää STUploadDoc.cpp-tiedoston alkuun seuraavat direktiivit: #include <comdef.h> // for Compiler COM support #include <lmcons.h> // for the UNLEN constant #include.\stloaddata\stloaddata.h #include.\stloaddata\stloaddata_i.c 7. Etsi CSTUploadDoc::OnDataUpload()-funktio ja lisää seuraava funktion toteuttava koodi: void CSTUploadDoc::OnDataUpload() if(afxmessagebox( Upload current file to database?, MB_OKCANCEL) == IDCANCEL) return; ::CoInitialize(NULL); _COM_SMARTPTR_TYPEDEF(IUploadStockData, uuidof(iuploadstockdata)); IUploadStockDataPtr pserver; HRESULT hr = pserver.createinstance(clsid_uploadstockdata); if(succeeded(hr)) hr = pserver->connecttodatabase(); if(succeeded(hr)) try POSITION pos = m_doclist.getheadposition(); while(pos) CStockData sd = m_doclist.getnext(pos);
26 428 Microsoft Visual C MCSD Training Kit BSTR fund = sd.getfund().allocsysstring(); DATE date = sd.getdate().m_dt; double price = sd.getprice(); DWORD dwlen = UNLEN + 1; TCHAR cuser[unlen + 1]; ::GetUserName(cUser, &dwlen); CString struser(cuser); BSTR uplby = (struser.left(10)).allocsysstring(); COleDateTime dttoday = COleDateTime::GetCurrentTime(); DATE upldate = dttoday.m_dt; HRESULT hr = pserver->uploadrecord(fund, date, price, uplby, upldate); ::SysFreeString(fund); ::SysFreeString(uplBy); if(failed(hr)) CString strprompt = Upload of:\n ; strprompt += sd.getasstring(); strprompt += \nfailed ; if(afxmessagebox(strprompt, MB_OKCANCEL) == IDCANCEL) break; if(!pos) // We got to the end of the loop AfxMessageBox( Upload completed successfully ); catch(_com_error e) ::MessageBox(NULL, e.errormessage(), NULL, MB_OK); pserver->disconnect(); ::CoUninitialize();
27 Luku 10 COM-asiakkaat 429 Käy koodi läpi ja varmista, että ymmärrät, kuinka koodissa luodaan ja käytetään UploadStockData-komponentin ilmentymää dokumentin m_doclist-jäsenenen sisältämien tietueiden lisäämiseen. Huomaa, että Windowsin API-funktion GetUserName() avulla haetaan kirjautuneena olevan käyttäjän nimi. Tämän nimen 10 ensimmäistä merkkiä sijoitetaan Stocks-tietokannan hintahistoriataulukon ph_uploadedby-kenttään. Voit nyt kääntää STUpload-sovelluksen. Upload Data -komennon kokeileminen 1. Käynnistä STUpload-sovellus. Valitse Data-valikosta Import, ja lataa Ch10Test.dat-tiedosto kansiosta Chapter 10\Data. 2. Valitse mikä tahansa osake Select Fund -ikkunasta, jolloin Upload Data -komento tulee käyttöön. 3. Valitse Data-valikosta Upload. Kopioi tiedostossa olevat tiedot Stockstietokannan hintahistoriatauluun napautamalla OK. Kun kopiointi on valmis, napauta OK. 4. Käynnistä uudelleen Upload-komento Data-valikosta. Huomaat, että tiedoston kaikki tietueet aiheuttavat virheen. Tämä johtuu siitä, että hintahistoriataulun Primary Key -rajoitus estää kaksoisarvojen lisäämisen. Poistu tallennuksesta napauttamalla Cancel. Sulje STUpload-sovellus. 5. Napauta Käynnistä-valikkoa, valitse Ohjelmat, Microsoft SQL Server 7.0, ja avaa Query Analyzer -sovellus. Ota yhteys (local) tietokantaan. 6. Valitse Stocks työkalurivin DB-alasvetovalikosta. 7. Kirjoita Query Analyzerin pääikkunaan seuraava rivi: select * from pricehistory 8. Suorita SQL-kysely painamalla CTRL+E.
28 430 Microsoft Visual C MCSD Training Kit Kyselyn tulokset näkyvät Query Analyzer -ikkunan alaosassa kuten kuvassa Varmista, että lisäämäsi rivit näkyvät taulukon lopussa ja että käyttäjänimesi ja päivämäärä näkyvät oikein kentissä ph_uploadedby ja ph_uploaddate. Kuva 10.5 Hintahistoria avattuna Query Analyzeriin
29 Luku 10 COM-asiakkaat 431 Kertaus 1. Millainen luokka edustaa COM-rajapintaa C++:ssa? 2. Kuinka _com_ptr_t-objekti helpottaa COM-palvelimen elinajan kontrollointia? 3. Mitkä ovat COM:n sisällyttämisen hyvät ja huonot puolet? 4. Mikä on CoCreateInstance()-funktion toisen parametrin merkitys?
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
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ä.
Web Services tietokantaohjelmoinnin perusteet
ASP.NET Web Services Web Services tietokantaohjelmoinnin 2 (22) Sisällys Harjoitus 1: Tietokannat ja Web Services... 3 Harjoitus 2: Windows Client... 10 Harjoitus 3: Datan päivitys TableAdapterin avulla...
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,
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
Harjoitustyö: virtuaalikone
Harjoitustyö: virtuaalikone Toteuta alla kuvattu virtuaalikone yksinkertaiselle olio-orientoituneelle skriptauskielelle. Paketissa on testaamista varten mukana kaksi lyhyttä ohjelmaa. Ohjeita Noudata ohjelman
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
C++11 Syntaksi. Jari-Pekka Voutilainen Jari-Pekka Voutilainen: C++11 Syntaksi
1 C++11 Syntaksi Jari-Pekka Voutilainen 13.4.2012 2 Range-for Iteroi säiliön kaikki alkiot for-silmukassa. Säiliöltä vaaditaan begin- ja end-iteraattorit. Pätee kaikille C++11 STL-säiliöille, taulukoille,
Pedacode Pikaopas. Java-kehitysympäristön pystyttäminen
Pedacode Pikaopas Java-kehitysympäristön pystyttäminen Pikaoppaan sisältö Pikaoppaassa kuvataan, miten Windowstyöasemalle asennetaan Java-ohjelmoinnissa tarvittavat työkalut, minkälaisia konfigurointeja
Visual C++ -ohjelman tekeminen ja suunnittelu
Visual C++ -ohjelman tekeminen ja suunnittelu OSA I LUKU 1 5 1 LUKU Visual C++ -ohjelman tekeminen ja suunnittelu Windows sovellusten tekeminen AppWizardilla Sovelluksen muokkaaminen resurssieditorilla
812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä
812347A Olio-ohjelmointi, 2015 syksy 2. vsk X Poikkeusten käsittelystä Sisältö 1. Yleistä poikkeusten käsittelystä 2. Poikkeuskäsittelyn perusteita C++:ssa 3. Standardissa määritellyt poikkeukset 4. Poikkeusvarmuus
5. HelloWorld-ohjelma 5.1
5. HelloWorld-ohjelma 5.1 Sisällys Lähdekoodi. Lähdekoodin (osittainen) analyysi. Lähdekoodi tekstitiedostoon. Lähdekoodin kääntäminen tavukoodiksi. Tavukoodin suorittaminen. Virheiden korjaaminen 5.2
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
BlueJ ohjelman pitäisi löytyä Development valikon alta mikroluokkien koneista. Muissa koneissa BlueJ voi löytyä esim. omana ikonina työpöydältä
Pekka Ryhänen & Erkki Pesonen 2002 BlueJ:n käyttö Nämä ohjeet on tarkoitettu tkt-laitoksen mikroluokan koneilla tapahtuvaa käyttöä varten. Samat asiat pätevät myös muissa luokissa ja kotikäytössä, joskin
ActiveX-kontrollien luominen
433 L U K U 1 1 ActiveX-kontrollien luominen Oppitunti 1: ActiveX-komponenttien tekeminen MFC:llä 434 Oppitunti 2: ActiveX-kontrollien tekeminen ATL:llä 448 Laboratorio 11: ActiveX-kontrollin käyttäminen
Tilastokeskuksen rajapintapalveluiden käyttöönotto ArcGISohjelmistossa
1(6) Tilastokeskuksen rajapintapalveluiden käyttöönotto ArcGISohjelmistossa Ohjeita laatiessa on käytetty ArcGIS:n versiota 10.1. Koordinaattijärjestelmä ArcGIS käyttää oletuskoordinaattijärjestelmänä
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
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
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,
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ä
COM-komponenttien luominen
377 L U K U 9 COM-komponenttien luominen Oppitunti 1: COM-komponentin luominen ATL:llä 378 Oppitunti 2: ATL:n COM-komponentin koodi 389 Laboratorio 9: STUpload Database Access -komponentin luominen 400
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
Loppukurssin järjestelyt
C! Loppukurssin järjestelyt 29.3.2018 Ohjelmassa Yhteenvetoa palautteesta Ohjelmontitehtävän järjestelyt Tietokonetentin järjestelyt Kysyttävää / kerrattavaa 10-kierroksen asioista? Aikatauluista 10. kierroksen
12 Mallit (Templates)
12 Mallit (Templates) Malli on määrittely, jota käyttämällä voidaan luoda samankaltaisten aliohjelmien ja luokkien perheitä. Malli on ohje kääntäjälle luoda geneerisestä tyyppiriippumattomasta ohjelmakoodista
Ohjelman virheet ja poikkeusten käsittely
Ohjelman virheet ja poikkeusten käsittely 17 Ohjelman virheet ja poikkeusten käsittely Poikkeukset ovat tapa ilmoittaa virheistä ja odottamattomista tilanteista C++-ohjelmassasi. Poikkeusten käyttö virheiden
Loppukurssin järjestelyt C:n edistyneet piirteet
C! Loppukurssin järjestelyt C:n edistyneet piirteet 30.3.2017 Ohjelmassa Ohjelmontitehtävän järjestelyt Tietokonetentin järjestelyt Esikääntäjä Parametrilistat Funktio-osoittimet Kunniamainintoja Kuura
Kertauskysymykset ja vastaukset
613 L I I T E ja vastaukset Sivu 1 Luku 1 1. Mikä on MSF? MSF on kokoelma malleja, periaatteita ja käytäntöjä, jotka auttavat organisaatioita tehostamaan kehitystyötä ja teknologian hyväksikäyttöä liiketoimintaongelmien
Eclipse 3.2 pikku opas versio 1.0. Esittely Uuden projektin perustaminen Sovelluksen luominen Koodin siistiminen Vinkkejä
Anne Benson/Tanja Bergius Opintojakson ict1td002 käyttöön Sivu 1 / 13 Eclipse 3.2 pikku opas versio 1.0 Ohjeen sisältö: Esittely Uuden projektin perustaminen Sovelluksen luominen Koodin siistiminen Vinkkejä
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
HAMINETTI WLAN LIITTYMÄN KÄYTTÖÖNOTTO-OHJE
HAMINETTI WLAN LIITTYMÄN KÄYTTÖÖNOTTO-OHJE Vaihe 1, Client manager ohjelmiston ja sovittimen ajureiden asennus Asennuksen vaiheissa saattaa olla sovitin ja käyttöjärjestelmä kohtaisia eroja. Alla olevassa
C++11 lambdat: [](){} Matti Rintala
C++11 lambdat: [](){} Matti Rintala bool(*)(int) Tarve Tarve välittää kirjastolle/funktiolle toiminnallisuutta Callback-funktiot Virhekäsittely Käyttöliittymät Geneeristen kirjastojen räätälöinti STL:n
Osa. Listaus 2.1. HELLO.CPP esittelee C++ -ohjelman osat. 14: #include <iostream.h> 15: 16: int main() 17: {
Osa I 2. oppitunti C++-ohjelman osat Ennen kuin menemme yksityiskohtaisemmin sisälle C++-luokkiin, -muuttujiin jne, katsokaamme ensin, millaisista osista C++-ohjelma koostuu. Tämän tunnin aikana opit seuraavat
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
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.
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
Sovellusten ohjelmointi Microsoft Foundation Classes -luokkien avulla
73 L U K U 3 Sovellusten ohjelmointi Microsoft Foundation Classes -luokkien avulla Oppitunti 1: Yleiskatsaus MFC:hen 74 Oppitunti 2: Win32-sovellusarkkitehtuuri 84 Oppitunti 3: MFC-sovelluskehys 89 Oppitunti
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
Sovelluksen toimintojen toteuttaminen
161 L U K U 5 Sovelluksen toimintojen toteuttaminen Oppitunti 1: Dialogien käyttäminen 162 Oppitunti 2: Sovelluksen tietojen näyttäminen ja tulostaminen 183 Oppitunti 3: Useiden säikeiden käyttäminen 197
Javan asennus ja ohjeita ongelmatilanteisiin
Javan asennus ja ohjeita ongelmatilanteisiin Javaa tarvitaan Fivaldin Sovellusikkunan alaisiin sovelluksiin, jotka käyttävät Oracle Forms -tekniikkaa. Visma Fivaldin osalta suosittelemme aina käyttämään
Delegaatit ja tapahtumakäsittelijät
14 Delegaatit ja tapahtumakäsittelijät Toinen käyttökelpoinen keksintö C#-kielessä ovat delegaatit. Periaatteessa ne palvelevat samaa tarkoitusta kuin C++:n funktio-osoittimet. Delegaatit ovat kuitenkin
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
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ä).
Virtuaalifunktiot ja polymorfismi
Virtuaalifunktiot ja polymorfismi 16 Virtuaalifunktiot ja polymorfismi Polymorfismi on niin tehokas olio-ohjelmoinnin ominaisuus, että tulet varmastikin käyttämään sitä lähes kaikissa C++-ohjelmissasi.
8. Näppäimistöltä lukeminen 8.1
8. Näppäimistöltä lukeminen 8.1 Sisällys Arvojen lukeminen näppäimistöltä Java-kielessä. In-luokka. In-luokka, käännös ja tulkinta Scanner-luokka. 8.2 Yleistä Näppäimistöltä annettujen arvojen (syötteiden)
Tilastokeskuksen rajapintapalveluiden käyttöönotto QGISohjelmistossa
1(13) Tilastokeskuksen rajapintapalveluiden käyttöönotto QGISohjelmistossa (QuantumGIS) Ohjeita laatiessa on käytetty QuantumGIS:n versiota 2.0.1. Ruudunkaappauskuvat ovat englanninkielisestä versiosta,
MCSD Training Kit Microsoft. Visual C++ 6.0
i MCSD Training Kit Microsoft Visual C++ 6.0 ii MCSD Training Kit Visual C++ 6.0 Toimittanut Kääntäjä Kansi Kustantaja Microsoft Juha Rautiainen Frank Chaumont Oy Edita Ab IT Press PL 760 00043 EDITA Sähköpostiosoite
Näin asennat MS-DOS käyttöjärjestelmän virtuaalikoneeseen
Näissä ohjeissa käydään läpi Microsoftin MS-DOS 6.22 -käyttöjärjestelmän asennus Microsoftin Virtual PC 2007 -virtuaalikoneeseen. Asennusta varten sinulla on oltava Virtual PC 2007 asennettuna tietokoneellasi
1. NetBeans-ohjelman asennus ja käyttöönotto pva
1. NetBeans-ohjelman asennus ja käyttöönotto 11.7.2016 pva NetBeans on ohjelmointiympäristö, IDE (Integrated Development Environment) jonka avulla opiskelemme laiteläheistä C-ohjelmointia. Oletus Sinulla
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,
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.
Autentikoivan lähtevän postin palvelimen asetukset
Autentikoivan lähtevän postin palvelimen asetukset - Avaa Työkalut valikko ja valitse Tilien asetukset - Valitse vasemman reunan lokerosta Lähtevän postin palvelin (SM - Valitse listasta palvelin, jonka
15. Ohjelmoinnin tekniikkaa 15.1
15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Geneerinen ohjelmointi. Lueteltu tyyppi enum. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien silmukoimiseen:
Web järjestelmän ohjelmointi Kevät 2012 Hans Nieminen
Harjoitus 1 Käsiteltävät aiheet: C# kielen kertaus luokat, oliot ja periytyminen poikkeukset ja niiden käsittely tapahtumat ja niiden käsittely C# 3.0 uudet ominaisuudet Visual Studio projektin kansiot
Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:
1 (7) Tiedon lukeminen näppäimistöltä Scanner-luokan avulla Miten ohjelma saa käyttöönsä käyttäjän kirjoittamaa tekstiä? Järjestelmässä on olemassa ns. syöttöpuskuri näppäimistöä varten. Syöttöpuskuri
815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 2 vastaukset Harjoituksen aiheena on BNF-merkinnän käyttö ja yhteys rekursiivisesti etenevään jäsentäjään. Tehtävä 1. Mitkä ilmaukset seuraava
Periytyminen. Luokat ja olio-ohjelmointi
Periytyminen 15 Periytyminen Tässä luvussa käsittelemme aihetta, joka on olio-ohjelmoinnin kaikkein tärkein osa - periytyvyys. Periytyvyyden avulla voimme luoda uusia luokkia uudelleenkäyttämällä ja laajentamalla
Visma Econet -ohjelmat ActiveX on epävakaa -virheilmoituksen korjausohjeet
1 Visma Econet -ohjelmat ActiveX on epävakaa -virheilmoituksen korjausohjeet Microsoft on julkaissut Office-paketteihin tietoturvapäivitykset. Seuraavat päivitykset aiheuttavat Visma Econet -ohjelmissa
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
Muuttujien roolit Kiintoarvo cin >> r;
Muuttujien roolit Muuttujilla on ohjelmissa eräitä tyypillisiä käyttötapoja, joita kutsutaan muuttujien rooleiksi. Esimerkiksi muuttuja, jonka arvoa ei muuteta enää kertaakaan muuttujan alustamisen jälkeen,
FinFamily PostgreSQL installation ( ) FinFamily PostgreSQL
FinFamily PostgreSQL 1 Sisällys / Contents FinFamily PostgreSQL... 1 1. Asenna PostgreSQL tietokanta / Install PostgreSQL database... 3 1.1. PostgreSQL tietokannasta / About the PostgreSQL database...
Kameran laiteohjelman päivittäminen
Kameran laiteohjelman päivittäminen Kiitos, että valitsit Nikon-tuotteen. Tämä opaskirja kuvaa, miten laiteohjelma päivitetään. Jos et ole varma, että voit tehdä päivityksen, päivitys voidaan tehdä Nikonin
Olio-ohjelmointi Syntaksikokoelma
C++-kielen uusia ominaisuuksia Olio-ohjelmointi Syntaksikokoelma 31.10.2008 Bool-tietotyyppi: Totuusarvo true (1), jos ehto on tosi ja false (0) jos ehto epätosi. Dynaaminen muistinvaraus: Yhden muuttuja
Eclipse 3.1 Pikaopas versio 1.0
Anne Benson/Tanja Bergius Opintojaksojen atk84d ja ict02d käyttöön 1/17 Eclipse 3.1 Pikaopas versio 1.0 Pikaohjeen sisältö 1. Esittely 2. Asennus ja poistaminen 3. Sovelluskehitys 4. Sovelluksen toteutus
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ä
Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat
Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat Rajapinnat Java-kieli ei tue luokkien moniperintää. Jokaisella luokalla voi olla vain yksi välitön yliluokka. Toisinaan olisi
815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 4 vastaukset Harjoituksen aiheena ovat imperatiivisten kielten lauseisiin, lausekkeisiin ja aliohjelmiin liittyvät kysymykset. Tehtävä 1. Mitä
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
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.
ARKIPÄIVÄN SUOMEA-ohjelma vaatii toimiakseen multimedia-pc:n, jossa on seuraavat tekniset ominaisuudet ja ohjelmat asennettuna.
ASENNUS Ennen ARKIPÄIVÄN SUOMEA-ohjelman käytön aloittamista se on asennettava tietokoneeseen. Asentaminen suoritetaan alla esitettävien ohjeiden mukaisesti. Huom: ARKIPÄIVÄN SUOMEA-ohjelmasta on saatavana
SuomiCom-sähköpostiasetukset Microsoft Outlook 2016
SuomiCom-sähköpostiasetukset Microsoft Outlook 2016 Nämä ohjeet on suunnattu Microsoft Outlook 2016 -ohjelmalle, mutta ohje todennäköisesti toimii suuntaa-antavana myös vanhemmille versioille. Kuvat ovat
INTERBASE 5.0 PÄIVITYS VERSIOON 5.6
1 INTERBASE 5.0 PÄIVITYS VERSIOON 5.6 HUOM: Tämä ohje on tarkoitettu yksittäisen koneen päivittämiseen, mikäli InterBase on asennettu serverille ota yhteys DL Software Tukeen. HUOM: Mikäli koneessasi on
Outlookin konfigurointi. Huoltamosähköposti Sonerahosted
Outlookin asennusohje SoneraHosted/Toni Einola/8.5.2009 Outlookin konfigurointi Huoltamosähköposti Sonerahosted 1. Yleistä Teboilin huoltamosähköpostia voidaan käyttää selaimen ja älypuhelimen ohella myös
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
Apuja ohjelmointiin» Yleisiä virheitä
Apuja ohjelmointiin» Yleisiä virheitä Ohjelmaa kirjoittaessasi saattaa Visual Studio ilmoittaa monenlaisista virheistä "punakynällä". Usein tämä johtuu vain siitä, että virheitä näytetään vaikket olisi
Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä 12.1 12.2 12.3 12.4
Sisällys 12. Näppäimistöltä lukeminen Arvojen lukeminen näppäimistöltä yleisesti. Arvojen lukeminen näppäimistöltä Java-kielessä.. Luetun arvon tarkistaminen. Tietovirrat ja ohjausmerkit. Scanner-luokka.
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
Toisessa viikkoharjoituksessa on tavoitteena tutustua JUnit:lla testaukseen Eclipse-ympäristössä.
Toisessa viikkoharjoituksessa on tavoitteena tutustua JUnit:lla testaukseen Eclipse-ympäristössä. JUnit-ympäristö 1. Luo tests -pakkaukseen uusi luokka. Nimeä VHTestit. 2. Laita VHTestit periytymään TestCase:sta
Tapahtumapohjainen ohjelmointi. Juha Järvensivu juha.jarvensivu@tut.fi 2007
Tapahtumapohjainen ohjelmointi Juha Järvensivu juha.jarvensivu@tut.fi 2007 Sisältö Tapahtumapohjainen ohjelmointi Käyttöliittymän rakenne Pääikkuna (top-level window) Lapsi-ikkuna (child window) Dialogit
GeoGebra-harjoituksia malu-opettajille
GeoGebra-harjoituksia malu-opettajille 1. Ohjelman kielen vaihtaminen Mikäli ohjelma ei syystä tai toisesta avaudu toivomallasi kielellä, voit vaihtaa ohjelman käyttöliittymän kielen seuraavasti: 2. Fonttikoon
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
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. 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
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,
5. HelloWorld-ohjelma 5.1
5. HelloWorld-ohjelma 5.1 Sisällys Lähdekoodi. Lähdekoodin (osittainen) analyysi. Lähdekoodi tekstitiedostoon. Lähdekoodin kääntäminen tavukoodiksi. Tavukoodin suorittaminen. Virheiden korjaaminen 5.2
Sähköposti ja uutisryhmät 4.5.2005
Outlook Express Käyttöliittymä Outlook Express on windows käyttöön tarkoitettu sähköpostin ja uutisryhmien luku- ja kirjoitussovellus. Se käynnistyy joko omasta kuvakkeestaan työpöydältä tai Internet Explorer
DNA Toimistoviestintä Microsoft - sähköposti
DNA Toimistoviestintä Microsoft - sähköposti 30.10.2013 Luottamuksellinen MS Outlook, Standard postitilin asennus 1/6 Käynnistä Outlook 2010. Seuraava näyttö avautuu Valitse Next (Seuraava). 2 MS Outlook,
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
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
Harjoituksen aiheena on tietokantapalvelimen asentaminen ja testaaminen. Asennetaan MySQL-tietokanta. Hieman linkkejä:
Linux-harjoitus 6 Harjoituksen aiheena on tietokantapalvelimen asentaminen ja testaaminen. Asennetaan MySQL-tietokanta. Hieman linkkejä: http://www.mysql.com/, MySQL-tietokantaohjelman kotisivu. http://www.mysql.com/doc/en/index.html,
Visma Business AddOn Tuotetarrat. Käsikirja
Visma Business AddOn Tuotetarrat Käsikirja Oppaan päiväys: 30.8.2012. Asiakaspalvelu: Helpdesk: www.visma.fi Visma Software Oy pidättää itsellään oikeuden mahdollisiin parannuksiin ja/tai muutoksiin tässä
erasmartcardkortinlukijaohjelmiston
erasmartcardkortinlukijaohjelmiston asennusohje Sisällysluettelo 1. erasmartcard... 2 2. erasmartcard-ohjelmiston normaali asennus... 3 2.1. Ennen asennusta... 3 2.2. Asennus... 3 3. Muut asennustavat...
Java-API, rajapinnat, poikkeukset, UML,...
Java-API, rajapinnat, r poikkeukset, UML,... Janne Käki 12.10.2006 Keskeisimmät Java-API:n pakkaukset API = Application Programming Interface eli sovellusohjelmointirajapinta (!) pakkaus (engl. package)
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
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
Windowsia verkkoyhteyksiin käyttäville asiakkaille
Windowsia verkkoyhteyksiin käyttäville asiakkaille Käytettäessä eri käyttöjärjestelmää tai järjestelmäarkkitehtuuria palvelimelle ja asiakkaalle yhteys ei ehkä toimi oikein, kun yhteyden muodostus suoritetaan
12. Näppäimistöltä lukeminen 12.1
12. Näppäimistöltä lukeminen 12.1 Sisällys Arvojen lukeminen näppäimistöltä yleisesti. Arvojen lukeminen näppäimistöltä Java-kielessä. In-luokka. Luetun arvon tarkistaminen. Tietovirrat ja ohjausmerkit.
Valintanauhan komennot Valintanauhan kussakin välilehdessä on ryhmiä ja kussakin ryhmässä on toisiinsa liittyviä komentoja.
Pikaopas Microsoft Excel 2013 näyttää erilaiselta kuin aiemmat versiot. Tämän oppaan avulla pääset alkuun nopeasti ja saat yleiskuvan uusista ominaisuuksista. Komentojen lisääminen pikatyökaluriville Pidä
Monikielinen verkkokauppa
Monikielinen verkkokauppa Monikielinen verkkokauppa Monikielisen verkkokaupan luomisessa pitää Multiple Languages lisämoduuli olla aktivoituna. Klikkaa valikosta Features -> Apps Management -> näkyviin
SQL Buddy JAMK Labranet Wiki
Page 1 of 9 SQL Buddy JAMK Labranet Wiki Sisällysluettelo Yleistä SQL Buddy:sta kotisivu :http://sqlbuddy.com/ SQL Buddy on kevyt hallintatyökalu MySQL-tietokannalle. Järjestelmävaatimukset Serverin vaatimukset