Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek 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 1856 12
  • #1 07 Maj 2008 18:11
    Anonymous
    Użytkownik usunął konto  
  • Pomocny post
    #2 07 Maj 2008 18:40
    maciek_slon
    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ć...

    0
  • Pomocny post
    #3 07 Maj 2008 18:52
    Dżyszla
    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.

    0
  • #4 07 Maj 2008 19:01
    Anonymous
    Użytkownik usunął konto  
  • Pomocny post
    #5 07 Maj 2008 19:24
    Dżyszla
    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.

    0
  • #6 07 Maj 2008 19:36
    Anonymous
    Użytkownik usunął konto  
  • Pomocny post
    #7 07 Maj 2008 21:25
    Dżyszla
    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ż.

    0
  • #8 08 Maj 2008 09:20
    Anonymous
    Użytkownik usunął konto  
  • Pomocny post
    #9 08 Maj 2008 11:10
    Dżyszla
    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ł.

    0
  • #10 08 Maj 2008 11:50
    Anonymous
    Użytkownik usunął konto  
  • #12 08 Maj 2008 12:21
    Anonymous
    Użytkownik usunął konto