Porównanie dwóch klas mając jedynie wskaźniki

0

Witam, czy da sie sprawdzić czy dwie klasy są identyczne? W sensie kompiluje program, oraz biblioteke dll. Biblioteka dll zwraca mi wskaźnik na obiekt, ale powiedzmy że zmieniłem definicje klasy i skompilowałem tylko DLL. Czy jest jakaś możliwość aby wyłapać niezgodność klas? Jakaś metoda haszująca może?

0

Jakiego typu jest ten "wskaźnik na obiekt"? Podałeś mało informacji, więc trudno cokolwiek doradzić...

0

Jeśli dobrze rozumiem to masz klasę w DLL skompilowaną w innej wersji niż klasa w exe i chciałbyś dostając obiekt tej klasy zdefiniować czy to ta klasa. W zasadzie ja takiego mechanizmu nie znam bo niby jak to porównać? Jeśli zrobimy:

type
  TMyClassOne = class
  public
    function SayHello: string;
  end;

a potem

type
  TMyClassTwo = class
    function SayHello: string;
  end;

to technicznie są to dwie różne klasy posiadające tą samą metodę publiczną jednak jej definicja może być już inna dla obu klas. Z drugiej strony nawet jeśli z obiektu wyciągniętego za pomocą handla z DLL doszedłbyś do classname to możesz porównać to z bieżącą klasą jednak w public musiałaby ona mieć również wersję. Jeśli tego nie ma to nie pozostaje nic innego jak pobranie wszystkich metod publicznych (property, function, procedure, type, ich parametry, returny itd.) i weryfikacja ich z aktualną klasą.

1

A czy ktokolwiek może stwierdzić, czy umieszczanie klas w bibliotekach DLL i eksportowanie z nich obiektów tych klas to w ogóle popularna technika? Czy to tylko taka dziwna możliwość, którą kompilator przepuści, natomiast obsługa pozostawia wiele do życzenia?

2
furious programming napisał(a):

A czy ktokolwiek może stwierdzić, czy umieszczanie klas w bibliotekach DLL i eksportowanie z nich obiektów tych klas to w ogóle popularna technika? Czy to tylko taka dziwna możliwość, którą kompilator przepuści, natomiast obsługa pozostawia wiele do życzenia?

Tak mogę to stwierdzić i potwierdzić.

  1. Jest to dziwna technika :)
  2. Nie ma ona sensu, ponieważ:
  3. Kod w DLL ma własną kopię RTLa
  4. Kod w DLL, żeby poprawnie przekazywał obiekty, musi być skompilowany z identyczną wersją kompilatora co aplikacja host. I nie chodzi tu tylko o wersję DElphi, a również wersję Update, HotFix'a, itd.
  5. DLLki skompilowane w Delphi są ogromniaste - patrz pkt 1.
  6. Trzeba pamiętać o ShareMem.
    Zważywszy na powyższe, to:
  7. Chcesz mieć koniecznie DLL, to napisz komunikację pomiędzy host a DLL oparta o interfejsy COM. Nie wolno przekazywać natywnych obiektów Delphi pomiędzy DLL a Host, tylko interfejsy zgodne z COM.
  8. Jeśli zrobisz jak wyżej, będziesz mógł używać DLLki skompilowanej w Delphi5 z hostem skompilowanym w Delphi XE 10.1 - albo w dowolnym innym języku wspierającym COM.
  9. Jeśli nie umiesz, nie chce Ci się (bo to spora ilość pracy może być) albo masz inne powody i piszesz tylko w Delphi - użyj BPLi. Bez wad DLL, programuje się tak jakby to był jeden exe.

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