Klasy, interface i biblioteki dll.

0

Witam
Przeczytalem gdzies, ze mozna eksportowac klasy z bibliotek
dll za pomoca interefasow. Jest to mozliwe i jest to nawet
dosc proste. Nie wiem jak to robia profesjonalisci, ale ja
to zrobilem tak:

Plik ticos.inc

type
TiCos = Interface
['{B86FC752-D7E6-4AB4-997C-C56D736B61AF}']
procedure c;
end;

Wlaczymy go pozniej za pomoca dyrektywy kompilatora do pisanego
przez nas programu, w ktorym chcemy wykorzystac nasza biblioteke
i zdefiniowana w niej klasie.

Plik biblioteka.pas

Tcos = class(TInterfacedObject, TiCos)
constructor utworz;
procedure c;
destructor usun;
end;

.
.
.

function UtworzKlase: TiCos; stdcall;
begin
Result := Tcos.Utworz;
end;

Definiujemy to co chcemy zdefiniowac...
Eksportujemy to co chcemy...

Pozniej, we pisanym przez nas programie:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls;

{$I ticos.inc}

.
.
.

Zwracamy wskaznik do programu, operujemy na klasie poprzez
funkcje interface...

Mam drobny problem... co mam zrobic, aby skasowac utworzona wewnatrz
biblioteki klase? :)

A jak to robia profesjonalisci?

A jak juz tutaj sobie pisze, to zadam jeszcze jedno pytanie...

Zna ktos adres strony, na ktorej w wyczerpujacy sposob zostala
poruszona tematyka pisania bibliotek dll? W ujeciu duzo bardziej
niz podstawowym. :)

Dziekuje.

0

Wydaje mi się, że powinno wystarczyć przypisanie do interfejsu wartości nil (obiekt o kontrolowanym czasie życia), ale mogę się mylić.

0

Znaczy sie interfejs jest obiektem o kontrolowanym czasie zycia. A obiekty juz raczej nie. Przypisanie nil do interfejsu (chyba) spowoduje tylko ze sie straci wskaznik na ten obiekt a sam obiekt bedzie zajmowal niepotrzebnie miejsce. Prawda?

0

Wydaje mi się, że zwalnia interfejs (czyli notabene jakiś tam obiekt, który ten interfejs implementuje). Zresztą można to prosto sprawdzić: wrzuć do destruktora obiektu np. ShowMessage() i sprawdź, czy przy zwalnianiu interfejsu wyrzuci komunikat i wszystko będziesz wiedział :)

0

hhhymmm... moze... moze... sprawdze to pozniej, bo na tym kompie delphi nie mam. Tak teraz sobie mysle, ze trzeba bylo by napisac nowa funkcje, niezwiazana z interfejsem ktora by wywolywala destruktor klasy... co bylo by raczej ciezkie, ze wzgledu na to ze nie mozna by bylo napisac: Self.Free;

Chociaz nie... daloby sie to zrobic. :)
Acz... obawiam sie efektu, typu "Invalid pointer operation".

To teraz rozwaz to co napisze nizej i powiedz dlaczego to dziala w Delfi.
Jest sobie nazwykleszy obiekt najzwyklejszej klasy:

obiekt := TObiekt.Create;
obiekt.NadajWartosc(5);
obiekt.WyswietlWartosc;
obiekt.Free;

obiekt.NadajWartosc(3);
obiekt.WyswietlWartosc;

I program nadal dziala, jaby nie zauwazyl tej subtelnej roznicy ze obiekt jest juz zwolniony. Spodziewany efekt dopiero jest zauwazalny, w momencie gdy program wyjdzie poza blok w ktorym sie zwolnilo obiekt. Ale po zastosowaniu takiej kombinacji:

obiekt.Free;
obiekt.Destroy;

obiekt sie kasuje natychmiastowo i juz nie mozna przypisac wartosci polu ani odczytac jej.

Moze dlatego nie zauwazylem ze obiekt w bibliotece dll juz sie skasowal. :)

Pozdrawiam. :)

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