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

Ferrero (vitalap | szerkesztései)
Nincs szerkesztési összefoglaló
Ferrero (vitalap | szerkesztései)
34. 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.
79. 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====