Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Typecast in DLL (https://www.delphipraxis.net/18600-typecast-dll.html)

uvinul 21. Mär 2004 20:46


Typecast in DLL
 
Hi,

ich rufe eine Prozedur in einer Dll auf und übergebe ihr als Parameter eine ObjectList.
Ich weiß, dass z.B. Item 1 der Liste ein TCustomForm ist, und ich möchte die Beschriftung auslesen.
Warum klappt der folgende Typecast nicht?

Code:
procedure GetCaption(ObjectList: TObjectList);
var
  s: string;
begin
  s := (ObjectList[1] as TCustomForm).Caption;
end;
Vielen Dank für Antworten!

NicoDE 21. Mär 2004 20:52

Re: Typecast in DLL
 
Zitat:

Zitat von uvinul
(ObjectList[1] as TCustomForm)

Wenn Du nicht gerade mit Packages arbeitest, dann ist TCustomForm (exe) <> TCustomForm (dll).
Der as-Operator funktioniert in diesem Falle nicht.

uvinul 21. Mär 2004 21:51

Re: Typecast in DLL
 
Danke schon mal für die Antwort.

1., nur interessensmäßig, warum ist TCustomForm (exe) <> TCustomForm (dll)?

2. Wie funktioniert das mit den Packages, damit ich doch den Typecast durchführen kann?
Gibt es noch andere Möglichkeiten, von der Dll aus auf mein Objekt zugreifen zu können?

NicoDE 21. Mär 2004 22:04

Re: Typecast in DLL
 
Zitat:

Zitat von uvinul
1., nur interessensmäßig, warum ist TCustomForm (exe) <> TCustomForm (dll)?

Die Klassen (inklusive deren Beschreibungen) sind jeweils in der Exe bzw. in der DLL implementiert.
Du magst als Entwickler zwar wissen, dass die beiden Versionen der Klasse mit gleichen Namen identisch sind - aber was ist, wenn unterschiedliche Delphi-Versionen verwendet wurden, deren Klassenlayout sich unterscheidet...
(edit: zudem gibt es bei globalen (statischen) Variablen der Klasse diverse Probleme, da es sie ja doppelt gibt...)
Zitat:

Zitat von uvinul
2. Wie funktioniert das mit den Packages, damit ich doch den Typecast durchführen kann?

Bei Laufzeit-Packages würde es deshalb funktionieren, weil die Exe und die DLL dann die Klasse aus dem Package verwenden würden.

'Sauber' löst man das Problem durch Deklaration von Interfaces zum Zugriff auf die Objekte, welche von beiden benutzt werden (was aber ziemlich aufwendig werden kann).

jbg 21. Mär 2004 22:10

Re: Typecast in DLL
 
Zitat:

Zitat von uvinul
1., nur interessensmäßig, warum ist TCustomForm (exe) <> TCustomForm (dll)?

Das hängt damit zusammen, dass der Bezeichner TCustomForm in Wirklichkeit ein Zeiger auf die VMT (Virtual Method Table) der Klasse TCustomForm ist. Die VMT wird vom Compiler zur Kompilierzeit erzeugt und in die Ausgabedatei (EXE und DLL) geschrieben. Wenn du nun das Programm und die DLL lädst, so existieren nun zwei VMTs, eine in der EXE und eine in der DLL. Diese haben zwar den selben internen Aufbau, jedoch sind sie nicht Zuweisungskompatibel. Zudem existieren alle Methoden der Klasse als Maschinencode in der EXE und der DLL, womit jede dieser VMTs andere Zeigerwerte für die virtuellen Methoden enthalten.

Zitat:

2. Wie funktioniert das mit den Packages, damit ich doch den Typecast durchführen kann?
Wenn du die Unit, in der die Klasse deklariert hast, in ein Package "verschiebst", so gibt es die Klasse nur einmal und die anderen Module (EXE und DLLs) können ohne Probleme darauf zugreifen, da der Compiler die schlimmste Arbeit abnimmt.

Zitat:

Gibt es noch andere Möglichkeiten, von der Dll aus auf mein Objekt zugreifen zu können?
Ja, indem man alles, was der Compiler einem abnimmt, per Hand macht. Was aber nicht gerade wenig und einfach ist, da der Compiler ein paar mehr Möglichkeiten hat.


Für die Klasse TCustomForm gibt es bereits ein Package: vcl.

uvinul 22. Mär 2004 21:45

Re: Typecast in DLL
 
Danke für die ausführlichen Informationen!
Langsam scheine ich doch irgendwie hinter die Sache zu steigen...

Das Konzept mit den Packages war mir bisher nicht bekannt, aber aufgrund Eurer Verweise habe ich mich jetzt darin etwas eingelesen und freue mich über die Möglichkeiten die sich (nun auch mir) durch die Packages bieten.

Vielen Dank nochmal...


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz