Sisällysluettelo
AivoDiet
AivoDiet on yksinkertainen ohjelma, jolla luodaan ja seurataan ruokavaliodieettejä
Uusin testattu versio 2.0.2.0
AivoDiet 2.x
Ohjelman siirryttyä versioon 2.x se alkoi tukea myös SQL Serveriä tietokantansa säilytyspaikaksi. Tämä helpottaa huomattavasti ohjelman paketointia.
Ohjelma
Paketoitava ohjelma sisältää hakemistossa %ProgramFiles(x86)%\AivoDiet2 seuraavat tiedostot:
- AivoDiet.exe - ajettava ohjelma
- AivoDiet.pdf - pelkkä tervetuloa viesti
- strings.txt
Tee näistä msi-paketti. Lisää pakettiin myös registry-haaraan HKLM\SOFTWARE\ODBC\ODBC.ini\AivoDiet
seuraavat arvot, jotka määrittävät ohjelman käyttämän SQL Serverin asetukset:
Driver = [WinDir]SYustem32\\SQLSRV32.dll
, stringServer = stone.utu.fi
, stringAnsiNPW = No
, stringDatabase = AivoDB
, stringLastUser = AIVO
, string
Vanhempi versio Aivo Diet 32
Ohjelma
Ohjelma koostuu kolmesta osasta:
- diet32.exe - %ProgramFiles%\Diet32-hakemistossa
- aivo.ini - %SystemRoot%-hakemistossa
- diet32.mdb - Access tietokanta, sijainti määritelty ODBC:ssä
Diet32.exe on varsinainen ohjelma, jolla manipuloidaan tietokantaa. Aivo.ini sisältää tietokantaan kirjautumisen kredentiaalit. Tietokantaan tallennetaan kaikki käyttäjän tekemät ruokavaliot yms.
Diet32:n oma asennusohjelma asentaa tietokannan lokaalisti koneelle, jolloin kaikki käyttäjät käyttävät samaa tietokantaa (samalla koneella). Koska Diet32 haluttiin asentaa mikroluokkaan ja sitä tulisi käyttämään useampi käyttäjä samalta koneelta, pitää jokaisella käyttäjällä olla oma tietokanta käytössä. Lisäksi haluttiin, että oma tietokanta säilyy vaikka vaihtaa toiselle mikroluokan koneelle. Ohjelmaan tulee myös säännöllisesti, noin kahdesti vuodessa, päivityksiä.
Suunnitelma
Päätimme laittaa Diet32:n verkkoasennukseksi siten, että ajettava diet32.exe sijaitsee verkkolevyllä ja paikallisesti asennetaan erikseen tehty käynnistysohjelma (frontend) ja aivo.ini tiedosto. Frontend käynnistäessään Diet32 korjaa ODBC asetukset osoittamaan käyttäjän omaan tietokantaan käyttäjän verkkokotihakemistossa. Lisäksi frontend tarkistaa aina, onko ns. master-tietokantaan tullut päivityksiä ja ehdottaa käyttäjälle tietokannan päivitystä (kopiointi) tarvittaessa. Diet32.exe voidaan päivittää suoraan verkkolevylle ja se tulee automaattisesti kaikille käyttöön.
Frontend
Frontend tarkistaa käyttäjän nimen, etsii sillä nimellä käyttäjän verkkokotihakemiston ja tarkastaa onko siellä Diet32-tietokantaa. Jos on, niin tarkastetaan että tietokanta on ajantasalla.
Tietokanta kopioidaan verkossa sijaitsevasta master-tietokannasta. Kun se kopioidaan, frontend kirjoittaa käyttäjän kotihakemistoon master-tietokannan Last Modified-aikaleiman. Myöhemmin voidaan verrata ovatko aikaleimat samat vai onko master-tietokantaa päivitetty.
Käynnistettäessä ohjelmaa, kirjoitetaan ODBC-asetukset kuntoon ja sitten ajetaan verkosta diet32.exe. Alla ODBC-asetusten säätäminen C++:lla (dbpath sisältää tietokannan polun):
HINSTANCE rc = AfxGetResourceHandle(); char buffer[1024]; // update ODBC data source sprintf(buffer, "%s\n%s\n%s\nDBQ=%s\n", "DSN=Diet32", "Description=Diet32 personal database for user", "FIL=MS Access;", dbpath.c_str()); // format requires terminators instead of newlines int i,s; s = strlen(buffer); for(i=0;i<s;i++) { if(buffer[i] == '\n') buffer[i] = '\0'; } if(SQLConfigDataSource(NULL, ODBC_ADD_DSN, "Microsoft Access Driver (*.mdb)", buffer) == FALSE) { LoadString(rc, IDS_ODBC_CONFIG_FAILED, buffer, 1024); MessageBox(buffer, NULL, MB_ICONSTOP | MB_OK); }
Asennuspaketista tuleva aivo.ini sisältää tietokantaan kirjautumisen kredentiaalit, jotka voivat olla samat jokaiselle käyttäjälle, koska jokaisella on oma tietokanta kotihakemistossaa, johon muut eivät pääse käsiksi.
Login-ruutu
Vaikka Diet32-tietokantaan kirjautumiseen tarvittava tieto löytyy aivo.ini-tiedostosta, haluaa Diet32 silti itse näyttää Login-ruudun. Koska jokaisella on oma tietokanta, tämä on täysin turha vaihe, josta haluttiin päästä eroon. Pikaisen mailineuvonpidon jälkeen oli selvää, että aivo.ini-tiedostoon ei ole sellaista asetusta, jolla Login-ruudusta pääsisi eroon. Siksi Login-nappulan painaminen ohjelmallisesti saa ajaa asian. Tämä tapahtuu kohtuullisen yksinkertaisesti. Ensin etsitään Visual Studion mukana tulevalla Spy++-ohjelmalla Diet32:n Login-ruudun nappuloiden nimet, sitten kirjoitetaan C++ koodi, joka etsii ohjelman käynnistämisen jälkeen oikean nappulan ja lähettää sille hiiren painamista simuloivan viestin.
HWND AivoLogin = NULL; HWND AivoLoginPanel = NULL; HWND AivoLoginOK = NULL; int i = 0; while(i<200) { // 10 sec trying to find the correct button if(AivoLogin == NULL) AivoLogin = FindWindowEx(NULL, NULL, NULL, "Aivo2000 - Diet32 sisäänkirjautuminen"); if(AivoLoginPanel == NULL && AivoLogin != NULL) AivoLoginPanel = FindWindowEx(AivoLogin, NULL, "TPanel", NULL); if(AivoLoginOK == NULL && AivoLoginPanel != NULL) AivoLoginOK = FindWindowEx(AivoLoginPanel, NULL, NULL, "OK"); if(AivoLoginOK != NULL) { if(::IsWindowVisible(AivoLoginOK)) { ::PostMessage(AivoLoginOK, BM_CLICK, 0, 0); break; } } i++; Sleep(50); // 50ms sleep between tries }