Z cyklu #Delphi
Witajcie,
Zasadniczo w systemach, przy których pracuję projekty zbudowane są o exe + bpl'e. W związku z powyższym niezbyt często mam okazję tworzyć DLL (raczej jak już to korzystam z dll dostarczonych do firmy). Dziś akurat miałem tą okazję stworzyć DLL z dosłownie jedną funkcją eksportową i swojego rodzaju eventem tak aby dll sam wywoływał procedurę w exe.
Kod dll:
procedure GetGPSCoordinates(const pCOM, pBaudRate: integer; pOnGPS: Pointer); stdcall;
begin
TGPSLib.Instance.GPS.Com := pCOM;
TGPSLib.Instance.GPS.BaudRate := pBaudRate;
TGPSLib.Instance.OnGPS := pOnGPS;
TGPSLib.Instance.GPS.Active := True;
end;
Jak widać mamy podłączenie nr com, jego prędkość, zdarzenie OnGPS i aktywację. Żadnych cudów.
Teraz zdarzenie OnGPS:
type
TOnGetGPS = procedure(const pLat, pLon: Extended) stdcall;
TGPSLib = class
...
vOnGPS: TOnGetGPS;
procedure GPSPosition(Sender: TObject);
...
property OnGPS: TOnGetGPS read vOnGPS write vOnGPS;
end;
...
procedure TGPSLib.GPSPosition(Sender: TObject);
begin
if Assigned(vOnGPS) then
vOnGPS(vGPS.Latitude,vGPS.Longitude);
end;
No i ogólnie zadziałało bez problemu. No ale GPS zwraca tez inne parametry więc dodajmy np wysokość do powyższego kodu:
type
TOnGetGPS = procedure(const pLat, pLon, pAlt: Extended) stdcall;
...
procedure TGPSLib.GPSPosition(Sender: TObject);
begin
if Assigned(vOnGPS) then
vOnGPS(vGPS.Latitude,vGPS.Longitude, vGPS.Altitude);
end;
Nagle okazuje się, że ten kod przestał działać ... dosłownie dodanie jakiegokolwiek parametru do tych dówch wcześniejszych wywala błąd ...
Okazało się dzięki świetnemu artykułowi, który znalazłem i których chiałem wam pokazać:
http://rvelthuis.de/articles/articles-dlls.html
że w DLL NIE NALEŻY UŻYWAĆ EXTENDED
to, że zadziałało na 2 parametrach typu Extended to czysty przypadek. Przerobiłem te dwa parametry extended na 1 typu packed record z dwomwa wartościami i też nie chciało zadziałać. Także uważajcie na DLL (nie tylko w Delphi ale również C i C++) i typy danych