„SzoftverTechnikakTetelsor” változatai közötti eltérés

Új oldal, tartalma: „{{GlobalTemplate|Infoalap|SzoftverTechnikakTetelsor}} ==Bináris komponensek evolúciója 1.== ===Soroljon fel három C++ tulajdonságot, amelyek alkalmatlanná teszi…”
 
Kiskoza (vitalap | szerkesztései)
a halott link
 
(3 közbenső módosítás, amit egy másik szerkesztő végzett, nincs mutatva)
1. sor: 1. sor:
{{GlobalTemplate|Infoalap|SzoftverTechnikakTetelsor}}
==Bináris komponensek evolúciója 1.==
==Bináris komponensek evolúciója 1.==


36. sor: 34. sor:
====Windows====
====Windows====
windows.h-ban vannak a szükséges függvények, ezért:
windows.h-ban vannak a szükséges függvények, ezért:
<pre>%BLUE%#include%ENDCOLOR% %MAROON%"windows.h"%ENDCOLOR%</pre>
<pre>#include "windows.h"</pre>


Betöltetjük az OS-el a dll-elünket, amire egy HMODULE típusú változóval tudunk a későbbiekben hivatkozni
Betöltetjük az OS-el a dll-elünket, amire egy HMODULE típusú változóval tudunk a későbbiekben hivatkozni
<pre>%BLACK%HMODULE hDLL = !LoadLibrary(%MAROON%"myDll.dll"%ENDCOLOR%);%ENDCOLOR%</pre>
<pre>HMODULE hDLL = !LoadLibrary("myDll.dll");</pre>


Persze lehet, hogy nincs is dll, ekkor null-t kapunk vissza.
Persze lehet, hogy nincs is dll, ekkor null-t kapunk vissza.
<pre>%BLACK%%BLUE%if%ENDCOLOR% (hDLL == NULL)
<pre>if (hDLL == NULL)
{
{
fprintf(stderr, %MAROON%"Cannot find DLL\n"%ENDCOLOR%); %GREEN%//kiírjuk az stderr-re, hogy baj van%ENDCOLOR%
fprintf(stderr, "Cannot find DLL\n"); //kiírjuk az stderr-re, hogy baj van
return -1; %GREEN%//végül kilépünk%ENDCOLOR%
return -1; //végül kilépünk
}%ENDCOLOR%</pre>
}</pre>


Van már DLL-elünk, valahogy kellene használni a benne lévő függvényeket is. Megkérjük a Windows-t, hogy a DLL-ből keresse ki a megadott nevű függvényt, és ha szerencsénk van, vissza kapunk egy rá mutató függvény pointert.
Van már DLL-elünk, valahogy kellene használni a benne lévő függvényeket is. Megkérjük a Windows-t, hogy a DLL-ből keresse ki a megadott nevű függvényt, és ha szerencsénk van, vissza kapunk egy rá mutató függvény pointert.
Az élet nem ennyire egyszerű, mert elképzelhető, hogy van a függvényünknek visszatérési értéke, akár még paramétere is lehet. A fordítónknak sem ártana tudnia, hogy hány darab és milyen méretű paramétert kell le push-nia a stack-be. Legyen pl. egy olyan függvény, ami 2 szám közül visszaadja a nagyobbat. Rakjuk el egy változóba, de már meg kell adni a visszatérési érték és a paraméterek típusát is.
Az élet nem ennyire egyszerű, mert elképzelhető, hogy van a függvényünknek visszatérési értéke, akár még paramétere is lehet. A fordítónknak sem ártana tudnia, hogy hány darab és milyen méretű paramétert kell le push-nia a stack-be. Legyen pl. egy olyan függvény, ami 2 szám közül visszaadja a nagyobbat. Rakjuk el egy változóba, de már meg kell adni a visszatérési érték és a paraméterek típusát is.


<pre>%BLACK%%BLUE%int%ENDCOLOR% (*fvMax)(%BLUE%int%ENDCOLOR%, %BLUE%int%ENDCOLOR%);%ENDCOLOR%</pre>
<pre>int (*fvMax)(int, int);</pre>


Ezt a csúnya és hosszú sort még minimum 2x le kellene írni, ezért typedefelünk:
Ezt a csúnya és hosszú sort még minimum 2x le kellene írni, ezért typedefelünk:


<pre>%BLACK%%BLUE%typedef int%ENDCOLOR%(*MY_MAX_FUNC)(%BLUE%int%ENDCOLOR%, %BLUE%int%ENDCOLOR%);
<pre>typedef int(*MY_MAX_FUNC)(int, int);
...
...
MY_MAX_FUNC fvMax;%ENDCOLOR%</pre>
MY_MAX_FUNC fvMax;</pre>


Van egy függvény pointer típusunk, amely int-et ad vissza, és 2 db int a paramétere. Nem adtuk meg, hogy mik a paraméterek nevei. Erre a fordító magasról sz*rik, őt csak a típusok érdeklik.
Van egy függvény pointer típusunk, amely int-et ad vissza, és 2 db int a paramétere. Nem adtuk meg, hogy mik a paraméterek nevei. Erre a fordító magasról sz*rik, őt csak a típusok érdeklik.
Töltsük be.
Töltsük be.


<pre>%BLACK%fvMax = (MY_MAX_FUNC)GetProcAddress(hDLL, %MAROON%"add"%ENDCOLOR%);%ENDCOLOR%</pre>
<pre>fvMax = (MY_MAX_FUNC)GetProcAddress(hDLL, "add");</pre>


