Utilizarea DLL-urilor

In lectiile anterioare am invatat cum se creaza un DLL si cum se apeleaza functiile acestuia. In continuare vom vedea care sunt avantajele care vin odata cu posibilitatea apelarii DLL-urilor.

 

In primul rand, avand posibilitatea sa folosim apeluri DLL obtinem acces la o multime de functii, incepand cu functiile care sunt implementate in DLL-urile sistemului de operare, functii implementate in DLL-urile care ajung in sistem prin instalarea de software sau functii implementate de simple persoane sau chiar de dumneavoastra.

 

Principalul avantaj al bibliotecilor de functii dinamice este portabilitatea lor dar pentru AutoIt, DLL-urile sunt de asemenea importante din perspectiva vitezei de executie. Uneori veti intalni portiuni de cod (functii) care o sa fie mai lente in AutoIt. Daca acest lucru este o problema se poate implementa functia in C (sau orice alt limbaj care suporta crearea de DLL-uri) si compila sub forma unui DLL. Ulterior se poate apela functia prin intermediul functiilor puse la dispozitie de AutoIt.

 

Un avantaj major care vine odata cu functia DllCallAddress este rularea unor functii in cod masina, ceea ce iar poate fi un atuu in cazurile in care viteza de executie este o problema.

 

Nota: in acest tutorial veti intalni doar exemple simple, care pot fi intelese de oricine. Nu veti intalni optimizari, dar fiti siguri ca daca este vorba de scrierea unor functii complexe, atat functiile scrise in C si compilate sub forma de DLL-uri, cat siĀ  functiile scrise in cod masina, pot obtine timpi de executie superiori limbajului nativ AutoIt.

 

Ca un prim exemplu vom apela functia Beep din kernel32.dll, folosind ce am invatat in lectia anterioara:

Daca va uitati la documentatie, functia are 2 parametri: frecventa si durata, ambii parametri sunt DWORD. Functia returneaza o valoare non zero daca a fost executata cu succes si valoarea zero in caz de eroare.

 

Ca sa complicam un pic situatia, sa vedem cum se poate apela functia folosind adresa functiei si pasand parametri folosind cod masina:

Ca sa rulati exemplul de mai sus apasati ALT+F5 (versiunea beta – pentru functia DllCallAddress).

Ca sa intelegeti exemplul de mai sus sa mai luam un exemplu. In acest exemplu vom vedea cum sa apelam executam cateva instructiuni simple pentru a efectua operatia de adunare:

Si pentru acest exemplu apasati ALT+F5 pentru a rula scriptul.

 

Daca ati inteles scripturile de mai sus vom trece la implementarea functiei factorial, ca si in DLL-ul (creat in lectiile anterioare) numit Exemplu.dll, doar ca acum vom vedea cum putem face asta folosind cod masina:

Ca sa intelegeti de unde am obtinut sirul binar pe care il contine $bOPCode:

Trebuie sa stiti ca functia de mai sus returneaza corect valoarea pentru factorial, pana la maxim Factorial(12). Pentru Factorial(13) rezultatul nu mai poate fi stocat intr-o variabila de tip int care are domeniul intre -2147483648 si 2147483647. Poate este mai sugestiva poza de mai jos:

Ca un ultim exemplu vom scrie o functie factorial care poate stoca rezultatul functiei factorial si pentru numere mai mari. Pentru acest lucru, in exemplul urmator, codul masina este specific instructiunilor x87 FPU (Floating-Point Unit) care permit lucrul cu numere mari in virgula mobila:

Sirul binar pe care il contine $bOPCode a fost obtinut de aici:


* Pentru orice intrebari sau nelamuriri legate de curs sau limbajul AutoIt accesati sectiunea AutoIt a forumului SkullBox sau platforma de suport tehnic NetHelp.