Vizuális, eseményvezérelt programozás XI ÓE-NIK, 2011 1
Hallgatói tájékoztató A jelen bemutatóban található adatok, tudnivalók és információk a számonkérendő anyag vázlatát képezik Ismeretük szükséges, de nem elégséges feltétele a sikeres zárthelyinek, illetve vizsgának Sikeres zárthelyihez, illetve vizsgához a jelen bemutató tartalmán felül a kötelező irodalomként megjelölt anyag, a gyakorlatokon szóban, illetve a táblán átadott tudnivalók ismerete, valamint a gyakorlatokon megoldott példák és az otthoni feldolgozás céljából kiadott feladatok önálló megoldásának képessége is szükséges V10 2
Dynamic Link Library / Shared Object Alkalmazások által megosztott programmodul, ami tartalmazhat programkódot, adatokat, erőforrásokat Külön fordítják, a programhoz futási időben kapcsolódik Példák a Windows rendszerből: gdi32dll 2d grafikai funkciókat tartalmaz (GDI!) gdiplusdll GDI+ funkciók commdlg32dll párbeszédablakok user32dll alapvető ablakkezelő és inputfunkciók crypto32dll kriptográfiai funkciók winmmdll alacsonyszintű multimédiás funkciók (pl zene) V10 3
A fordítási folyamat V10 FORRÁS (cpp, pas, c, cs, *) ELŐFELDOLGOZÁS, FORDÍTÁS OBJECT FILE (o, obj) LINKELÉS FUTTATHATÓ FILE (exe) KÜLSŐ LIBRARY-K (o, obj, so, dll) Object File: Egy köztes kód-reprezentáció, a fordító generálja a forráskód lefordítása után Tartalmazza: az értelmezett, fordított kódot és relokációs adatokat, utóbbit a linker használja a futtatható állomány generálásához NET keretrendszer esetén a relokációs adatok nem közvetlen címek A futtatható exe NET esetén köztes kódú 4
Static linking V10 Program SomeFunct1 SomeFunct2 SomeFunct3 Constant1 Constant2 Constant3 Main Code @SomeFunct3 @SomeFunct1 Az összes használt függvény/ erőforrás a programban van Ezek helye a fordítóprogram számára ismert Így fordításkor az ezekre történő hivatkozás STATIKUS, vagyis az adott kód a program saját címterületén található 5
Dynamic linking V10 Program 1 @SomeFunct2 DLL SomeFunct2 SomeFunct3 Program 2 @SomeFunct3 Egyes függvények/erőforrások a programon kívül vannak Ezek helye a fordítóprogram számára nem ismert Így fordításkor az ezekre történő hivatkozás DINAMIKUS, vagyis az adott kód a memóriában mindig máshol található, futási időben derül ki a pontos hely (a betöltést az OS végzi) Ugyanazt a függvényt több program is használhatja megosztott erőforrás (~ Shared Object) A legtöbb modern programban jelen van 6
DLL elérése a NET keretrendszerben Natív DLL használata Platform Invoke (P/Invoke: natív kód hívása felügyelt V10 környezetből) using SystemRuntimeInteropServices; [DllImport("winmmdll", SetLastError = true)] static extern bool PlaySound(string pszsound, UIntPtr hmod, uint fdwsound); string fname = @"c:\windows\media\tadawav"; PlaySound(fname, UIntPtrZero, 1); A DllImport attribútum adja meg a tartalmazó dll nevét A használni kívánt függvényt deklarálni kell, az extern kulcsszó jelzi, hogy nem mi írjuk, hanem egy dll-ből származik A függvény szignatúrájának illeszkednie kell a hívni kívánt dll-beli függvény szignatúrájához Sokszor nem felügyelt típusokra való manuális konverziókra, struktúrák memóriabeli elhelyezésének meghatározására vagy kódolás módosítására (stb) is szükség van a nyelvek együttműködésének biztosításához Szignatúrák, segítség, példák: wwwpinvokenet 7
DLL elérése a NET keretrendszerben Felügyelt DLL használata Referencia hozzáadása: Project/Add reference Ezután a DLL-ben tárolt névterek és a névtérben lévő osztályok/metódusok a szokványos módon elérhetőek Eddig is ezt használtuk! V10 8
DLL készítése File, New Project: Class Library alkalmazássablon segítségével Önmagában nem futtatható, így többnyire tesztalkalmazást is készítünk hozzá azonos solution-ön belül Fordítás után a dll fájl előáll A DLL-t használó alkalmazás referenciái közé fel kell venni a DLL fájlt Ha azonos solution-ben fejlesztjük a DLL-t és a DLL-t használó alkalmazást, akkor nem az előállt dll-t, hanem magát a projektet érdemes referenciaként megadni (ezt a Visual Studio megengedi) a lehetséges változások miatt A referencia hozzáadása után DLL-t használó alkalmazásban a DLL névtere és osztálya(i) szokványosan elérhetőek Bármilyen DLL-t használó alkalmazás esetében a fordítás során a felhasznált DLL-ek is odakerülnek a készülő EXE mellé (alapértelmezésben) A kimásolódott DLL-eknek a program futtatásakor rendelkezésre kell állniuk V10 9