Patrz: obiekt
PmaDll.
Opis składni pliku deklaracji funkcji w bibliotece DLL:
Żeby system PROMOTIC wiedział, które funkcje z biblioteki DLL knihovny można zastosować i jaka jest forma tych funkcji, to do biblioteki DLL musi być dołączony plik tekstowy z rozszerzeniem
.INC, o nazwie takiej samej jak nazwa biblioteki DLL (na przykład w przypadku biblioteki
XY.DLL musi być plik
XY.INC). W tym pliku INC jeden wiersz odpowiada deklaracji właśnie jednej funkcji.
Składnia wiersza:
Declare Function MyFce Lib "MyDll" ([ByVal] Par As TypePar[, ...]) As TypeRet
gdzie:
MyFce |
nazwa deklarowanej funkcji |
MyDll |
nazwa biblioteki DLL |
Par |
nazwa parametru funkcji |
TypePar |
typ danych parametru (patrz kolejna tabela) |
TypeRet |
typ danych wartości zwrotnej funkcji |
Jeżeli przed nazwą parametru znajduje się słowo kluczowe
ByVal, wtedy parametr ten jest przekazywany wartością. W innym przypadku jest przekazywany przez odniesienie.
Są możliwe następujące
typy danych parametrów:
Nazwa typu |
Wielkość pamięci |
znaczenie: |
Zakres |
Byte |
1 bajt |
Liczba całkowita |
od 0 do 255 |
Integer |
2 bajty |
Liczba całkowita |
od -32 768 do +32 767 |
Long |
4 bajty |
Liczba całkowita |
od -2 147 483 648 do +2 147 483 647 |
Single |
4 bajty |
Liczba rzeczywista |
+/- 3,4E +/- 38 (7 cyfr znaczących) |
Double |
8 bajtów |
Liczba rzeczywista |
+/- 1,7E +/- 308 (15 cyfr znaczących) |
String |
według ilości znaków |
Łańcuch tekstowy |
Any |
suma bajtów pozycji podległych |
Tablica wartości |
Przekazywanie struktur i tablic:
Jeżeli w deklaracji funkcji w pliku
.INC w parametrze typu znajduje się słovo
Any, wtedy system PROMOTIC umożliwia w parametrze funkcji przekazać dovolne dane. Przy wywołaniu funkcji wytworzy bufor, do którego jest skopiowana binarna zawartość przekazywanej zmiennej (np. tablicy wytworzonej przy pomocy
VBScript.Array). Ten bufor zostanie przekazany wywoływanej funkcji jako parametr. Po zakończeniu funkcji dane z bufora przekaże z powrotem do zmiennej. A więc jeżeli masz na przykład tablicę, której skład typów danych dokładnie odpowiada przekazywanej strukturze, to możesz stosować także funkcje, które w parametrach posiadają strkutury.
!Uwaga! Przy przekazywaniu struktur i tablic
muszą zostać dokładnie dotrzymane wymagane typy danych pozycji tablicy, ponieważ nieodpowiednie ich zastosowanie może mieć destrukcyjne działanie!
Notatki:
1. Binarna zawartość struktury może zawierać wypełnienia przeznaczone do uzupełnienia pozycji struktury na daną ilość bajtów.
2. Jest konieczne jawne ustawienie typów przekazywanych danych przy pomocy funkcji grupy
CInt,
CLng, itd.
3. Nigdy nie szkodzi, jeżeli do parametrów funkcji jest przekazana większa ilość danych, aniżeli tego wymaga dana funkcja.
Przykład1:
Załóżmy, że biblioteka C:\Library\MyDll.dll zawiera funkcję "factor" do obliczenia silni danej liczby. Ta funkcja ma parametr typu 2-bajtowa liczba całkowita rzeczywistej i zwraca liczbę rzeczywistą o podwójnej precyzji (8-bajtowa liczba rzeczywista). Jeżeli chcesz tę funkcję zastosować w systemie PROMOTIC, wtedy plik C:\Library\MyDll.inc musi zawierać następujący wiersz:
Declare Function factor Lib "usrdll" (ByVal n As Integer) As Double
Przykład2:
Załóżmy, że biblioteka C:\Library\MyDll.dll zawiera funkcję "nibble", która służy do uzyskania wartości 4 dolnych bitów liczby całkowitej. Funkcja ta zwraca w 1-bajtowej liczbie człkowitej 0 jeżeli wszystkie cztery bity są równe zaru, w innym przypadku zwraca jedynkę. Do swoich parametrów nr. 2 do nr. 5 (typu Byte) ustawia wartości 4 dolnych bitów parametru nr. 1, który również jest typu Byte. Jeżeli chcesz taką funkcję zastosować w systemie PROMOTIC, wtedy plik C:\Library\MyDll.inc musi zawierać następujący wiersz:
Declare Function nibble Lib "usrdll" (ByVal B As Byte, bit1 As Byte, bit2 As Byte, bit3 As Byte, bit4 As Byte) As Byte
Zauważ, że parametr B jest przekazywany wartością, podczas kiedy pozostałe parametry są przekazywane przez odniesienie (referencję).
Przykład3:
Zastosowanie obiektu PmaDll:
Funkcja z wyżej przedstawionym sposobem załadowanej biblioteki udostępnia właściwość
Fce. Miejmy obiekt
MyDll typu
PmaDll, znajdujący się w folderze "
Lib". Jeżeli chcemy wywołać jego funkcję "factor", wtedy możemy pisać:
VBScriptWybierz oraz skopiuj do schowka
Dim f
f = pMe.Pm("/Lib/MyDll").Fce.factor(6)
Jeżeli chcemy funkcje biblioteki stosować częściej, wtedy jest bardziej dogodne:
VBScriptWybierz oraz skopiuj do schowka
Dim oFce, f, g
Set oFce = pMe.Pm("/Lib/MyDll").Fce
f = oFce.factor(6)
g = oFce.factor(10)
Jeżeli chcemy wykorzystywać daną bibliotekę globalnie, wtedy jest dogodnym wytworzenie odniesienia do właściwości
Fce w oknie konfiguracyjnym "
Zmienne".
Przykład4:
Deklaracja funkcji DLL w języku C++
Ten przykład demonstruje, jak wygląda interfejs funkcji "factor" oraz "nibble" z przykładów 1 i 2 w języku C. Zmienna typu double ma wielkość 8B, zmienna typu char 1B oraz zmienna typu short 2B
extern "C" double __declspec(dllexport) __cdecl factor(short n);
extern "C" char __declspec(dllexport) __cdecl nibble(char B, char *bit1, char *bit2, char *bit3, char *bit4);
W kompilatorach trzecich producentów eksport funkcji z biblioteki DLL (tu __declspec(dllexport)) może być zrealizowany w zupełnie inny sposób. Tak samo w innych językach programowania jest konieczne dokładnie przestudiować dokumentację związaną z eksportem i importem funkcji bibliotek DLL.