[delphi/builder]Wykorzystanie funkcji z plików dll...

0

Piszę program do sterowania mikrokontrolerami i chciałbym funkcje sterujące pracą poszczególnych typów mikrokontrolerów umieścić w plikach dll. W programie dynamicznie tworzę obrazki TImage prezentujące mikrokontrolery. Teraz chciałbym aby na podstawie zapisu w pliku ini program wywoływał funkcje z plków dll. Np. mam mikrokontrolery typów :
FK 204A
EC 6-180
EC 3-195
oraz pliki dll zawierajace funkcje do komunikacji z tymi kontrolerami np:
fk204A.dll
ec6-180.dll
ec3-195.dll
A funkcje będą nosiły nazwy :
Open();
Send(int urzadzenie, int instrukcja, char buff);
Read(char
buffer);
Czy mogę w jakiś sposób kazać programowi wywoływać funkcje z różnych dll'ów na podstawie zapisu w pliku ini określającego typ mikrokontrolera? Jeśli tak to jak to zrobić? Jeśli nie to proszę o propozycję jakiegoś alternatywnego rozwiązania. Proszę o pomoc. Gdyby coś było niezbyt jasne to proszę śmiało piszcie a udziele bliższej informacji.

Pozdrawiam

0

A napisz kiedy chcesz dane funkcje wykonywać.., czy ma się to identyfikować automatycznie..., skąd wiadomo którego pliku dll należy użyć, ewentualnie można sprubować uruchamiać funkcjie po kolei, po przez dodanie parametru w postaci stringa, jeżeli wykonujesz funkcję Open(); to może by ją zadeklarować tak:

  function Open(kontroler:String):boolean;
  begin
  IF kontroler = 'kontrolerA' then
   ......
   Result := true 
   else Result := false;
  end;

A poza tym.... czy w tych funkcjacho do obsługi kontrolerów nie ma aby przypadkiem takiej która zwraca typ lub nazwę urządzenia.. ?

0

Co do Twojego pytania to rzeczywiście wśród instrukcji tych mikrokontrolerów są takie które zwracają typ danego urządzenia. Zdecydowałem się jednak na użycie dodatkowo informacji z pliku ini. To zresztą nie ma znaczenia. Obojętnie czy informacja pochodzi z mikrokontrolera czy z pilku nie wiem co dalej.

Chciałbym aby program automatycznie rozpoznawał z którego dll'a ma użyć funkcję Open, Send, Read i właśnie nie mam pomysłu jak to zrobić. Ten kod który podałeś w sumie rozwiązywałby mój problem ale czy można to zrobić jeszcze inaczej, jeszcze przed wywołaniem którejkolwiek z funkcji?

0

No pewnie że można... jeżeli możesz pobrać nazwę urządzenia to to robisz tak:

  IF nazwa = 'costam' then
    begin
       [email protected]();
       [email protected]
       ...... {itd}
    end else;
   IF nazwa = 'costam1' then
        begin
           .........
        end else; 

  {itd}

costam to oczywiscie pobrana wczesniej nazwa urządzenia...

0
AdamPL napisał(a)

Np. mam mikrokontrolery typów :
FK 204A
EC 6-180
EC 3-195
oraz pliki dll zawierajace funkcje do komunikacji z tymi kontrolerami np:
fk204A.dll
ec6-180.dll
ec3-195.dll
A funkcje będą nosiły nazwy :
Open();
Send(int urzadzenie, int instrukcja, char buff);
Read(char
buffer);
Czy mogę w jakiś sposób kazać programowi wywoływać funkcje z różnych dll'ów na podstawie zapisu w pliku ini określającego typ mikrokontrolera?

var deelelka:string; // nazwa pliku DLL
    hdll:HINST;        // uchwyt do biblioteki

// prototypy funkcji z DLL-ek. postać przykładowa, na podstawie tego co podałeś...

var dllOpen:procedure; cdecl;
    dllSend:procedure(urzadzenie,instrukcja:integer; var buff); cdecl;
    dllRead:procedure(var buffer); cdecl;

...

{ wybór pliku DLL dowolnym sposobem, np. tak: }

case controller_type of
  ct_FK204A : deelelka:='fk204A.dll';
  ct_EC6180 : deelelka:='ec6-180.dll';
  ct_EC3195 : deelelka:='ec3-195.dll';
end;

{ ładowanie biblioteki }

hdll:=LoadLibrary(deelelka);

{ ładowanie funkcji z dll-ki }

dllOpen:=GetProcAddress(hdll,'Open');
dllSend:=GetProcAddress(hdll,'Send');
dllRead:=GetProcAddress(hdll,'Read');

// teraz dllOpen(), dllSend(), dllRead() są funkcjami z załadowanej biblioteki.

{ przy wyjściu z programu }

FreeLibrary(hdll);
0
var deelelka:string; // nazwa pliku DLL
    hdll:HINST;        // uchwyt do biblioteki

// prototypy funkcji z DLL-ek. postać przykładowa, na podstawie tego co podałeś...

var dllOpen:procedure; cdecl;
    dllSend:procedure(urzadzenie,instrukcja:integer; var buff); cdecl;
    dllRead:procedure(var buffer); cdecl;

...

{ wybór pliku DLL dowolnym sposobem, np. tak: }

case controller_type of
  ct_FK204A : deelelka:='fk204A.dll';
  ct_EC6180 : deelelka:='ec6-180.dll';
  ct_EC3195 : deelelka:='ec3-195.dll';
end;

{ ładowanie biblioteki }

hdll:=LoadLibrary(deelelka);

{ ładowanie funkcji z dll-ki }

dllOpen:=GetProcAddress(hdll,'Open');
dllSend:=GetProcAddress(hdll,'Send');
dllRead:=GetProcAddress(hdll,'Read');

// teraz dllOpen(), dllSend(), dllRead() są funkcjami z załadowanej biblioteki.

{ przy wyjściu z programu }

FreeLibrary(hdll);

</quote>

Muszę przyznać że jestem zaskoczony.... myślałem że w XXI wieku nie ma już ludzi (przynajmniej w Polsce) którzy nie umieją czytać - pomyliłem się, przepraszam

0

Dziękuje za wskazanie właściwej drogi :) Już zabieram się za pisanie.

Pozdrawiam

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