Einzelnen Beitrag anzeigen

Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#28

AW: TCollection = not TCollection ?

  Alt 7. Jul 2011, 18:04
Also wenn ich hier ein Self übergebe

ComboHook.SetComboParentObj(self);
Ist es für mich ersichtlich das es sich nur um die MainForm handeln kann.
Da auf dieser die ganzen Komponenten aufgesetzt sind.
Für mich nicht, weil aus dieser einen Zeile heraus nicht erkennbar ist, aus welchem Kontext heruas du diesen Aufruf machst, und grad self IST der Kontext . Wenn diese Zeile in einer Methode der MainForm steht, dann ja. Aber auch dann ist es eben nur ein Pointer, der im Adressraum der Anwendung Gültigkeit hat, nicht in der DLL. Wenn du zusätzlich noch das (tatsächliche) Handle in die DLL gibst, kannst du darüber natürlich via WinAPI Aufrufen arbeiten, weil DIE sind systemweit gültig.
Self ist kein Handle, sondern Idendisch mit z.B. dem, was ein TMyClass.Create() zurück liefert, und somit einfach eine Adresse auf den Heap, der wiederum im für nur deinen gerade aktiven Prozesses gemappten Speicher liegt, wo von aussen (ohne Tricks) keiner dran kommt. DLLs bekommen ihren eigenen Heap zugewiesen, und kommen an den der benutzenden Applikation nicht dran, ausser man kümmert sich von Hand darum, ooooder nutzt BPLs, wo sich ein von Delphi mit geliefertes "Framework" automatisch darum kümmert.
Ohne dies kennt die DLL die Struktur hinter dem gelieferten Pointer nicht (TForm ist eine Klasse der VCL, und all ihre Felder liegen ebenfalls im Adressraum der Anwendung), und selbst wenn man TForm der DLL bekannt machen würde und darauf casted, ist es noch immer ein ungültiger Pointer auf zufällige Daten im Adressraum der DLL.

Du musst zwischen Pointern und Handles unterschieden, ich glaube daher kommt deine Verwirrung. Das ist bei der VCL auch etwas gemischt, da hier Windows-Controls, die ein Systemhandle haben, mit VCL-eigenen Properties und Methoden gekapselt wird. Man kommt also via VCL Methoden (TForm.XXX()) ran, als auch über WinAPI Funktionen (SetWindowLong(MyForm.Handle, ...)). Erstere Möglichkeit fällt eben weg, wenn du den Adressraum deiner Anwendung verlässt.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium ( 7. Jul 2011 um 18:08 Uhr)
  Mit Zitat antworten Zitat