Upload
nile
View
53
Download
0
Embed Size (px)
DESCRIPTION
Symbian ohjelmointi. Ti5315200 Symbian ohjelmointi 3. harjoitus Juha Turunen ([email protected]). Sisältö. Deskriptorit DLL:t 2 harjoitustehtävää. TDesC metodit. Locate() Compare() Find() Fold & collate variantit Left(), Mid(), Right() Alloc(), AllocL(), AllocLC() - PowerPoint PPT Presentation
Citation preview
Sisältö
• Deskriptorit• DLL:t• 2 harjoitustehtävää
TDesC metodit
• Locate()• Compare()• Find()• Fold & collate variantit• Left(), Mid(), Right()• Alloc(), AllocL(), AllocLC()
– Palauttaa HBufC olion, johon on kopioitu deskriptorin sisältö• Des()
– Palauttaa muokattavan pointterideskriptorin dataan• jne...
TDes metodit
• Append()• Copy()• Uppercase(), Lowercase()• Insert()• Delete()• jne...
Ohjeita deskriptorin valintaan
• TBuf/TBufC– Pieni määrä dataa– Maksimi koko tiedossa jo käännösaikaisesti
• TPtr/TPtrC– Jo olemassa olevan dataan viittaaminen tai käsittely– Säästää muistia koska turhia kopioita ei synny– Kätevä esim. parsimisessa– TPtr HBufC:n sisällön muokkaamiseen
• HBufC– Suuri koko– Maksimikoko ei tiedossa käännösaikaisesti
Exe3prob1
• Harjoitellaan deskriptorien käyttöä• Kirjoita koodia ”ToDo” –kohtiin ohjeiden mukaisesti• Varmista, että ohjelma ei vuoda muistia!
DLL käytännössä
• Funktioden kutsuminen DLL: sta– #include <header.h>– MMP- filessä: LIBRARY MyDll.lib
• DLL: n luominen– MMP- filessä
• TARGET MyDll.dll• TARGETTYPE DLL• UID 0x1000008d KMyDllUid• EXPORTUNFROZEN
– Kts. Seuraavat kalvot
– Kääntäjä luo .lib-tiedoston
Dll käytännössä
• Funktio, jota halutaan kutsua DLL:n ulkopuolelta pitää exportoida
– Makrot: EXPORT_C ja IMPORT_C
– Headerissa (.h)
class MyClass
{
public:
IMPORT_C void DoSomething();
private:
void SomethingElse();
};– Koodissa (.cpp)
EXPORT_C void MyClass::DoSomething()
{
// blah blah
}
DLL interface freezing
• Ennen kuin DLL voidaan luoda loppuun asti, täytyy sen rajapinta ’freezata’
• Freezing tarkoittaa sitä, että käännöstyökalut kirjoittavat tiedoston (.def), jossa lukee missä ordinaalissa kunkin metodin tulee sijaita– Tällä tiedostolla voidaan varmistaa se, ettei metodien
järjestysnumerot muutu käännöksien välillä, eikä DLL:ya vasten linkkaavia moduuleja tarvitse kääntää uudelleen
– def-tiedosto luodaan (emulaattoriympäristöön käännettäessä) BWINS hakemistoon
– BWINS hakemisto luodaan edelliseen hakemistoon• Mikäli DLL:n MMP-tiedostossa on rivi ’EXPORTUNFROZEN’ ei
freezaamista tarvitse suorittaa– DLL:n linkittävät moduulit tarvitsee kuitenkin tällöin kääntää
uudelleen mikäli DLL:n funktioiden järjestys muuttuu– Tätä kannattaa käyttää varhaisessa kehitysvaiheessa ja poistaa
kun rajapinnat vakiintuvat
DLL:n kääntäminen ja freezaaminen
• Käännä DLL– Joko Visual Studiosta tai komentoriviltä ’abld build wins udeb
DllProjektinNimi’– Mikäli DLL:n MMP-tiedostossa oli määriteltynä
EXPORTUNFROZEN, tämä riittää• Tässä vaiheessa kääntäjä on luonut DLL:n, mutta .lib-tiedoston
luominen ei onnistu ilman freezaamisen synnyttämää .def-tiedostoa• Freezaa rajapinta
– Luo makefile ’abld makefile wins’– Freezaa rajapinta ’abld freeze’– Luo makefile uudelleen (tärkeää) ’abld makefile’ (jos käytät
Visual Studiota myös projektitiedosto pitää luoda uudelleen ’abld makefile vc6’
• Käännä DLL– Koska freezaus tuotti .def-tiedoston, voi linkkeri tuottaa nyt .lib
tiedoston
Mitä exportoida?
• Kaikkia metodeja ei kannata exportoida– Turhat exportit vievät tilaa– Turhat exportit rikkovat kapseloinnin– Turhat exportit hankaloittavat ylläpitoa
• Exportoi kaikki metodit joita täytyy kutsua DLL:n ulkopuolelta• Exportoi käytettävien luokkien konstruktorit ja destruktorit
– Mikäli luokalla on staattinen kaksivaiheinen konstruktori (New, NewL, NewLC), ei C++ konstruktoria kannata (eikä saa) exportoida
• DLL:n tulee aina exportoida DLL entry point
EXPORT_C TInt E32Dll(TDllReason){ return KErrNone;}
exe3prob2
• Harjoitellaan ja havainnollistetaan DLL:n tekoa ja käyttöä• DLL ja sitä käyttävä exe omia projektejaan
– Avaa toinen abld.bat:n luoma .dsw tiedosto ja lisää workspaceen toinen projekti (Project / Insert Project into Workspace)
– Käännettävää projektia voit vaihtaa klikkaamalla oikeaa hiiren nappia class viewissä projektin nimen päällä ja valitsemalla ’Set as active project’
– Muista tarkistaa että käännät kummastakin projektista debug buildin (Build / Set as active configuration)
• Lisää tarvittavat EXPORT_C ja IMPORT_C makrot exe3prob2dll.h ja .cpp tiedostoihin
• Lisää exe3prob.mmp tiedostoon rivi joka linkittää ohjelman exe3prob2dll.dll:ya vasten
• Kun saat ohjelman toimimaan, poista DLL:n mmp-tiedostosta EXPORTUNFROZEN määritys ja kokeile rajapinnan freezaamista