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?
Jakiego typu jest ten "wskaźnik na obiekt"? Podałeś mało informacji, więc trudno cokolwiek doradzić...
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ą.
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?
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ć.
- Jest to dziwna technika :)
- Nie ma ona sensu, ponieważ:
- Kod w DLL ma własną kopię RTLa
- 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.
- DLLki skompilowane w Delphi są ogromniaste - patrz pkt 1.
- Trzeba pamiętać o ShareMem.
Zważywszy na powyższe, to: - 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.
- 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.
- 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.