1.0 WSTĘP

Moduł uConvention służy do dynamicznego wywoływania funkcji/procedur, z wnętrza programu lub bibliotek DLL.
Moduł ten jest z założenia pomocą w języku skryptowym do wywoływania procedur funkcji, których deklarację poznajemy dopiero w trakcie działania programu.

2.0 UŻYWANIE

Całość działa w oparciu o jeden moduł uConvenction.pas.

UWAGA!!! Za pomocą uConvention można wywoływać tylko i wyłącznie funkcje o
konwencji stdcall.

2.1 Przykład pobrania adresu procedury z DLL

Dodaj do sekcji uses uConvention:

Przed wywołaniem procedury z DLL musisz ją wczytać wraz z całą biblioteką. Moduł jest odporny na wielokrotne wczytywanie tej samej funkcji, aczkolwiek zaleca się ze względów na wydajność jednorazowe wczytywanie procedury. Robi się to za pomocą funkcji:

Pierwszy parametr ALibrary to nazwa DLL, z którego chcemy adres funkcji. W drugim parametrze AProcName, należy wpisać nazwę żądanej procedury/funkcji. Funkcja zwraca doń wskaźnik, który należy zapamiętać w zmiennej. Przykładowo:

Skoro mamy już adres funkcji to możemy przystąpić do jej wywoływania. Zakładam oczywiście, że znasz deklarację funkcji, którą wywołujesz (np. została zadeklarowana w skrypcie i znasz jej parametry). Deklaracja funkcji, której wskaźnik pobraliśmy, przez GetProc() wygląda w Delphi tak:

2.2.0 Procedury „dzwoniące” na podstawie adresu

A my dzięki uConvention możemy ją wywoływać bez wcześniejszego deklarowania w Delphi dzięki procedurze stdcall, która występuje w 2 wersjach. Jedna wersja dla procedur, natomiast 2 dla funkcji:

Pierwszy parametr to adres procedury, którą chcemy wywołać, drugi parametr to
parametry dla procedury, natomiast trzeci parametr (tylko dla funkcji) to wynik funkcji.

2.2.1 Przekazywanie parametrów dla procedur

Pierwszy parametr nie stanowi problemu, wpisujemy w niego przykładowo MyFuncProc, zmienną której wartość zainicjowaliśmy wcześniej. Nieco gorzej jest zaś z drugim parametrem. Jest to otwarta tablica którą trzeb specjalnie uzupełnić. Przykładowo:

Aby wygenerować parametry musimy użyć funkcji Par. Występuje ona w 2 wersjach
(powyżej używamy drugiej wersji):

Pierwsza wersja służy do przekazywania wskaźnika zmiennej. Przydatne, gdy chcemy wyciągnąć wynik funkcji lub ominąć drugą funkcję Par. Powiedzmy, że mamy jakąś gotową zmienną i chcemy ją przekazać jako parametr:

Zaprezentowana wyżej technika jest szybsza, bo nie ma potrzeby konwersji typu Variant na zadany typ. Poeksperymentuj z typami :). Sprawdź, co się stanie, gdy użyjesz przykładowo zamiast:

Wpiszesz:

Drugim parametrem (ADataType) jest typ zmiennej. Zawsze musimy podawać zgodny typ z typem danego parametru.

2.2.2 Typy danych – TDataType

Dostępne Typy to:

Nazwy te mogą się wydawać zbyt skomplikowane, dlatego też wprowadziłem nazwy
alternatywne podobne do nazw typów zmiennych w Delphi:

2.2.3 Przekazywanie parametrów dla funkcji

Wygląda analogicznie jak przekazywanie parametrów dla procedur, z drobną różnicą oczywiście ;). Aby w jakiś sposób zainkasować wynik funkcji musimy użyć:

Oraz:

Aby urozmaicić kod wywołamy funkcję zadeklarowaną w naszym programie, wywołamy ją i pobierzemy wynik:

2.2.4 Przekazywanie parametru var

Gdy w deklaracji procedury wystąpi zapis z var:

Procedurę taką należy wywoływać w następujący sposób:

2.3 Podsumowanie

To wszystko, co należy wiedzieć o uConvention. Może kiedyś napiszę do tego modułu procedury „dzwoniące” do procedur/funkcji w konwencji pascal, register i cdecl.

Wiedz drogi czytelniku, że stdcall jest najważniejszą konwencją używaną w systemie
windows :P.

3.0 PODZIĘKOWANIA

www.remobjects.com?ps. – Pascal Script. Dzięki temu językowi skryptowemu powstał moduł uConvention.

Autor: HNB

Załączniki