Näytetään tekstit, joissa on tunniste Windows. Näytä kaikki tekstit
Näytetään tekstit, joissa on tunniste Windows. Näytä kaikki tekstit

perjantai 17. lokakuuta 2008

Enemmän äskettäin käytettyjä tiedostoja

Windows XP:n Explorer pitää kirjaa äskettäin käytetyistä tiedostoista, joita se luettelee käynnistä-valikossa. Tiedostojen lukumäärää voi muuttaa ryhmäkäytäntöeditorilla seuraavasta paikasta: User Configuration \ Administrative Templates \ Windows Components \Windows Explorer \Maximum number of recent documents. Rekisteriin suurin sallittu lukumäärä kirjoitetaan DWORD-heksadesimaaliarvona MaxRecentDocs avaimeen HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer.

torstai 28. elokuuta 2008

Dellin näppäimistön pikanäppäinten säätäminen

Dell varustaa ainakin kannettaviaan näppäimistöllä, jossa on pikanäppäimiä nettiselailulle, sähköpostille ja laskimelle. Viimeksi mainittu on erittäin kätevä, jos on usein tarvetta pikaisille pienille laskuille. Valitettavasti Windowsin vakiolaskin on monessakin mielessä varsin alkeellinen. Onneksi pikanäppäimen suorittaman ohjelman voi vaihtaa muuttamalla avaimen HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AppKey\18 arvoa. Enää tarvitaan vain kunnollinen laskin!

maanantai 21. heinäkuuta 2008

Muistin jakaminen DLL:n kautta

Windowsissa prosessien on mahdollista jakaa muistia DLL:n kautta. Kun DLL:n muistialue merkitään jaetuksi, järjestelmä kuvaa muistin siten, että jokainen jaetuksi merkittyä muistialuetta käyttävä prosessi näkee saman fyysisen muistialueen. Tällaisen jaetun muistialueen avulla prosessit voivat kommunikoida.

Kirjoitin C:llä yksinkertaisen demon jaetun muistin käytöstä. Kaikki netistä löytämäni demot oli kirjoitettu C++:lla ja niissä oli lähes poikkeuksetta graafisia käyttöliittymiä, joiden toteuttamiseen tarvittavien koodirivien varjoon demon kannalta oleellinen koodi jää. Graafinen käyttöliittymä on mielestäni hätävarjelun liioittelua, joten minun demossani ei ylimääräisiä rivejä ole.

Demo koostuu kolmesta ohjelmasta: SharedDataSegmentDLLHostingApplication, SharedDataValueIncrementer ja SharedDataValuePrinter. Jaetun muistialueen sekä sen manipulointiin tarvittavat funktiot sisältävä DLL on nimeltään SharedDataSegmentDLL.

SharedDataSegmentDLL

Kun käytetään GCC:tä, DLL:ään voidaan koodata jaettu kokonaislukumuuttuja seuraavasti:
int sharedInteger __attribute__((section ("shared"), shared)) = 0;
Microsoftin kääntäjä/linkitin haluaa nähdä rivit
#pragma data_seg (".shared")
int sharedInteger = 0;
#pragma data_seg()
#pragma comment(linker, "/SECTION:.shared,RWS")
Tässä on siis määritelty kokonaisluku sharedInteger jaetuksi. Muuttuja on alustettava kuten yllä on esitetty. Muuttujan arvo voidaan lukea yksinkertaisesti tekemällä DLL:ään funktio PrintSharedDataValue():
DLLEXPORT void PrintSharedDataValue() {

printf("%i", sharedInteger);

}
Muuttujan arvoa voidaan muuttaa funktiolla IncrementSharedDataValue():
DLLEXPORT void IncrementSharedDataValue() {
sharedInteger++;
}
Tässä DLLEXPORT on määritelty siten, että kääntäjä ymmärtää, että DLL:n lataavien prosessien on tarkoitus käyttää funktiota:
#ifndef DLLEXPORT
#define DLLEXPORT __declspec(dllexport) // export DLL information
#endif
Lisäksi tarvitaan funktio DLLSleep(). Jos nimittäin HostingApplication kutsuisi vain Win32 API:n Sleep()-funktiota, Windowsin lataimella ei olisi mitään syytä ladata SharedDataSegmentDLL:ää. Kun DLL:ään koodataan DLLSleep():
DLLEXPORT void DLLSleep() {
Sleep(INFINITE);
}
ja kutsutaan tätä funktiota HostingApplicationissa,
Windowsin on pakko ladata DLL. Tällöin jaettu muuttuja tulee samalla alustetuksi.

SharedDataSegmentDLLHostingApplication

Tämän ohjelman tarkoitus on pysyä käynnissä ja pitää SharedDataSegmentDLL ladattuna muistissa. Ohjelma on varsin yksinkertainen:

#include "../header/dll.h"


DLLIMPORT void DLLSleep();