A GetProcAddress egy void*-ot ad vissza, azaz egy általános pointert, ami a függvényre mutat a memóriában. Csakhogy nekünk spéci függvényünk van, ezért cast-olunk. Itt már kezdünk örülni a typedef-nek, hogy nem kell mindenféle csúnya zárójeles csillagos dolgokat leírni.
A GetProcAddress egy void*-ot ad vissza, azaz egy általános pointert, ami a függvényre mutat a memóriában. Csakhogy nekünk spéci függvényünk van, ezért cast-olunk. Itt már kezdünk örülni a typedef-nek, hogy nem kell mindenféle csúnya zárójeles csillagos dolgokat leírni.


<pre>%BLACK%%BLUE%if%ENDCOLOR% (fvMax == NULL)
<pre>if (fvMax == NULL)
{
{
fprintf(stderr, %MAROON%"Cannot find function\n"%ENDCOLOR%);
fprintf(stderr, %MAROON%"Cannot find function\n");
%BLUE%return%ENDCOLOR% -1;
return -1;
}%ENDCOLOR%</pre>
}</pre>


Ha nincs szerencsénk, NULL-t kapunk vissza.
Ha nincs szerencsénk, NULL-t kapunk vissza.


Ennyi küzdelem után jó lenne használni is:
Ennyi küzdelem után jó lenne használni is:
<pre>%BLACK%%BLUE%int%ENDCOLOR% max = (*MY_MAX_FUNC)(a, b); %RED%// Valoszinuleg inkabb int max = (*fvMax)(a, b);%ENDCOLOR%</pre>
<pre>int max = (*MY_MAX_FUNC)(a, b); // Valoszinuleg inkabb int max = (*fvMax)(a, b);</pre>


A MY_MAX_FUNC egy függvény pointer, de mi nem a címet szeretnénk, hanem megakarjuk hívni. A * pont ezért kell, hogy a pointerre rámutassunk. C-ben zárójelekkel () jelezzük, hogy a változónk egy függvény, és hogy hívni szeretnénk, ezért olyan a typedef. Tehát elmutatunk a memóriában valahova, amiről tudjuk, hogy egy függvény, és meghívjuk a, b int-ekkel, és a visszatérési értéket elrakjuk max-ba.
A MY_MAX_FUNC egy függvény pointer, de mi nem a címet szeretnénk, hanem megakarjuk hívni. A * pont ezért kell, hogy a pointerre rámutassunk. C-ben zárójelekkel () jelezzük, hogy a változónk egy függvény, és hogy hívni szeretnénk, ezért olyan a typedef. Tehát elmutatunk a memóriában valahova, amiről tudjuk, hogy egy függvény, és meghívjuk a, b int-ekkel, és a visszatérési értéket elrakjuk max-ba.
81. sor: 79. sor:
Végül illene közölni a Windows-al, hogy már nem szeretnénk használni a dll-t, akár ki is szedheti a memóriából.
Végül illene közölni a Windows-al, hogy már nem szeretnénk használni a dll-t, akár ki is szedheti a memóriából.


<pre>%BLACK%FreeLibrary(hDLL);%ENDCOLOR%</pre>
<pre>FreeLibrary(hDLL);</pre>


====Linux====
====Linux====
87. sor: 85. sor:
Linux-on is kb ugyanezt csináljuk, csak másképp.
Linux-on is kb ugyanezt csináljuk, csak másképp.


<pre>%BLACK%
<pre>
%BLUE%#include%ENDCOLOR% %MAROON%&lt;dlfcn.h&gt;%ENDCOLOR%
#include &lt;dlfcn.h&gt;
%BLUE%#include%ENDCOLOR% %MAROON%&lt;stdio.h&gt;%ENDCOLOR%
#include &lt;stdio.h&gt;


%BLUE%typedef int%ENDCOLOR%(*MY_MAX_FUNC)(%BLUE%int%ENDCOLOR%, %BLUE%int%ENDCOLOR%);
typedef int(*MY_MAX_FUNC)(int, int);


int main(){
int main(){
97. sor: 95. sor:
void *handle;
void *handle;


%GREEN%/* Megnyitjuk a konyvtarat. */%ENDCOLOR%
/* Megnyitjuk a konyvtarat. */
handle = dlopen(%MAROON%"./libcomplex.so"%ENDCOLOR%, RTLD_LAZY);
handle = dlopen("./libcomplex.so", RTLD_LAZY);
if(!handle){
if(!handle){
fputs(dlerror(), stderr);
fputs(dlerror(), stderr);
104. sor: 102. sor:
}
}


%GREEN%/* Hozzaferunk a szimbolumhoz. */%ENDCOLOR%
/* Hozzaferunk a szimbolumhoz. */
fvMax = dlsym(handle, %MAROON%"max"%ENDCOLOR%);
fvMax = dlsym(handle, "max");
if(dlerror() != NULL){
if(dlerror() != NULL){
fputs(dlerror(), stderr);
fputs(dlerror(), stderr);
111. sor: 109. sor:
}
}


%BLUE%int%ENDCOLOR% max = (*fvMax)(a, b); %RED%// int max = fvMax(a, b); is ugyanugy mukodik%ENDCOLOR%
int max = (*fvMax)(a, b); // int max = fvMax(a, b); is ugyanugy mukodik


dlclose(handle);
dlclose(handle);
117. sor: 115. sor:
return 0;
return 0;
}
}
%ENDCOLOR%</pre>
</pre>
 


==Bináris komponensek evolúciója 2.==
==Bináris komponensek evolúciója 2.==
452. sor: 449. sor:
}
}
</pre>
</pre>
Egyéb dolgok ebben a pdf-ben: http://web.conf.hu/2007/media/foliak/Sun-webconf2007-PersistenceEJB3.pdf
-- [[DeVi|DeVi]] - 2007.04.12.


[[Category:Infoalap]]
[[Category:Infoalap]]