Visual Basicin toisella puolella: Windows API:n käyttö



Samankaltaiset tiedostot
HTML-asiakirjojen näyttäminen Internet Explorerilla

Ajokorttimoduuli Moduuli 2. - Laitteenkäyttö ja tiedonhallinta. Harjoitus 1

Memeo Instant Backup Pikaopas. Vaihe 1: Luo oma, ilmainen Memeo-tili. Vaihe 2: Liitä tallennusväline tietokoneeseen

Office ohjelmiston asennusohje

Kopioi cd-levyt kiintolevylle, niin fyysiset levyt joutavat eläkkeelle.

Ohjelmistopäivitysohje

KUVAN TUOMINEN, MUOKKAAMINEN, KOON MUUTTAMINEN JA TALLENTAMINEN PAINTISSA

Muistitikun liittäminen tietokoneeseen

Valintanauhan komennot Valintanauhan kussakin välilehdessä on ryhmiä ja kussakin ryhmässä on toisiinsa liittyviä komentoja.

NEUVOTTELUPALVELUT NETTINEUVOTTELU PIKAOPAS

Osoitin ja viittaus C++:ssa

Tervetuloa käyttämään ehopsia

MOODLE-OHJE: Liitetiedoston lisääminen ja päivittäminen

Harjoitustyö: virtuaalikone

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

ASENNUS- JA KÄYTTÖOHJE

CCLEANER LATAAMINEN JA ASENTAMINEN

1 eportfolio Kyvyt.fi - palvelun käytön aloittaminen

Windows 8.1:n vaiheittainen päivitysopas

Basware Supplier Portal

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

1 ClipArt -kuvan käyttö Paint-ohjelmassa

Digitaalisen SLR-kameran laiteohjelmiston päivittäminen

Muuttujien määrittely

