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.
perjantai 17. lokakuuta 2008
torstai 28. elokuuta 2008
Dellin näppäimistön pikanäppäinten säätäminen
maanantai 21. heinäkuuta 2008
Muistin jakaminen DLL:n kautta
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 DLLEXPORTLisäksi tarvitaan funktio
#define DLLEXPORT __declspec(dllexport) // export DLL information
#endif
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 funktiotaPrintSharedDataValue()#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
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ä.