Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Dynamiczne biblioteki w Delphi - pytanie

07 Maj 2008 18:11 1910 12
  • Użytkownik usunął konto  
  • Pomocny post
    Poziom 29  
    Musisz za pomocą argumentu przekazywać do funkcji obiekt na którym chcesz wykonać jakieś działanie.

    Code:
    Procedure StTimer(timer : TTimer); stdcall; 
    
    begin
    timer.Enabled:=false;
    end;


    A następnie w głównym programie wywoływać ją tak:

    Code:
    StTimer(Form1.Timer1);


    Dawno w delphi nie pisałem ale z tego co pamiętam coś takiego powinno działać...
  • Pomocny post
    Poziom 42  
    Nie wiem, czy nie bezpieczniej byłoby użyć wyłącznie wskaźnika i rzutowania (timer: Pointer; TTimer(timer).Enabled:=false).
    Biblioteki DLL bardzo nie lubią niestandardowych rozwiązań, jako choćby nawet Stringi :)

    Pamiętaj, ze DLL nie widzi wywoływanego jej programu, stąd zapis form1.timer1 jest zupełnym nonsensem dla DLL.
  • Użytkownik usunął konto  
  • Pomocny post
    Poziom 42  
    Ale to, co Ty zrobiłeś, to jest zupełnie wyciągnięte z nieba... Napisałeś zmienną będącą typu TTimer (musisz zaincludować odpowiednią bibliotekę, czyli w uses dopisać ExtCtrls, bo tam znajduje się definicja tego typu). A następnie próbujesz operować na polach obiektu, podczas gdy ten obiekt jeszcze nie istnieje.

    Na prawdę musisz "powiedzieć" funkcji, z czym ma pracować - sama się nie domyśli. I wywal użycie Unit1 z kodu DLLa - tak się po prostu nie robi, bo prowadzi tylko do błędów.

    Dodano po 4 [minuty]:

    A co do Pointer - praktyka nauczyła, że w parametrach funkcji będących współdzielonymi (DLL) stosuje się wyłącznie proste typy, jak Byte/ShortInt, Integer, LongInt, Real, (Wide)Char, PChar, Pointer). A że każdy obiekt de'facto jest wskaźnikiem, dlatego lepiej przekazać taki wskaźnik a już w samej bibliotece zrzutować na interesujący nas typ.
  • Użytkownik usunął konto  
  • Pomocny post
    Poziom 42  
    Nie wywalił w programie głownym tylko w bibliotece ;) Aby debugować bibliotekę, musisz (poza oczywiście kompilacją docelową dla debuggera) w Run>Parameters... podać plik aplikacji wykorzystującej w Host Application i z poziomu biblioteki zacząć debuggowanie.

    Jeśli zapisałeś ten kod, co podałeś, to błąd jest prawidłowy. TTimer jest klasą, a nie strukturą, więc nie istnieją jej pola do czasu powołania do życia obiektu tej klasy. No ale Tobie nie o to chodzi przecież.
  • Użytkownik usunął konto  
  • Pomocny post
    Poziom 42  
    No ale dlaczego przez parametr funkcji nie przekazujesz z programu, jak zapisałem wcześniej?

    Dodano po 2 [minuty]:

    Jeśli chodzi o tworzenie obiektów, to jest to w ogólnej postaci:
    Code:

    Object=TObject.Create;

    Ale Ty nie masz tworzyć żadnych nowych obiektów. Żadnych zmiennych lokalnych - masz tylko w parametrze funkcji przekazać referencję do obiektu, na którym będziesz operował.
  • Użytkownik usunął konto  
  • Użytkownik usunął konto