[Delphi] Import procedur z .dll

0

Witam.
Chciałbym zaimportować procedurę z parametrami do mojego programu. z DLL nie miałem wcześniej do czynienia i interesuje mnie statyczne załadowanie.

Mam następującą procedurę w .DLL

procedure UstawConfig(var sektor : PIniSektor, zmienna : PIniZmienna, wartosc : PIniWartosc); stdcall;
BEGIN
...
END;

Oto deklaracja typów (umieściłem w DLL pod uses) z uwagi że artykuł (poniżej) wstawia to w plik (?).

type
 PIniSektor  = ^IniSektor;
 PIniZmienna = ^IniZmienna;
 PIniWartosc = ^IniWartosc;
 PIniDowolny = ^IniDowolny;
 PIniWiersz  = ^IniWiersz;

var
 IniSektor,IniZmienna,IniWartosc,
 IniDowolny,IniWiersz    : PChar;

Gdy var wrzuciłem do type i tak nie działa.

Oto deklaracja w programie:

interface
 uses ...
  procedure UstawConfig(var sektor : PIniSektor, zmienna : PIniZmienna, wartosc : PIniWartosc); stdcall
              external 'vision32.dll' name 'UstawConfig';

chciałbym ją wyeskportować. Przeczytałem artykuł o importowaniu .dll z 4programmers.net
(http://4programmers.net/Delphi/Artyku%C5%82y/Biblioteki_DLL). Niestety przykład z eksportem procedur z parametrem jest dla mnie przesadnie skomplikowany. Nie z uwagi na zawartość, przede wszystkim na sposób opisania. Od akapitu "Parametry funkcji" autor nakazuje stworzyć plik rekord.inc i nigdzie poniżej nie jest on ani deklarowany ani zapisywany. Jak "type" umieszcze w DLL poniżej uses to błąd, są tam wskaźniki. Ja umieściłem moje zamiast w pliku to właśnie w sekcji type, których program (w którym dll zdeklarowałem) nawet nie wykrywa.

Stąd błąd jaki mi się pojawia podczas kompilacji programu:
[Error] _formStart.pas(8): E2003 Undeclared identifier: 'PIniSektor'
[Error] _formStart.pas(8): E2003 Undeclared identifier: 'PIniZmienna'
[Error] _formStart.pas(8): E2029 ';', ')' or '=' expected but ',' found
[Error] _formStart.pas(8): E2003 Undeclared identifier: 'PIniWartosc'

0

Jeśli dobrze zrozumialem... Wstawia to w plik ponieważ ta deklaracja typów musi być znana programowi i bibliotece. Jeśli wstawi to sie do jednego pliku, to deklaracja bedzie jednakowa dla programu i dll'ki.

0

A co w momencie, gdy nie wiemy jakie procedury a tym bardziej typy zawiera biblioteka. Przecież normalnie do bibliotek .dll nie są dołączane żadne pliki z deklaracją typów. Tzn. chyba można przecież uzyć biblioteki .dll bez kopiowania jej deklaracji typów do programu. Należałoby wtedy przecież ponownie skompilować program, jeśli deklaracja typu zostałaby zmieniona (choćby w celu zmiany nazw). Poza tym nigdzie ani w bilbliotece ani w programie nie ma inkluzji do tego pliku...

Nie rozumiem nadal :(
Pozdrawiam</url>

0
intacto napisał(a)

A co w momencie, gdy nie wiemy jakie procedury a tym bardziej typy zawiera biblioteka.

to niestety ale się pod nią nie podepniesz

Przecież normalnie do bibliotek .dll nie są dołączane żadne pliki z deklaracją typów.

właśnie, że są, np. całe MSDE nie robi nic innego tylko opisuje jakie procedury i z jakimi parametrami są eksportowane z dllek systemowych, no jeszcze podaje opis co dane procedury robią

Tzn. chyba można przecież uzyć biblioteki .dll bez kopiowania jej deklaracji typów do programu.

nie można

Należałoby wtedy przecież ponownie skompilować program, jeśli deklaracja typu zostałaby zmieniona (choćby w celu zmiany nazw).

dlatego trzeba dobrze przemyśleć nazewnictwo oraz typy które mają eksportować procedury

Poza tym nigdzie ani w bilbliotece ani w programie nie ma inkluzji do tego pliku...

a tego to nie rozumiem

0

Chodzi o to, skąd tamten program wie że należy użyć plik request.inc, skąd biblioteka dll "wie"?

0

a co one się z powietrza biorą?? Przecież ktoś je pisze...

1 użytkowników online, w tym zalogowanych: 0, gości: 1