Käyttäjän työkalut

Sivuston työkalut


paketit:diet32

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, string
  • Server = stone.utu.fi, string
  • AnsiNPW = No, string
  • Database = AivoDB, string
  • LastUser = 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
 
}
paketit/diet32.txt · Viimeksi muutettu: 2014/11/20 13:01 (ulkoinen muokkaus)