2009-11-04 15 views
6

Potrzebuję zwrócić obiekty z biblioteki DLL wykonanej w Delphi, do aplikacji wykonanej również w Delphi. Celem jest stworzenie podsystemu, który można modyfikować w przyszłości, bez modyfikowania głównej aplikacji. Więc wyobrażam sobie rozwój podsystemu w DLL jest (dobry ??) pomysł ... programuję w Windows XP, Delphi 7. Czytałem biblioteki DLL tylko zwracają podstawowy typ danych, ale musi być jakiś sposób to ...Jak przekazywać i zwracać obiekty do i z biblioteki DLL?

Pozdrawiam.

+6

ma to zostały już omówione * kilka razy * już w StackOverflow. Szukaj pytań oznaczonych [delphi] i [dll] lub [bpl]. prawdopodobnie nic nowego do powiedzenia na ten temat ... – mghie

+0

Oh !!Świetna odpowiedź człowieka !!! I jak znaleźć dobrą odpowiedź w setkach? – DelphiProgrammer

+1

Spójrz na http://stackoverflow.com/questions/1596704/how-to-return-an-instance-from-a-ll –

Odpowiedz

2

Wolę zastosować model COM do takiego modelu, który pozwala tworzyć zewnętrzne "obiekty", które następnie można skierować z poziomu aplikacji. Tworzenie obiektów COM w Delphi jest niezwykle proste, użyj metod tworzenia ActiveX, aby utworzyć bibliotekę ActiveX, a następnie utworzyć obiekty COM. Następnie użytkownik korzysta z jednostki interfejsu w głównej aplikacji, a kiedy CoCreate instancję obiektu ładuje odpowiednią bibliotekę DLL. Jedyną trudną częścią tego jest to, że twoje obiekty com muszą być zarejestrowane w systemie, aby działały poprawnie ... co w świecie Win7/Vista wymaga podniesionego dostępu ... chociaż raz to zrobione, jest płynne.

1

Sposób polega na użyciu wrappera COM, zgodnie z sugestią skamradt.

Jest możliwe, ale not a good idea przekazywać referencje do obiektów jako wskaźniki do bibliotek DLL. Odwołaj się w szczególności do komentarzy Petera Haasa.

Jeśli nie przechodzą obiektu z Delphi DLL do aplikacji Delphi będzie mieć następujące problemy:

Musisz użyć tej samej wersji Delphi dla aplikacji i DLL.

Zarówno aplikacja, jak i DLL MUSZĄ mieć tę samą implementację obiektu - lub przynajmniej identyczny układ wszystkich pól w klasie - OK, jeśli używasz standardowych obiektów, takich jak TStringList.

Powinieneś używać pamięci dzielonej lub pakietów uruchomieniowych, w przeciwnym razie dostaniesz dziwne naruszenia dostępu.

Musiałem zachować kod tam, gdzie to zostało zrobione - to było koszmarne, ponieważ nie można było zmienić klas bez ponownej kompilacji.

2

Możesz używać interfejsów i większości problemów, wrt kompilator/rtl wersje, a nawet inne języki po prostu odejść. Interfejsy Delphi są zawsze zgodne z IUnknown, co czyni je kompatybilnymi z większością języków z obsługą OO w systemie Windows.

Należy jednak pamiętać o jednej rzeczy: nie należy używać opcji AnyString, należy stosować metodę WideString, która jest typem ciągów używanym przez COM.

0

Niezależny od platformy i języka sposób może służyć do wymiany serializowanych obiektów.

Ma wpływ na wydajność, ale ma również zalety: biblioteka DLL działa bez modyfikacji w innych językach i na platformach, takich jak .Net lub Java (przez JNA Java Native Access). Nie jest zależna od żadnych specjalnych funkcji systemu operacyjnego, więc może a także być stosowane w systemie Linux lub MacOS jeśli skompilować bibliotekę z Free Pascal.

dla serializacji można użyć JSON lub XML. Istnieją bibliotek open source dla Delphi, na przykład SuperObject i OmniXML.

+0

Jak mogę wymienić serializowane obiekty z/do aplikacji/dll z delphi. Czy masz przykład na ten temat (z SuperObject)? – Martin

Powiązane problemy