2009-11-04 13 views
6

Ich muss Objekte aus einer DLL, die in Delphi erstellt wurde, an eine App zurückgeben, die in Delphi erstellt wurde. Das Ziel besteht darin, ein Subsystem zu erstellen, das in der Zukunft geändert werden kann, ohne die Hauptanwendung zu ändern. Also stelle ich mir vor, das Subsystem in einer DLL zu entwickeln ist eine (gute ??) Idee ... ich programmiere in Windows XP, Delphi 7. Ich habe gelesen, dass DLLs nur den grundlegenden Datentyp zurückgeben, aber es muss eine Möglichkeit geben dass ...Wie übergeben und zurückgeben Objekte an und von einer DLL?

Mit freundlichen Grüßen.

+6

Dies hat * bereits mehrfach auf StackOverflow diskutiert * Nach Fragen mit dem Tag [delphi] und [dll] oder [bpl] suchen wahrscheinlich nichts Neues zu diesem Thema zu sagen ... – mghie

+0

Oh !!Große Antwort Mann !!! Und wie findet man eine gute Antwort in Hunderten von ihnen ???? – DelphiProgrammer

+1

Schauen Sie sich http://StackOverflow.com/Questions/1596704/How-to-Return-an-Instance-from-a-Dll –

Antwort

2

Ich ziehe es vor, COM auf ein solches Modell anzuwenden, mit dem Sie externe "Objekte" erstellen können, die Sie dann direkt aus Ihrer Anwendung heraus aufrufen können. Das Erstellen von COM-Objekten in Delphi ist äußerst einfach. Verwenden Sie Ihre ActiveX-Erstellungsmethoden, um eine ActiveX-Bibliothek zu erstellen und anschließend COM-Objekte zu erstellen. Sie verwenden dann die Schnittstelleneinheit in Ihrer Hauptanwendung, und wenn Sie eine Instanz des Objekts CoCreate, lädt es die entsprechende DLL. Der einzige knifflige Teil davon ist, dass Ihre com-Objekte auf dem System registriert werden müssen, um richtig zu funktionieren ... was in der Welt von Win7/Vista erhöhten Zugriff erfordert ... obwohl dies einmal getan ist, ist es nahtlos.

1

Die BEST Möglichkeit ist, einen COM-Wrapper zu verwenden, wie von skamradt vorgeschlagen.

Es ist möglich, aber not a good idea übergeben Objektverweise als Zeiger auf DLLs. Beziehen Sie sich insbesondere auf die Kommentare von Peter Haas.

Wenn Sie das tun, ein Objekt aus einem Delphi-DLL zu einem Delphi-app passieren Sie folgende Probleme haben:

Sie müssen die gleiche Version von Delphi für die App und DLL verwenden.

Sowohl die App als auch die DLL MÜSSEN die gleiche Implementierung des Objekts haben - oder zumindest das gleiche Layout aller Felder in der Klasse - OK, wenn Sie Standardobjekte wie TStringList verwenden.

Sie sollten shared memory oder runtime packages verwenden, sonst werden Sie seltsame Zugriffsverletzungen bekommen.

Ich musste Code pflegen, wo dies gemacht wurde - es war albtraumhaft, wie Sie Klassen ohne viel Neukompilierung nicht ändern konnten.

2

Sie können Schnittstellen und die meisten Ihrer Probleme verwenden, in denen Compiler/RTL-Versionen oder sogar andere Sprachen einfach weggehen. Die Schnittstellen von Delphi sind immer IUnknown-kompatibel, wodurch sie mit den meisten OO-fähigen Sprachen unter Windows kompatibel sind.

Eine Sache jedoch zu beachten: Verwenden Sie keine AnyString, bleiben Sie bei WideString, das ist der von COM verwendete Stringtyp.

0

Ein plattform- und sprachunabhängiger Weg könnte sein, serialisierte Objekte auszutauschen.

Es hat eine Auswirkung auf die Leistung, aber es hat auch Vorteile: Die DLL funktioniert ohne Änderungen mit anderen Sprachen und Plattformen wie .Net oder Java (über JNA Java Native Access). Es hängt nicht von irgendwelchen Besonderheiten des Betriebssystems so kann es als auch unter Linux oder MacOS verwendet werden, wenn Sie die Bibliothek mit Free Pascal kompilieren.

für die Serialisierung, könnten Sie JSON oder XML verwenden. Es gibt Open-Source-Bibliotheken für Delphi, zum Beispiel SuperObject und OmniXML.

+0

Wie kann ich serialisierte Objekte von/nach Anwendung/DLL mit Delphi austauschen. Hast du ein Beispiel (mit SuperObject)? – Martin

Verwandte Themen