„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…” |
a halott link |
||
| (3 közbenső módosítás, amit egy másik szerkesztő végzett, nincs mutatva) | |||
| 1. sor: | 1. sor: | ||
==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> | <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> | <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> | <pre>if (hDLL == NULL) | ||
{ | { | ||
fprintf(stderr, | fprintf(stderr, "Cannot find DLL\n"); //kiírjuk az stderr-re, hogy baj van | ||
return -1; | return -1; //végül kilépünk | ||
} | }</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> | <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> | <pre>typedef int(*MY_MAX_FUNC)(int, int); | ||
... | ... | ||
MY_MAX_FUNC fvMax; | 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> | <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> | <pre>if (fvMax == NULL) | ||
{ | { | ||
fprintf(stderr, %MAROON%"Cannot find function\n" | fprintf(stderr, %MAROON%"Cannot find function\n"); | ||
return -1; | |||
} | }</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> | <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> | <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> | <pre> | ||
#include <dlfcn.h> | |||
#include <stdio.h> | |||
typedef int(*MY_MAX_FUNC)(int, int); | |||
int main(){ | int main(){ | ||
| 97. sor: | 95. sor: | ||
void *handle; | void *handle; | ||
/* Megnyitjuk a konyvtarat. */ | |||
handle = dlopen( | handle = dlopen("./libcomplex.so", RTLD_LAZY); | ||
if(!handle){ | if(!handle){ | ||
fputs(dlerror(), stderr); | fputs(dlerror(), stderr); | ||
| 104. sor: | 102. sor: | ||
} | } | ||
/* Hozzaferunk a szimbolumhoz. */ | |||
fvMax = dlsym(handle, | fvMax = dlsym(handle, "max"); | ||
if(dlerror() != NULL){ | if(dlerror() != NULL){ | ||
fputs(dlerror(), stderr); | fputs(dlerror(), stderr); | ||
| 111. sor: | 109. sor: | ||
} | } | ||
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; | ||
} | } | ||
</pre> | |||
==Bináris komponensek evolúciója 2.== | ==Bináris komponensek evolúciója 2.== | ||
| 452. sor: | 449. sor: | ||
} | } | ||
</pre> | </pre> | ||
[[Category:Infoalap]] | [[Category:Infoalap]] | ||