Varmista, että olet saanut kaikki varusteet, jotka on lueteltu kohdassa Kuva 1. (Pakkauksessa toimitetut tarrat voivat poiketa ilmoitetusta.

Oppilaan pikaopas. Project 2013 käyttöliittymä ja näkymät

TALLENNETAAN MUISTITIKULLE JA MUISTIKORTILLE

Kameran laiteohjelman päivittäminen

mobile PhoneTools Käyttöopas

Drive Letter Access. Pikaopas

Windowsia verkkoyhteyksiin käyttäville asiakkaille

Mac. Valmistelut. Mac

Digitaalisen SLR-kameran laiteohjelmiston päivittäminen

Sähköposti ja uutisryhmät

Ulkoiset mediakortit. Käyttöopas

SeaMonkey pikaopas - 1

Visma Econet -ohjelmat ActiveX on epävakaa -virheilmoituksen korjausohjeet

Kameran laiteohjelman päivittäminen

JOVISION IP-KAMERA Käyttöohje

SSH Secure Shell & SSH File Transfer

Kameran laiteohjelman päivittäminen

Ohjeet e kirjan ostajalle

ANVIA ONLINE BACKUP ASENNUSOPAS 1(7) ANVIA ONLINE BACKUP ASENNUSOPAS 1.0

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

Sen jälkeen Microsoft Office ja sen alta löytyy ohjelmat. Ensin käynnistä-valikosta kaikki ohjelmat

Windows. Valmistelut. Windows

Kameran laiteohjelman päivittäminen

Käyttöoppaasi. F-SECURE PSB AND SERVER SECURITY

Asentaminen Android-laitteeseen

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

Turvallinen veneily -näyttö. VesselView-ohjelmiston päivittäminen. Automaattinen WiFi-haku. Micro SD -kortin käyttäminen. Osa 1 - Alkuvalmistelut

ohjeita kirjautumiseen ja käyttöön

Pika-aloitusopas. Haku Voit etsiä sivustoja, henkilöitä tai tiedostoja. Sivuston tai uutisviestin luominen

Päivitysohje Opus Dental

Ulkoiset mediakortit Käyttöopas

Kameran laiteohjelman päivittäminen

Uudessa Excel-2007 on muutettuja / uusia ominaisuuksia jotka tulee huomioida kun Excel-2003 tehtyjä sovelluksia otetaan käyttöön Excel-2007:ssä.

SYDÄN-HÄMEEN RASTIT TULOSPALVELUN OHJEET v.2 1. LAITTEISTO 2. LAITTEISTON VALMISTELU 3. VALMISTELUT ENNEN TAPAHTUMAA

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

ASENNUS JA KÄYTTÖOHJE

Kansion asetusten muuttaminen Windows 2000 käyttöjärjestelmässä Resurssienhallinnan kautta

Salamalaitteen laiteohjelman päivittäminen

Kameran laiteohjelman päivittäminen

Kytkentäopas. Windows-ohjeet paikallisesti liitettyä tulostinta varten. Ennen Windows-tulostinohjelmiston asentamista

MP3 Manager Software for Sony Network Walkman

Pikanäppäin Yhdistelmiä. Luku 6 Pikanäppäimet

Tietosuoja-portaali. päivittäjän ohje

Jypelin käyttöohjeet» Ruutukentän luominen

Ohjelmoinnin jatkokurssi, kurssikoe

PIKAOPAS NOKIA PC SUITE 4.3. Nokia puhelimelle. Copyright Nokia Mobile Phones Kaikki oikeudet pidätetään Issue 6

Mikäli olet saanut e-kirjan latauslinkin sähköpostilla, seuraa näitä ohjeita e-kirjan lataamisessa.

Microsoft Security Essentials (MSE) asennuspaketin lataaminen verkosta

ClassPad fx-cp400 OS2-päivitys. + Manager-ohjelmisto ja Physium-sovellus

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

OTOsuite. Asennusopas. Suomi

Pika-aloitusopas. Sisältö: Projektin luominen Projektin muokkaaminen ja hallinnointi Projektin/arvioinnin tulosten tarkastelu

Peilittömien kameroiden, NIKKOR Z-objektiivien ja yhteensopivien lisävarusteiden laiteohjelmiston päivitys

TALLENNETAAN MUISTITIKULLE JA MUISTIKORTILLE

Opiskelun ja työelämän tietotekniikka (DTEK1043)

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

Kirkkopalvelut Office365, Opiskelijan ohje 1 / 17 IT Juha Nalli

2. PDF-lomakkeen digitaalinen allekirjoittaminen

Motorola Phone Tools. Pikaopas

Android ohjelmointi Tunti 5. SQLite, Cursor, Intent ja ADB

[Lomake.][Ohjain.]metodi [argumentit] Seuraava aliohjelma, jossa käytetään kuvakehyksen Move-metodia, luo vaikutelman etääntyvästä kuvakehyksestä:

Ulkoiset mediakortit Käyttöohje

OSA 5. Professional Edition -version työkalut ja tekniikat

Opi kuvin: By Choice v.1.4 asennus Asennus järjestelmänvalvojan oikeuksin

TIETOKONEEN ASETUKSILLA PARANNAT KÄYTETTÄVYYTTÄ

Copyright Basware Corporation. All rights reserved. Pikaopas toimittajille Supplier Portal (Toukokuu 2013)

Ohjelmoinnin perusteet Y Python

Avaa ohjelma ja tarvittaessa Tiedosto -> Uusi kilpailutiedosto

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

Musiikin ja videon yhdistäminen Multimedia MCI -kontrollilla

ARVI-järjestelmän ohje arvioinnin syöttäjälle

Olet tehnyt hyvän valinnan hankkiessasi kotimaisen StorageIT varmuuskopiointipalvelun.

Ulkoiset mediakortit. Käyttöopas

Coolselector Asennusohje

E-kirjojen hankkiminen Readerillä

Transkriptio:

HARJOITUS 457 18 Visual Basicin toisella puolella: Windows API:n käyttö ARVIOITU AIKA 40 min. Opit tässä harjoituksessa kuinka: ohjelmiasi laajennetaan kutsumalla Microsoft Windows API -funktioita API Viewer -apuohjelmaa käytetään lisätessä funktioita, constantvakioita ja tyyppimäärittelyitä GlobalMemoryStatus API:a käytetään tarkkailtaessa muistin käyttöä järjestelmässäsi. Windows API:n käyttö Tulet laajentamaan ohjelmiasi harjoituksessa 18 käyttämällä tehokkaita Microsoft Windows API:n funktioita (sovellusten ohjelmointirajapinta). Windows API -funktioiden kutsumista on yleensä pidetty "kehittyneempänä" ohjelmointikäsitteenä. Luulenpa kuitenkin, että tulet huomaamaan muutaman esimerkin jälkeen, että aihe on suoraviivainen ja käytännöllinen. Tutkit ensin Windows API:n yleistä laajuutta ja niitä kutsumiskäytäntöjä, joita tarvitaan niiden käyttämisessä. Seuraavaksi tulet oppimaan, kuinka Microsoft Visual Basicin API Viewer -lisäohjelmaa käytetään etsittäessä määrättyä API-funktiota ja kopioimaan tarvittavat määrittelyt projektiisi. Lopulta, tulet oppimaan, kuinka GlobalMemoryStatus APIa käytetään tarkistettaessa muistin käyttö tietokoneellasi. Perustaidot, jotka tulet oppimaan tässä harjoituksessa, tulevat pätemään useimmissa töissä, mitä teet Windows API:n kanssa tulevaisuudessa. Windows API:n sisällä Niinpä... mikä oikein on Windows API? Kuten lyhenteillä on tapana, Windows API pitää ympärillään salaperäisen ilmapiirin. Itse asiassa, tämä epäilyttävältä kuulostava kokonaisuus ei ole mitään muuta kuin ylisuuri kokoelma, joka koostuu funktioista,

458 Visual Basic 6 Trainer jotka yhdessä suorittavat Microsoft Windows -käyttöjärjestelmän päivittäiset rutiinit. Windows-ohjelmat ja ohjelmistojen kehitystyökalut käyttävät aktiivisesti näytä rutiineja suoritettaessa tavallisia laskennallisia tehtäviä. Esimerkiksi, Visual Basic kutsuu Windows API:a aina, kun se piirtää grafiikkaa, tallentaa tiedoston tai varaa muistia uudelle ohjelmalle. Windows API:in on ryhmitelty yli 1000 kutsua. Nämä funktiot on jaettu useisiin yleisiin kategorioihin: järjestelmäpalvelut (kernelin rutiinit), grafiikkalaitteiden rajapinta, Windows-ohjelmien hallinta, multimedia ja niin edelleen. Käytännössä Windows API:a käytetään kokoelmana.dll-kirjastoja (dynaamiset linkkikirjastot), jotka ladataan suorituksen aikana tarjoamaan tarvittavat tietotekniset palvelut niille ohjelmille, jotka ovat aktiivisia Windows-käyttöjärjestelmässä. Jos Windows APIn rutiinit ovat yksinkertaisesti funktioita, ovatko ne erilaisia kuin sellaiset funktiot, kuin Ucase, Eof ja Format, joita Visual Basic -ohjelmoija käyttää säännöllisesti? No, ei oikeastaan. Ainoa käytännöllinen ero on siinä, että kun Visual Basicin funktiot määritetään automaattisesti Visual Basicin ohjelmointiympäristössä, Windows API:n funktiot vaativat sen, että ne määritetään ensin projektissasi perusmoduulin tai tapahtuma-aliohjelman avulla. Tämän määrityksen jälkeen Windows API:n funktiot toimivat samalla tavalla kuin Visual Basicin sisäänrakennetut funktiot - kutsut niitä nimellä tarpeellisin argumentein varustettuna, ja vastaanotat palautuvan arvon, jota voit käsitellä ohjelmassasi suorittaen käytännöllisen työsi. GlobalMemoryStatus-funktio Windows API -funktio, jota käytän tässä harjoituksessa, on GlobalMemoryStatus, funktio, joka palauttaa käytännöllistä tietoa aktiivisesta muistin käytöstä tietokoneessasi. Kun määrität GlobalMemoryStatus-funktion perusmoduulissa (.bastiedosto), lisäät ohjelmalauseen moduulin yläosaan, ja se kertoo Visual Basicille, mitä GlobalMemoryStatus tekee ja minkä tyyppisiä argumentteja se vaatii. Kuten useimmat ohjelmoijat, olen jakanut tämän määrityksen kahdelle riville rivinjatkumista kuvaavalla merkillä (_) niin, että voin nähdä sen helposti Code-ikkunassa. GlobalMemoryStatus API -funktion määritys näyttää tältä: Tyypillinen Windows API -määritys. Public Declare Sub GlobalMemoryStatus Lib kernel32 _ (lpbuffer As MemoryStatus) Huomaat varmasti heti muutaman epätavallisen seikan tästä määrittelystä. GlobalMemoryStatus on funktion nimi Windows API -kirjastossa. Kun kutsun GlobalMemoryStatus-funktiota ohjelmassani, käytän tätä nimeä, kun suoritan funktion, ja olen lisännyt argumentit, jotka on lisätty sulkeilla määrityslauseen loppuosassa. (Tämä funktio vaatii vain yhden argumentin, mutta eräät muut funktiot

Harjoitus 18 Visual Basicin takana: Windows API:n käyttö 459 vaativat useita.) Parametri "kernel32" yksilöi määrätyn kirjaston, jota käytän, 32- bittisen Windows API -kirjaston, joka on kytketty käyttöjärjestelmän ytimen (kernel) funktoihin. Vaaditun argumentin nimi on lpbuffer. Kahden merkin lyhenne lp yksilöi argumentin pitkänä kokonaisluvun osoittimen arvona, muistiosoitteena, joka yksilöi käyttämäni tiedon sijainnin tai osoittaa siihen; tietoa käytetään keräämään tietoa järjestelmän muistista. lpbuffer-argumenttia ei määritetä käyttämällä yhtä Visual Basicin perustietotyyppiä, kuten Integer, String tai Boolean. Se määritetään sen sijaan käyttäjän määrittelemällä tyypillä, jota kutsutaan nimellä MemoryStatus; se sisältää kahdeksan numeromerkintää, jotka yksilöivät fyysisen ja virtuaalisen muistin tilan tietokoneella. Ohjelmoija, joka alun perin kirjoitti tämän API-funktion, loi MemoryStatus-tyypin käyttämällä C-ohjelmointikielen struct (rakenne) -lausetta. (Mainitsen tämän koska tulet silloin tällöin näkemään "struct"-sanaa käytettävän, kun keskustellaan tyyppimäärittelyistä - useimmat ihmiset, jotka käyttävät Windows APIa ovat C- ohjelmoijia, joille on tuttua hieman erilainen tapa kuvata tietotyyppejä ja funktiokutsuja.) Windows API -kutsujen määrittäminen Visual Basicissä on hieman kömpelöä, koska sinun täytyy lisätä tyyppimääritys jokaiselle käyttäjän määrittelemälle tyypille, joka on osa API-funktiota, jota haluat kutsua. Tässä tapauksessa, GlobalMemoryStatusfunktio vaatii MemoryStatus-tyypin. Ja huomaa: GlobalMemoryStatus-funktion määritys täytyy sijoittaa perusmoduuliin. MemoryStatus-tyyppimääritys näyttää tältä: 18 Windows API:n käyttö MemoryStatustyyppi tallentaa tiedon, joka on kerätty APIkutsun aikana. Public Type MemoryStatus dwlength As Long dwmemoryload As Long dwtotalphys As Long dwavailphys As Long dwtotalpagefile As Long dwavailpagefile As Long dwtotalvirtual As Long dwavailvirtual As Long End Type Käyttäjän määrittelemä tyyppi on rajoitettu Visual Basicissä Public Type -lauseilla ja End Type -avainsanoilla. Näiden kahden lauseen välissä oleva tieto määrittää tyypin nimen ja jokaisen tyyppielementin. Tämän määrätyn tyypin jokaisen elementin edessä oleva dw-lyhenne tulee sanoista "double word," tai DWORD C-ohjelmointikielessä, neljän tavun (32-bittinen) kokonaisluvun arvo. Visual Basicissä tämä tyyppimääritys tehdään Long-avainsanalla, mutta säilytät silti dw-lyhenteen, koska tämä on tyyli, jolla C-ohjelmoija, joka alunperin kirjoitti sen, teki niin. Muuttujatyyppi Long (joka on todella suuri kokonaisluvun arvo) on tarpeellinen, koska numerot, jotka vastaanotat

460 Visual Basic 6 Trainer GlobalMemoryStatus-funktiolta mitataan tavuissa ja kiireessä niistä tulee erittäin suuria. Esimerkiksi 32 Mt RAM-muistia (tavallinen määrä järjestelmän muistia) on sama kuin 33,554,432 tavua. Ennen kuin voit kutsua GlobalMemoryStatus-funktiota, sinun täytyy myös varata tilaa julkiselle muuttujalle, joka on MemoryStatus-tyyppiä perusmoduulissasi niin, että voit välittää tietoa GlobalMemoryStatus-funktiolle ja saada vastauksen. Voit liittää minkä tahansa nimen määrittelemällesi muuttujalle. Ohjelmassani, joka suoritetaan hetken päästä, päätin kutsua muuttujaa nimellä meminfo: Määritä muuttuja, niin voit käyttää MemoryStatustyyppiä. Public meminfo As MemoryStatus Sinun täytyy seuraavaksi valmistaa meminfo-muuttuja, jonka määrittelit GlobalMemoryStatus-funktion kutsumista varten. GlobalMemoryStatus vaatii, että MemoryStatus-tyypin dwlength-elementti sisältää MemoryStatus-tyypin pituuden (tavuissa). Tämä voi tuntua oudolta vaatimukselta, koska tiedämme MemoryStatustyypin pituuden etukäteen; se on tavallisesti 32 tavua (kahdeksan 4 tavun pituista kokonaislukua). Windows API:n funktiot vaativat tavallisesti kuitenkin tämän tiedon, kun ne käyttävät osoittimia muistipaikkojen saavuttamisessa. (Tämä kielioppi auttaa funktiota varaamaan oikean määrän muistia funktiolle ja sallii isompien lukujen käytön tulevaisuudessa.) Kun haluat määrittää tämän pituuden ohjelmallisesti, käytät seuraavaa ohjelmalausetta, joka on Form_Load -tapahtuma-aliohjelmassa tai muualla koodissasi ennen kuin haluat kutsua GlobalMemoryStatus-funktiota: meminfo.dwlength = Len(memInfo) Määritä käyttäjän määrittelemän tyypin pituus. Len-funktio määrittää tässä lauseessa meminfo-muuttujan koko pituuden eli muuttujan, joka sisältää MemoryStatus-tyypin. Se kytkee sitten tuon luvun meminfomuuttujan dwlength-elementtiin. Sen jälkeen, kun dwlength-elementti on alustettu oikean pituisella tiedolla, olet valmis kutsumaan GlobalMemoryStatus-funktiota ohjelmassasi. Teet sen kutsumalla Calllausetta tunnistaen funktion ja mukaan lukien meminfo-muuttujan argumenttina. (Jos määritit GlobalMemoryStatus-funktion perusmoduulissa, voit sijoittaa tämän lauseen mihin tahansa tapahtuma-aliohjelmaan projektissasi.) Call GlobalMemoryStatus(memInfo) Kutsu API:a. Sen jälkeen, kun kutsu GlobalMemoryStatus API -rajapintaan on suoritettu onnistuneesti Windows-käyttöjärjestelmässä, meminfo-muuttuja sisältää kahdeksan pitkää kokonaislukua, jotka sisältävät tietoa muistin sen hetkisistä tiloista tietokoneellasi. DwLength-elementti sisältää yhä saman luvun (32 tavua), mutta muut tyypin elementit sisältävät nyt käytännöllistä tietoa järjestelmän muistista. Esimerkiksi

Harjoitus 18 Visual Basicin takana: Windows API:n käyttö 461 seuraava lause käyttää dwtotalphys-elementtiä näyttämään järjestelmän fyysisen muistin (RAM) kokonaismäärän sanomaruudussa. MemInfomuuttujan elementit sisältävät APIkutsun tulokset. MsgBox meminfo.dwtotalphys Seuraava lause näyttää vastaavasti järjestelmäsi näennäismuistin kokonaismäärän tavuissa. (Näennäismuisti, fyysinen muisti sekä se kiintolevyn tila, jota käytetään tilapäisenä tallennuspaikkana.) 18 MsgBox meminfo.dwtotalvirtual Joka kerta, kun kutsut GlobalMemoryStatus-funktiota, Windows-käyttöjärjestelmä päivittää tyypin uudella otteella muistisi käytöstä - eli juuri sen tiedon, jota tarvitset, jos luot hyvän muistintarkkailuohjelman työpöydällesi! Olet juuri luonut ensi katseen siihen, kuinka Windows API:a käytetään ohjelmassa, vaihe vaiheelta. Kuten varmaan huomasit, tekniikassa on vain kaksi olennaista asiaa, jotka pitää hallita. Ensinnäkin, sinun täytyy lisätä oikeat funktion ja tyypin määrittelyt ohjelmaasi niin, että voit kutsua Windows API:a oikein. Toiseksi, sinun täytyy tottua muutamaan uuteen termiin ja kielioppiin, jotka tulevat C-ohjelmointikielestä. Tämä terminologia sisältää sanat pointer, DWORD, structure ja useita muita termejä, joita emme käsittele tässä yhteydessä. Useimmilla näillä termeillä on kuitenkin vastineensa Visual Basicin ohjelmointikäsitteissä, joten sinun ei tarvitse täysin oppia uuttaa abkstraktiota kutsuttaessa Windows API:a. Tähän mennessä kaikki hyvin. Mutta mistä saat tietoa siitä, mitä määrityksiä, tyyppejä ja vakioita sinun pitäisi käyttää kutsuttaessa muita yli tuhatta Windows API -kutsua? Sisältyykö kaikki tämä tieto sisäänrakennettuun opastukseen tai johonkin suureen kirjaan? Nämä molemmat dokumentaatiot ovat todellakin saatavilla. MSDN Library sisältää täydellisen kokoelman tietoa yli 1000 Windows API -funktiosta. Voit myös ostaa Ziff-Davis Press -kustantajalta kätevän viitekirjan, joka luettelee useimmat käytännölliset Windows API -funktiot Visual Basic -ohjelmoijille (Dan Applemanin Visual Basic 5.0 Programmer's Guide to the Win32 API, ISBN 1-56276-446-2). Ennen kuin kuitenkaan menet keskutelemaan näiden käytännöllisten viitemateriaalien hankkimisesta, harjoittele käyttämällä API Viewer -apuohjelmaa, add-in-työkalua, joka voit käynnistää Visual Basicin Add-Ins-valikosta. Tällä siistillä apuohjelmalla voit lisätä määrittelyjä, vakioita ja tyyppejä, joita tarvitset, kun kutsut mitä tahansa Windows API -funktiota. Windows API:n käyttö API Viewer -apuohjelman käyttö Kun haluat ottaa käyttöön Windows API -funktiot, Visual Basic 6 sisältää erityisen tekstitiedoston nimeltä Win32api.txt, joka sisältää kaikki määrittelyt, vakiot ja käyttäjän määrittelemät tyypit, joita tarvitset, kun kutsut Windows API -funktioita Visual Basic -projektistasi. Microsoft on rakentanut tämän tekstitiedoston niin, että se toimii API

462 Visual Basic 6 Trainer Viewer -lisäohjelman kanssa. Ohjelman avulla voidaan nopeasti hakea funktioita ja lisätä tarvittava koodi automaattisesti. Yritä API Viewer -ohjelman käyttöä lisäten määrityksen ja tyyppitiedon, jonka juuri opiskelit. Asenna API Viewer -lisäohjelma Luot ensin valikkokomennon API Viewer -add-in -apuohjelmalle. 1 Käynnistä Visual Basic ja avaa uusi perusprojekti. 2 Valitse Add-In Manager -komento Add-Ins -valikosta. Add-In Manager -valintaikkuna tulee näkyviin luetellen ylimääräiset apuohjelmat, jotka voit lisätä Visual Basicin valikkopalkin Add-Ins -valikkoon. Add-In on erikoisohjelma, joka on suunniteltu antamaan toiminnallisuutta Visual Basic -ohjelmaan. Visual Basic 6 sisältää useita peruslisäohjelmia; voit myös ostaa add-in-ohjelmia kolmansien osapuolten kehittäjiltä 3 Kaksoisnapsauta VB 6 API Viewer -lisäohjelmaa luetteloruudussa. Sana "Loaded" ilmestyy add-in-nimen viereen ja kuvaus ilmestyy Description-ikkunaan ilmentäen apuohjelman tarkoituksen. Loaded/ Unloaded-valintaruutu on myös rastitettu. Kun rastimerkki ilmestyy tähän ruutuun, valittu lisäohjelma ilmestyy Add-Ins -valikkoon kaikille projekteille, kunnes poistat sen. Sinun Add-In Managerisi näyttää tältä: G18x01.bmp tärkeää Jos et näe VB 6 API Viewer -lisäohjelmaa, käynnistä Visual Basic 6:n asennusohjelma uudelleen ja asenna kaikki lisäohjelmat.

Harjoitus 18 Visual Basicin takana: Windows API:n käyttö 463 4 Napsauta OK lisäten API Viewer -lisäohjelman Add-Ins -valikkoon. Add-Ins -valikkosi sisältää nyt API Viewer -komennon. Käytä API Vieweriä määritysten lisäämiseen Harjoittelet nyt API-funktioiden lisäämistä API Viewerillä. 1 Valitse Add-Ins -valikon API Viewer -komento. API Viewer -ohjelma ilmestyy ruudulle. Nyt sinun pitää paikallistaa Win32api.txt järjestelmässäsi. (API Viewer voi avata minkä tahansa tekstitiedoston, joka sisältää Windows API -määritykset. Sitten, kun tulevaisuuden APIkokoelmat tulevat saataville, voit avata myös ne tällä apuohjelmalla.) 2 Valitse API Viewerin File-valikosta Load Text File -komento. 3 Selaa etsien Win32api.txt-tiedosto järjestelmästäsi ja avaa se. Löydät tämän tiedoston useimmissa Visual Basic -järjestelmissä kansiosta C:\Program Files\Microsoft Visual Studio\Common\Tools\Winapi. Jos sinulla ei ole tämän nimistä kansiota, käytä Windowsin Käynnistä (Start) -valikon Etsi (Find) -komentoa tiedoston hakemisessa. (Tiedosto on myös saatavilla Visual Basicin asennuslevykkeillä.) 18 Windows API:n käyttö vihje Win32api.txt-tiedosto on yli 640 kt kooltaan ja sen käyttö voi olla hieman hidasta. Jos haluat konvertoida tämän tiedoston Microsoftin Jet -tietokantamuotoon nopeampia hakuja varten, valitse File-valikon Convert Text to Database -komento. 4 Kirjoita API Viewerin tekstiruutuun GlobalMemoryStatus. Kun kirjoitat, API-nimet ilmestyvät Available Items -tekstiruutuun. Kun olet kirjoittanut tekstin, GlobalMemoryStatus on aina valintaruudussa. tärkeää Jos sinun kopiosi Win32api.txt-tiedostosta ei sisällä GlobalMemoryStatus-funktiota, yritä etsiä sen sijaan MemoryStatus-funktiota. Molemmat funktiot suorittavat saman tehtävän ja niitä kutsutaan samalla tyyppiargumentilla (MemoryStatus-puskuri). Win32api.txt-tiedosto on päivitetty aika ajoin niin, että se sisältää muutokset ja uudet nimeämistavat Windows ja Windows NT -käyttöjärjestelmissä.

464 Visual Basic 6 Trainer 5 Napsauta Add-painiketta lisäten GlobalMemoryStatus-funktion määrityksen Selected Item -luetteloon. API Viewer näyttää seuraavan kaltaiselta: G18x02.bmp Nyt lisäät MemoryStatus-tyyppimäärityksen Selected Item -luetteloon. 6 Napsauta API Type -pudotusvalikosta ja napsauta sitten Types-valintaa. API Viewer etsii tyyppimäärityksiä Win32api.txt-tiedostosta ja näyttää ensimmäiset valinnat Available Items -luetteloruudussa. Jos sinua pyydetään tallentamaan Win32api.txt-tiedoston tietokannaksi nopeampaa hakua varten, valitse No. Voit suorittaa tämän ylimääräisen askeleen, jos huomaat, että käytät Win32api.txt-tiedostoa usein. 7 Poista GlobalMemoryStatus-funktio "Type the first few letters..." -tekstiruudusta. Kirjoita nyt MemoryStatus ja napsauta sitten Add-painiketta. MemoryStatus-tyyppimääritys kopioidaan Selected Items -luetteloon. Kopioi nyt molemmat määrittelyt leikepöydälle niin, että voit lisätä ne Visual Basic -ohjelmasi perusmoduuliin. 8 Napsauta Copy-painiketta. API Viewer -kopioi molemmat määritykset Windowsin leikepöydälle. 9 Pienennä API Viewer -apuohjelma ja suurenna Visual Basicin kehitysympäristö.

Harjoitus 18 Visual Basicin takana: Windows API:n käyttö 465 10 Valitse Project-valikosta Add Module -komento ja napsauta sitten Openpainiketta avaten uuden perusmoduulin projektissasi. 11 Varmista, että lisäyskohta vilkkuu perusmoduulin Code-ikkunassa. Napsauta sitten Paste Visual Basicin työkaluriviltä lisäten kaksi määritystä moduuliin. Visual Basic lisää määritykset perusmoduuliisi. 12 Katkaise ensimmäinen rivi kahdelle riville käyttäen alleviivausmerkkiä (_) niin, että voit nähdä koko määrityksen Code-ikkunassa. Hyvä paikka, missä kannattaa katkaista rivi on "kernel32"-kirjaston nimen jälkeen. Älä koskaan katkaise riviä lauseen nimen tai lainausmerkkien sisällä olevan sanan keskellä. 13 Siirrä GlobalMemoryStatus-määritys (joka nyt on kahdella rivillä) MemoryStatus-määrityksen alapuolelle. Code-ikkunasi näyttää nyt tältä: 18 Windows API:n käyttö G18x03.bmp GlobalMemoryStatus-määrityksen siirtäminen tyyppimäärityksen alapuolelle on välttämätöntä, koska GlobalMemoryStatus-määritys riippuu MemoryStatuksen tyypistä sen määrityksessä. Jos tyyppimääritys seuraa funktion määritystä, Visual Basic näyttää virheilmoituksen, kun se suorittaa ohjelman. 14 Sulje API Viewer -apuohjelma, joka on pienennettynä Windowsin tehtäväpalkilla. Siinä kaikki! API Viewer kopioi automaattisesti kaiken tiedon, joka tarvitaan Windows API -funktion suorittamiseen. Sinun tarvitsee vain etsiä tarvitsemaasi API:a ja kopioida se projektiisi leikepöydän kautta!

466 Visual Basic 6 Trainer vihje Eräät API-funktiot ja tyypit käyttävät vakioita määrityksissään. Vaikka en esittele niiden käyttämistä, voit myös käyttää API Vieweriä vakioiden määritysten kopiointiin Win32api.txt-tiedostosta projektiisi. Win32api.txt-tiedoston vakiot ovat samanlaisia vakioita kuin ne, joihin olet törmännyt Visual Basicissä (kuten vbyesno-vakio, jota olet käyttänyt sanomaruuduissa näytettäessä Kyllä ja Ei - painikkeet). Kun haluat lisätä vakion määritykset API Viewer -apuohjelmalla, valitse Constants API Viewerin Type-luetteloruudusta, kirjoita vakion nimi "Type the first few letters..." -tekstiruutuun, ja kopioi sitten tarvitsemasi vakio perusmoduuliisi. Muistin käytön valvonta tietokoneellasi Nyt kun olet saanut hieman harjoitusta työskenneltäessä GlobalMemoryStatusfunktion parissa, kokeile ajaa FreeMem-ohjelma, jonka loin Visual Basicillä esitellen GlobalMemoryStatus API:n. FreeMem-ohjelma näyttää graafisesti tietokoneellasi käytetyn fyysisen ja näennäismuistin kokonaismäärän. Tämä tieto on käytännöllistä, jos haluat tarkkailla sitä, kuinka RAM-muistia ja kiintolevyn tilaa ohjelmat käyttävät tietokoneellasi. Jos huomaat esimerkiksi, että näennäismuistia on erittäin vähän vapaana, haluat varmaan vapauttaa lisää levytilaa järjestelmän muistille. FreeMemohjelma käyttää myös GlobalMemoryStatus-funktiota näytettäessä seuraavia yksityiskohtia järjestelmän muistin käytöstä (tavuissa): Fyysisen muistin kokonaismäärä (RAM) tietokoneellasi. Vapaana olevan fyysisen muistin kokonaismäärä (RAM) tietokoneellasi. Aktiivisen sivutustiedoston koko. Sen hetkisessä sivutustiedostossa olevan vapaan muistin määrä. Näennäismuistin (RAM plus kiintolevyn tila) kokonaismäärä tietokoneellasi. Windows Swap -tiedosto ohjaa tätä lukua. Vapaana olevan näennäismuistin (RAM plus kiintolevyn tila) kokonaismäärä tietokoneellasi. Yritä ajaa nyt FreeMem-ohjelma niin näet, kuinka muistia käytetään järjestelmässäsi.

Harjoitus 18 Visual Basicin takana: Windows API:n käyttö 467 Aja FreeMem-ohjelma G18 x 04 Start-painike 1 Avaa FreeMem-projekti kansiosta \Vb6Sbs\Less18. Kun sinua pyydetään tallentamaan muutoksesi, valitse No. (Olen jo lisännyt kaikki tarvitsemasi API-määritykset tähän projektiin.) 2 Napsauta työkalurivin Start-painiketta suorittaen ohjelman. FreeMem-ohjelma lataa ja käyttää GlobalMemoryStatus API:a keräämään tietoa tietokoneesi muistista. Näet hetken päästä tuloksen, joka on vastaavanlainen kuin seuraaava: 18 Windows API:n käyttö FreeMem näyttää muistin kaksi perustilastoa graafisesti: käytetyn fyysisen muistin kokonaismäärän ja näennäismuistin kokonaismäärän heittovaihtotiedostossa. Luvut päivitetään joka kolmas sekunti ajastinobjektilla ohjelmassa. Kaksi tilapalkkiobjektia esittää tiedon visuaalisesti ja myös prosentuaalisena arvona. tärkeää Tuntuuko fyysisen muistin käyttö sinusta korkealta? Vaikka se voi tuntua hieman epätavalliselta, älä ylläty, jos fyysisen muistin (RAM) käyttöprosentti on lähes 100% tietokoneellasi. Vaikka ajat vain yhden ohjelman (Visual Basic), Windowsin muistinhallinta täyttää tietokoneesi käyttämättömä RAM-muistin käyttöjärjestelmän rutiineilla, heittovaihtotiedostoilla, aikaisemmin avattujen ohjelmien lauseilla, tarvittavilla.dll-kirjastoilla, leikepöydän arvoilla ja niin edelleen. Fyysisen muistin prosentuaalinen korkea käyttö on aivan tavallista. 3 Napsauta lomakkeella olevaa Details-painiketta nähdäksesi enemmän yksityiskohtaista tietoa muistin käytöstä tietokoneellasi.

468 Visual Basic 6 Trainer G18x05.bmp FreeMem avaa toisen lomakkeen, joka näyttää yksityiskohtia viimeisimmästä kutsusta GlobalMemoryStatus API:in. Näet tietoa, joka näyttää samankaltaiselta kuin seuraava: Sivutustiedosto on näennäismuistin lohko. GlobalMemoryStatus API palauttaa jokaisen näistä arvoista MemoryStatustyyppinä. Vaikka funktion oletusmittayksikkö on tavu, näytän tiedon kilotavuina (Kt) vähentääkseni silmän väsymystä. (Tämä on mahdollista jakamalla jokainen arvo 1024:llä.) Vaikka fyysisen ja näennäismuistin luvut ovat jo varmasti tuttuja sinulle, sivutustiedostojen luvut vaativat varmasti hieman lisää käsittelyä. Sivu (page) on kiinteän kokoinen muistilohko, joka on liitetty Windowsin heittovaihtotiedostoon näennäismuistissa. Ohjelma voi varata tämän muistilohkon suorituksen aikana. Windowsin muistinhallinta pitää kirjaa näennäismuistin sivutustiedostoista niin, että nopein fyysinen muisti voidaan varata ohjelmille, joita käytettiin viimeksi. Sivutustiedostoilla on myös lisäetu: ne vapauttavat ohjelmoijan huolen siitä mikä on hänen ohjelmansa käyttämän fyysisen muistin tarkka sijainti. Sivutustiedoston sisältö voidaan paikallistaa mistä tahansa Windowsin heittovaihtotiedostosta - fyysisestä Ram-muistista, kiintolevyltä tai toiselta järjestelmän tallennusresurssilta. Kun yksi sivutustiedosto täyttyy, Windowsin muistinhallinta avaa toisen. 4 Napsauta OK sulkien Details-lomakkeen ja valitse Quit lopettaen ohjelman. Tarkastele nyt hetken ohjelmalauseita, jotka saavat tämän sovelluksen toimimaan. Tutki FreeMem-ohjelman lauseita 1 Avaa perusmoduuli (FreeMem.bas) Code-ikkunassa nähdäksesi, kuinka GlobalMemoryStatus-funktio on määritelty. Näet samat ohjelmalauseet, joita on käsitelty koko kappaleen aikana: MemoryStatus-tyyppi, joka säilyttää kahdeksan arvoa järjestelmän muistista,

Harjoitus 18 Visual Basicin takana: Windows API:n käyttö 469 GlobalMemoryStatus API:n määrityslauseet ja määrityslause, joka luo julkisen muuttujan nimeltä MemInfo tyyppiä MemoryStatus: 18 G18x06.bmp 2 Avaa päälomake (Form1) Code-ikkunassa ja näytä Form_Load - tapahtuma-aliohjelma, niin näet, kuinka GlobalMemoryStatus-funktiota on käytetty. Näet seuraavat ohjelmalauseet: Windows API:n käyttö Private Sub Form_Load() Determine length of meminfo type meminfo.dwlength = Len(memInfo) Call GlobalMemoryStatus API to set up progress bars Call GlobalMemoryStatus(memInfo) pgbphysmem.min = 0 pgbphysmem.max = meminfo.dwtotalphys pgbvirtmem.min = 0 pgbvirtmem.max = meminfo.dwtotalvirtual End Sub Kuten kuvailin aikaisemmin, sinun täytyy määrittää meminfo-tyypin dwlengthelementti tyypin leveydeksi ennen kuin voit kutsua GlobalMemoryStatusfunktiota ensimmäisen kerran. Sen jälkeen, kun olen määrittänyt luvun (32 tavua) Len-funktiolla, kutsun GlobalMemoryStatus API:a ja käytän sitten elementtejä dwtotalphys ja dwtotalvirtual asettaakseni kahden edistymispalkin enimmäismuistin määrän ohjelmassani. (Pitäessäni kirjaa näistä kahdesta tilapalkista, olen antanut niille nimiksi pgbphysmem ja pgbvirtmem.) 3 Avaa Timer1_event -tapahtuma-aliohjelma, niin näet kuinka tilapalkit päivitetään käytössä olevan muistin määrällä.

470 Visual Basic 6 Trainer Näet seuraavat ohjelmalauseet: Private Sub Timer1_Timer() Dim PhysUsed Dim VirtUsed Call GlobalMemoryStatus API to get memory usage info Call GlobalMemoryStatus(memInfo) PhysUsed = meminfo.dwtotalphys - meminfo.dwavailphys pgbphysmem.value = PhysUsed Display memory usage with labels and progress bars lblphysused.caption = Physical Memory Usage: & _ Format(PhysUsed / meminfo.dwtotalphys, 0.00% ) VirtUsed = meminfo.dwtotalvirtual - meminfo.dwavailvirtual pgbvirtmem.value = VirtUsed lblvirtused.caption = Virtual Memory Usage: & _ Format(VirtUsed / meminfo.dwtotalvirtual, 0.00% ) End Sub Koska käytössä olevan muistin määrä muuttuu jatkuvasti, halusin päivittää näytön aina silloin tällöin niin, että käyttäjä voi nähdä muutokset ensi tilassa. (Esimerkiksi, yritä ajaa ja sulkea ohjelma niin, että näet lukujen muuttuvan.) Yksinkertaisin tapa päivittää ruutu säännöllisesti on käyttää ajastinobjektia ja asettaa sen Interval-ominaisuuden arvoksi 3000 (kolme sekuntia). Niin kauan kuin ohjelma on käynnissä, Timer1_Timer -tapahtuma-aliohjelma kutsuu GglobalMemoryStatus-funktiota joka kolmas sekunti ja päivittää tilapalkit ja otsikot. (Huomaa, että jaoin vapaana olevan muistin kokonaismuistin määrästä saadakseni käytössä olevat prosentit.) 4 Avaa toinen lomake (frmdetails) Code-ikkunassa ja katso Form_Load - tapahtuma-aliohjelmaa nähdäksesi, kuinka muistin käytön yksityiskohdat näytetään. Näet seuraavat ohjelmalauseet: Private Sub Form_Load() Use meminfo type to display memory usage details lbltotalphys.caption = Total physical memory (RAM): & _ meminfo.dwtotalphys / 1024 & KB lblavailphys.caption = Free physical memory (RAM): & _ meminfo.dwavailphys / 1024 & KB lbltotalpage.caption = Total KB in current paging file: & _ meminfo.dwtotalpagefile / 1024 lblavailpage.caption = Free KB in current paging file: & _ meminfo.dwavailpagefile / 1024 lbltotalvirtual.caption = Total virtual memory: & _ meminfo.dwtotalvirtual / 1024 & KB

Harjoitus 18 Visual Basicin takana: Windows API:n käyttö 471 lblavailvirtual.caption = Free virtual memory: & _ meminfo.dwavailvirtual / 1024 & KB End Sub FrmDetails-lomake on toinen lomake, jonka loin ohjelmassa näyttääkseni yksityiskohtaista tietoa muistin käytöstä. Sijoitin ohjelmalauseet, jotka näyttävät tiedon Form_Load -tapahtuma-aliohjelmaan, jotta se näyttäisi tiedon heti, kun käyttäjä napsauttaa Details-painiketta. Form1-lomakkeen tilapalkeista ja otsikoista poiketen Details-lomake ei tarjoa dynaamista tietoa, vaan yksinkertaisesti otoksen sen hetkisestä muistin käytöstä. Koska käytän kuutta eri otsikkoa näyttämään tiedon lomakkeella, annoin otsikoille uudet nimet, jotka alkavat lbl-lyhenteellä ja lisäsin niiden käytön kuvauksen, jotta saisin ne pysymään järjestyksessä. Jokainen tapahtuma-aliohjelmassa näytettävä meminfo-tyypin elementti on jaettu luvulla 1024, joten tieto näytetään kilotavuissa. 18 Windows API:n käyttö Ohjelman lopettaminen Unload-tapahtumalla Kun sinulla vielä on FreeMem-ohjelma auki, tutki hetken aikaa, kuinka lopetan ohjelman, kun käyttäjä napsauttaa Form-lomakkeen Quit-painiketta. _ Avaa Form1:n Command2_Click -tapahtuma-aliohjelma Code-ikkunassa. Näet seuraavat ohjelmalauseet: Private Sub Command2_Click() Unload frmdetails Unload Form1 End Sub unload both forms to quit Aikaisemmin tässä kirjassa olet lopettanut ohjelmat käyttämällä End-lausetta. Tämä menetelmä on ihan hyväksyttävä, mutta kun alat työskenellä hienostuneimpien ohjelmointiprojektien parissa (ja alat lukea laajempia kirjoja Visual Basic -ohjelmoinnista), tulet varmasti huomaamaan, että eräät Visual Basic -ohjelmoijat käyttävät Unload-lausetta lopettamaan ohjelmansa. Itse Unload-lauseen ei pitäisi olla uusi sinulle - käytimme sitä sulkemaan avoimen lomakkeen harjoituksessa 8. Kuten muistat, Unload ei pelkästään poista lomaketta näytöltä, vaan se myös vapauttaa muistin, jota se käytti. Sen lisäksi, Unload-tapahtumaa voidaan käyttää lopettamaan ohjelma, jos sitä käytetään sen hetkiselle (ja ainoalle jäljellä olevalle) lomakkeella avoimessa sovelluksessa. Seurasin tätä käytäntöä

472 Visual Basic 6 Trainer FreeMem-ohjelmassa - Unload poistaa sekä frmdetails- että Form1 -lomakkeet muistista. Voit käyttää tätä tekniikkaa vapaasti ohjelmissasi ammattilaismaiselta näyttävänä vaihtoehtona End-lauseelle. Jos haluat jatkaa seuraavaan harjoitukseen _ Pidä Visual Basic käynnissä ja siirry harjoitukseen 19. Jos haluat lopettaa Visual Basicin nyt _ Valitse File-valikon Exit. Jos näet Save-valintaikkunan, valitse No. Harjoitus 18 Pikaopas Tehtävä Julistaa Windows API -funktiot ohjelmassasi Määrittää käyttäjän määrittelemän tyypin pituus Kutsua Windows API -funktiota Käyttää Windows API -funktion palauttaman tyypin elementtejä Lopettaa ohjelma käyttämällä Unload-lausetta Ohje Kopioi tarvittava funktio, tyyppi ja vakion määrittelyt perusmoduuliin projektissasi. Tämä voidaan tehdä hienosti etsimällä funktiota API Viewer -lisäohjelmalla ja kopioimalla määritykset Windowsin leikepöydän kautta. Käytä Len-funktiota. Esimerkki: meminfo.dwlength = Len(memInfo) Käytä Call-lausetta ja lisää tarvittavat argumentit. Esimerkiksi, kun haluat kutsua GlobalMemoryStatus-funktiota, kirjoita: Call GlobalMemoryStatus(memInfo) Määritä sen muuttujan nimi, joka on liitetty tyyppiin ja elementin nimeen. Esimerkiksi, jos haluat kytkeä meminfo-muuttujan (joka on tyyppiä MemoryStatus) dwtotalphys-elementin tilapalkin Max-ominaisuuteen, kirjoita: pgbphysmem.max = meminfo.dwtotalphys Käytä Unload-lausetta ohjelmasi päälomakkeella argumenttinä. Esimerkki: Unload Form1