[delphi] Dynamiczne menu + DLL

0

Witam

Mam do napisania program, któy wyszukuje w danym katalogo DLLe, tworzy menu aplikacji w zależności od DLLi.

Zrobiłem tak, że w rzeczywistości każdy DLL tworzy sobie menu w głównej aplikacji i przepisuje do metody onClick odpowiedniego elementu TMenuItem pewną procedurę zdefiniowaną w danym DLLu.

Okazuje się jednak, że po uruchomieniu aplikacji, kliknięcie dowolnego podmenu powoduje uruchomienie funkcji/procedury ZAWSZE Z PIERWSZEGO ZAŁADOWANEGO DLLa !

Nie wiem czemu tak jest, skoro w każdym DLLu zdefiniowana jest inna procedura obsługująca kliknięcie. Teraz dodatkowo zmieniłem ich nazwy (żeby się przekonać że to nie to), ale to nic nie dało.

Czy ma ktoś z Was pomysł, w czym tkwi problem?

0

A czy może wiesz, dlaczego w mojej funkcji w 4. wierszu występuje wyjątek?

[była to krótka aluzja pt. "nie jesteśmy wróżkami; daj źródło ew. szerzej opisz problem to wtedy postaramy się pomóc"]

0

Pozmieniałem trochę kod, ale wychodzi to samo.

To jest jedna z głównych funkcji formularza głównej aplikacji:

 ilosc:=0;
  setlength(h,0);
  setlength(t,0);
  setlength(a,0);
  FindFirst('DLL/*.dll', faAnyFile, sr);
  repeat
  begin
    ilosc:=ilosc+1;
    setlength(h,length(h)+1);
    setlength(t,length(t)+1);
    setlength(a,length(a)+1);
    h[ilosc-1]:=LoadLibrary(PAnsiChar('DLL/'+sr.Name));
    //showMessage(intTostr(length(h)));
    if h[ilosc-1]>=32 then
    begin

      @t[ilosc-1]:=GetProcAddress(h[ilosc-1],'Utworz');
      if @t[ilosc-1]<>nil then
      begin
         t[ilosc-1](Application, MainMenu1);
      end;
      @m:=GetProcAddress(h[ilosc-1],'Nazwa');
      if @m<>nil then
      begin
        opcja:=TMenuItem.Create(Application);
        opcja.Caption:=m;
        @a[ilosc-1]:=GetProcAddress(h[ilosc-1],'pokaz');
        opcja.onClick:=Klikniecie;
        Menu.Items.Add(opcja);
      end
    end;


  end;

  until FindNext(sr)<>0;
  FindClose(sr);

Wyszukuje ona DLLe w oddzielnych katalogach, tablicuje już wszystko co się da (handlery, wskaźniki do funkcji Utworz, pokaz itd).

Odpowiednie funkcjie:
Utworz - znajduje się w każdym DLLu - tworzy formularz
Pokaz - pokazuje formularz z danego DLLa
Nazwa - zwraca nazwę jaką chce mieć dany DLL na menu rozwijanym na głównymn formularzu.

Te funkcje/procedury nie mają żadnego znaczenia dla problemu - są napisane poprawnie itd. itp.

Z kolei procedura Klikniecie, ktora jest zdefiniowana w głównej aplikacji wygląda tak:

procedure TForm1.Klikniecie(Sender: TObject);
begin
    showMessage(IntToStr(ilosc-1));
    a[ilosc-1](Sender);

end;

W obecnej wersji, w menu następują odwołania zawsze do ostatniego DLLa.

Inaczej mówiąc:

opcja.onClick:=Klikniecie; powoduje dla każdego wczytywanego DLLa w każdej pętli, wykonanie działania dla końcowej wartości zmiennej ilość, przez co zawsze po kliknięciu dowolnej pozycji w menu uruchomii się ten sam podformularz...

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.