2009-11-17 4 views
5

Nach this question, muss ich wissen, welche Grundsätze befolgt werden sollten, um eine Kapselung einer Klasse in einer DLL kompatibel zu anderen Delphi-Versionen zu machen. Ich machte eine Klasse mit Generics-Funktion in RAD2010 und erstellen Sie eine DLL, die eine Funktion hat, die eine Instanz davon zurückgeben. Wenn ich versuchte, die DLL mit BDS2006 oder Delphi 6 zu verwenden, funktionierte die DLL nicht wie erwartet. Aber wenn ich RAD2010 in anderen Computern verwende, gibt es kein Problem. Wird es durch die Verwendung der Funktion verursacht, die in der vorherigen Delphi-Version nicht verfügbar war (der Stapel <> stuffs?)? Für Stringangelegenheiten befolge ich bereits die Kommentaranleitung in der Bibliotheksdatei, dass ich ShareMem sowohl in die Bibliothek uses-Klausel als auch in mein Projekt lege. Und ich habe borlndmm.dll von RAD2010 in den gleichen Ordner kopiert, in dem ich die DLL mit BDS2006 versuchte. Es ist nicht abgestürzt, aber es hat nicht funktioniert es erwartet. Eine Funktion gibt eine leere Zeichenfolge zurück, wenn sie in RAD2010-Umgebung sehr gut funktionierte.Welche Prinzipien sollten befolgt werden, damit eine mit Delphi erstellte DLL in anderen Delphi-Versionen gut funktioniert?

Noch einmal, ich habe eine Frage: Welche Prinzipien sollten befolgt werden, um eine Kapselung einer Klasse in einer DLL kompatibel zu einer anderen Version von Delphi zu machen? Vielen Dank im Voraus. (Für die Kapselung von Funktionen in einer DLL, wenn keine OOP verwendet wird, habe ich keine andere Version von Delphi ausgegeben).

Antwort

8

Die Definition eines Strings wurde mit D2009 geändert. Verwenden Sie einen PAnsiChar oder einen WideString, wenn Sie die Kommunikation zwischen Zeichenfolgen sicherer machen möchten.

Die Grundregel der Kommunikation durch DLLs ist, keine speziellen Delphi-Funktionen zu verwenden, also keine Delphi-Strings und keine TObject-Nachkommen. Schnittstellen, Datensätze und COM-Typen funktionieren jedoch gut.

+4

Ich möchte starken Nachdruck auf den zweiten Absatz. Wenn Sie ein Feature in der Windows-API nicht verfügbar machen, stellen Sie es auch nicht in Ihrer eigenen DLL zur Verfügung. Tu so, als würdest du eine DLL schreiben, die von C verbraucht wird, oder sogar von einer Umgebung, die du noch nie zuvor gesehen hast. –

+2

+1. Es sollte auch darauf hingewiesen werden, dass es keine Delphi-spezifischen Typen in Schnittstellenmethoden- und Funktionsergebnissen oder als Teile dieser Datensätze geben sollte (müssen). – mghie

+1

+1. Vielleicht nicht verwandt, aber vergessen Sie nicht, alle (nicht COM-) DLL-Exporte als Stdcall zu deklarieren, wenn Sie sie in anderen Sprachen als Delphi verwenden wollen. –

2

Sie fragen:

Noch einmal, ich habe eine Frage: Welche Grundsätze befolgt werden, um sollte eine Kapselung einer Klasse in einer DLL-kompatibel zu anderen Version von Delphi zu machen?

und es gibt nur einen: Tu es nicht. Sie kann nicht tun es. Entweder Sie schreiben eine DLL und verwenden dann Idiome und Datentypen, die in DLLs sicher verwendet werden können, was (unter anderem) Klassen ausschließt.

Oder Sie schreiben eine BPL, dann können Sie sicher exportieren Klassen, verwenden Sie Zeichenfolgen und so, aber Sie sind an die gleiche Delphi-Version gebunden. Diese Einschränkung ist technischer Natur, so dass das Schreiben einer DLL nicht umgehen wird. Es gibt möglicherweise Tricks, um dies zu umgehen, und es kann verschiedene Delphi-Versionen geben, die dasselbe Klassenlayout verwenden, so dass es funktioniert, aber Sie dürfen Ihre öffentliche DLL-Schnittstelle nicht mit solchen Implementierungsdetails verknüpfen.

2

Stick mit nur grundlegenden Typen. Wenn Sie Schnittstellen verwenden, erstellen Sie sie mit dem Typbibliothekseditor, so dass Sie von den kompatiblen Typen beim Start eingeschränkt werden. Eine gute Faustregel ist, die Windows-API zu betrachten und zu versuchen, ihre Aufrufkonventionen zu emulieren.

Sie können Klassen in Ihrer DLL verwenden, Sie können sie einfach nicht als solche verfügbar machen. Ein gutes Idiom, das gut für DLLs funktioniert, ist das Griff-Konzept. Ihre DLL erstellt ein Objekt und gibt ein Handle für dieses Objekt zurück. Wenn Sie erneut mit diesem Objekt arbeiten müssen, übergeben Sie einer Funktion in der DLL ein Handle. Denken Sie daran, dass Ihre DLL vollständig für den Speicher und die Lebensdauer des Objekts verantwortlich sein muss. Es ist ein trivialer Prozess, DLL-Funktionen zu erstellen, um die Teile der Klasse, auf die Sie zugreifen müssen, ebenfalls verfügbar zu machen.

Auf der Delphi-Seite können Sie dann einen Proxy-Wrapper schreiben, der das Handle vor dem Benutzer versteckt. Für Ereignisse können Sie eine Callback-Methode verwenden.Im Grunde übergeben Sie Nicht-Objektfunktionszeiger an die DLL, die dann die Funktion für das Ereignis aufruft. Ein kurzer Überblick über diesen Prozess ist unter Delphi 3000 verfügbar.

+0

Ok notiert. Vielen Dank. – WishKnew

Verwandte Themen