Käyttäjän työkalut

Sivuston työkalut


paketit:diet32

Erot

Tämä näyttää erot valitun ja nykyisen version kesken tästä sivusta.

Linkki vertailunäkymään

Seuraava revisio
Edellinen revisio
paketit:diet32 [2006/03/29 12:00] – external edit 127.0.0.1paketit:diet32 [2014/11/20 15:01] (nykyinen) – ulkoinen muokkaus 127.0.0.1
Rivi 1: Rivi 1:
-====== Aivo 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ä [[http://tympea.utu.fi/doku.php?id=ohjeet:wix|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 ====
  
-Aivo Diet32 on yksinkertainen ohjelma, jolla luodaan ja seurataan ruokavaliodieettejä. 
  
-===== Ohjelma ===== 
  
 Ohjelma koostuu kolmesta osasta: Ohjelma koostuu kolmesta osasta:
 +
   * diet32.exe - //%ProgramFiles%\Diet32//-hakemistossa   * diet32.exe - //%ProgramFiles%\Diet32//-hakemistossa
 +
   * aivo.ini - //%SystemRoot%//-hakemistossa   * aivo.ini - //%SystemRoot%//-hakemistossa
 +
   * diet32.mdb - Access tietokanta, sijainti määritelty ODBC:ssä   * 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.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ä. 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 =====+ 
 + 
 +==== 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. 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 ==== 
 + 
  
 {{paketit:diet32-frontend.png}} {{paketit:diet32-frontend.png}}
 +
 +
  
 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. 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. 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): 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):
 +
 <code c++> <code c++>
 +
  HINSTANCE rc = AfxGetResourceHandle();  HINSTANCE rc = AfxGetResourceHandle();
 +
  char buffer[1024];  char buffer[1024];
 +
 +
 +
  
  
  // update ODBC data source  // update ODBC data source
 +
 +
  
  sprintf(buffer, "%s\n%s\n%s\nDBQ=%s\n",  sprintf(buffer, "%s\n%s\n%s\nDBQ=%s\n",
 +
  "DSN=Diet32",  "DSN=Diet32",
 +
  "Description=Diet32 personal database for user",  "Description=Diet32 personal database for user",
 +
  "FIL=MS Access;",  "FIL=MS Access;",
 +
  dbpath.c_str());  dbpath.c_str());
 +
  // format requires terminators instead of newlines  // format requires terminators instead of newlines
 +
  int i,s;  int i,s;
 +
  s = strlen(buffer);  s = strlen(buffer);
 +
  for(i=0;i<s;i++) {  for(i=0;i<s;i++) {
 +
  if(buffer[i] == '\n')  if(buffer[i] == '\n')
 +
  buffer[i] = '\0';  buffer[i] = '\0';
 +
  }  }
 +
 +
  
  if(SQLConfigDataSource(NULL, ODBC_ADD_DSN,  if(SQLConfigDataSource(NULL, ODBC_ADD_DSN,
 +
  "Microsoft Access Driver (*.mdb)",  "Microsoft Access Driver (*.mdb)",
 +
  buffer) == FALSE) {  buffer) == FALSE) {
 +
  LoadString(rc, IDS_ODBC_CONFIG_FAILED, buffer, 1024);  LoadString(rc, IDS_ODBC_CONFIG_FAILED, buffer, 1024);
 +
  MessageBox(buffer, NULL, MB_ICONSTOP | MB_OK);  MessageBox(buffer, NULL, MB_ICONSTOP | MB_OK);
 +
  }  }
 +
 </code> </code>
 +
 +
  
 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. 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 =====+ 
 + 
 +==== 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. 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.
 +
 +
  
 {{paketit:diet32-spy.png}} {{paketit:diet32-spy.png}}
 +
 +
  
 <code c++> <code c++>
 +
 HWND AivoLogin = NULL; HWND AivoLogin = NULL;
 +
 HWND AivoLoginPanel = NULL; HWND AivoLoginPanel = NULL;
 +
 HWND AivoLoginOK = NULL; HWND AivoLoginOK = NULL;
 +
 int i = 0; int i = 0;
 +
 while(i<200) { // 10 sec trying to find the correct button while(i<200) { // 10 sec trying to find the correct button
 +
  if(AivoLogin == NULL)  if(AivoLogin == NULL)
 +
  AivoLogin = FindWindowEx(NULL, NULL, NULL, "Aivo2000 - Diet32 sisäänkirjautuminen");  AivoLogin = FindWindowEx(NULL, NULL, NULL, "Aivo2000 - Diet32 sisäänkirjautuminen");
 +
  if(AivoLoginPanel == NULL && AivoLogin != NULL)  if(AivoLoginPanel == NULL && AivoLogin != NULL)
 +
  AivoLoginPanel = FindWindowEx(AivoLogin, NULL, "TPanel", NULL);  AivoLoginPanel = FindWindowEx(AivoLogin, NULL, "TPanel", NULL);
 +
  if(AivoLoginOK == NULL && AivoLoginPanel != NULL)  if(AivoLoginOK == NULL && AivoLoginPanel != NULL)
 +
  AivoLoginOK = FindWindowEx(AivoLoginPanel, NULL, NULL, "OK");  AivoLoginOK = FindWindowEx(AivoLoginPanel, NULL, NULL, "OK");
 +
  if(AivoLoginOK != NULL) {  if(AivoLoginOK != NULL) {
 +
  if(::IsWindowVisible(AivoLoginOK)) {  if(::IsWindowVisible(AivoLoginOK)) {
 +
  ::PostMessage(AivoLoginOK, BM_CLICK, 0, 0);  ::PostMessage(AivoLoginOK, BM_CLICK, 0, 0);
 +
  break;  break;
 +
  }  }
 +
  }  }
 +
   
 +
  i++;  i++;
 +
  Sleep(50); // 50ms sleep between tries  Sleep(50); // 50ms sleep between tries
 +
 } }
 +
 </code> </code>
 +
  
paketit/diet32.1143622839.txt.gz · Viimeksi muutettu: 2014/11/20 15:01 (ulkoinen muokkaus)