120 likes | 275 Views
Symbian ohjelmointi. Ti5315200 Symbian ohjelmointi 3. harjoitus Juha Turunen (juha.turunen@lut.fi). Sisältö. Deskriptorit DLL:t 2 harjoitustehtävää. TDesC metodit. Locate() Compare() Find() Fold & collate variantit Left(), Mid(), Right() Alloc(), AllocL(), AllocLC()
E N D
Symbian ohjelmointi • Ti5315200 Symbian ohjelmointi • 3. harjoitus • Juha Turunen (juha.turunen@lut.fi)
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