int main(int argc, char *argv[])
{
DLLSleep();
}
DLLIMPORT kertoo, että on tarkoitus käyttää DLL:ssä määriteltyä funktiota DLLSleep(). DLLIMPORT on määritelty tiedostossa dll.h. Muuta main()-funktiossa ei sitten tarvitsekaan tehdä. SharedDataSegmentDLLHostingApplication nukkuu ikuisesti ja pitää DLL:n muistissa.

SharedDataValueIncrementer

SharedDataValueIncrementer kasvattaa jaetun kokonaisluvun arvoa kutsumalla funktiota IncrementSharedDataValue():
#include "../header/dll.h"

DLLIMPORT void IncrementSharedDataValue();

int main(int argc, char *argv[])
{
IncrementSharedDataValue();
}

SharedDataValuePrinter

SharedDataValuePrinter tulostaa jaetun kokonaislukumuuttujan arvon kutsumalla funktiota PrintSharedDataValue()
#include "../header/dll.h"

DLLIMPORT void PrintSharedDataValue();

int main(int argc, char *argv[])

{

PrintSharedDataValue();

}

Ohjelmiston kääntäminen

Olen määritellyt dll.h:n sijainniksi ../header, jolloin jokainen lähdekooditiedosto sijaitsee omassa hakemistossaan ja dll.h header-hakemistossa. Lisäksi kääntäjää voi joutua neuvomaan etsimään otsaketiedostoja header-hakemistosta. DLL on käännettävä ensin, koska sitä tarvitaan ohjelmien kääntämiseksi. Kääntäjälle on kerrottava, että sen tulee käyttää DLL:ää vastaavaa lib-tiedostoa.

Ohjelmiston käyttö

SharedDataDLLHostingApplication käynnistetään komentotulkista. Toisesta komentotulkista käytetään SharedDataValuePrinteriä ja SharedDataValueIncrementeriä, jonka pitäisi kasvattaa muuttujan arvoa yhdellä jokaisella ajokerralla. Jos muuttujan arvo ei muutu, muuttujan määrittely jaetuksi ei ole onnistunut. DLL:n pitää sijaita samassa hakemistossa kuin ohjelmat.

Lähdekoodi

Lähdekoodia saa käyttää vapaasti.

dll.h (teksti) (HTML)
SharedDataSegmentDLL.c (teksti) (HTML)
SharedDataSegmentDLLHostingApplication.c (teksti) (HTML)
SharedDataValueIncrementer.c (teksti) (HTML)
SharedDataValuePrinter.c (teksti) (HTML)
SharedDataSegmentDemoGCC.zip

sunnuntai 13. heinäkuuta 2008

WM

Tällä ohjelmalla, tai pikemminkin ohjelmistolla, ei ole selvää nimeä. Ohjelmistoon kuuluu yksi suoritettava ohjelma, wm.exe, ja yksi kirjasto, wmmouse.dll. Ohjelmiston tarkoitus on helpottaa ikkunoiden siirtämistä ja niiden koon muuttamista. Unixeissa monet X-ikkunointiohjelmat sallivat ikkunan siirtämisen siten, että kohdistinta ei tarvitse sijoittaa ikkunan otsikkopalkin päälle. Kun jotain muunninnäppäintä, yleensä Alttia, pidetään painettuna samaan aikaan kuin hiiren ykköspainiketta, hiiren kohdistimen alla päällimmäisenä oleva ikkuna seuraa hiiren kohdistinta. Ikkunan kokoa voi WM:n avulla muuttaa pitämällä hiiren kakkospainiketta ja Alttia painettuna ja liikuttamalla hiiren osoitinta.

WM:n yksi hienoimpia ominaisuuksia on lähdekoodin vapaus. Lähdekoodi on saatavissa Codeprojectista hakusanoilla "X-window manager". Tavoitteni on lisätä WM:ään ominaisuus, joka muuttaa hiiren rullaustapahtumien käsittelyä siten, että hiiren osoittimen alla oleva ikkuna vastaanottaa rullaustapahtumat. Lisäksi koukkujen pitäisi nielaista hiiren kolmospainikkeen painallukset huolellisemmin, sillä esimerkiksi Matlabin ohjeselaimen ikkunat avaavat kontekstivalikon, kun hiiren oikea näppäin vapautetaan, vaikka Alt olisi ollut painettuna.

Koodin parantelu tosin vaatisi, että pitäisi opetella C++:aa. Pitäisi myös osata ja ymmärtää koukkuja. Tämän jälkeen olisi ehkä mahdollista ymmärtää, miten ohjelma toimii. Lisäksi olisi hyvä saada ohjelma kääntymään wxDev-C++:lla, koska se on vapaasti saatavissa. Codeprojectista saatava koodi toimii vain Visual Studiolla käännettynä. Ohjelma toimi myös Visual Studio Express Editionilla käännettynä, mutta jostain syystä vain debug-versiona, jolloin se vaati Expressin mukana toimitettavia kirjastoja, mikä vaikeuttaa ohjelman binäärin siirtämistä.