Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#2

Re: Zugriff auf Komponenten auf einer Form in einer DLL

  Alt 28. Sep 2005, 18:18
Lösungen:

1.) mit Packages arbeiten, oft hier im Forum erklärt
2.) darauf verzichten und per .ClassName abfragen, was wiederum nur getrickse wäre

Ursache:

Beides, dein Code der EXE und der Code der DLL linken die VCL komplett als separate Kopie in ihren Code ein. Alle Abfragen wie is, as gehen auf die Methoden .ClassType und .ClassParent zurück die einfach einen Pointer in das Codesegement liefern in der die Klassenstruktur durch den Compiler gespeichert wurde. Da aber nun beide Module, EXE wie auch DLL, eine egene Kopie dieser Klassenstrukturen speichern wird ein Vergleich dieser Pointer untereinander unterschiedliche Klassenstrukturen vergleichen. Dieser Vergleich kann also niemals TRUE ergeben. Da aus Sicht der Klassenhierarchie es sich um zwei vollkommen getrennte Kopien handelt.

Dieser Fakt zeigt sehr deutlich das in einer komplexeren Anwendung die auf einem solchen DLL Konzept aufbaut auf kurz oder lang immense Probleme zukommen werden. Weil

1.) die VCL auf die is,as,ClassType Operatoren angeweisen ist
2.) weil es durchaus möglich ist das zb. das EXE Modul dynamisch eine Klasse erzeugt die aber in einer Objektinstance die durch die DLL erzeugt wurde eingefügt wird. Sprich: die EXE erzeugt Komponente X und fügt diese in Form Y, das in der DLL erzeugt wurde, ein. Nun vermischen sich also zwei im Grunde verschiedene Klassenhierarchien in einer Objektinstance. Wird diese aber nun freigegeben wird NICHT per IS,AS Operator vorher geprüft zu welcher Klassenhierarchie die jeweilige Komponente gehört sondern einfach freigegeben. Es vermischt sich also auch die Verantwortlichkeit wer was wann an Daten freizugeben hat. Das funktioniert so lange gut wie beide Module mit dem gleichen Speichermanager arbeiten. Aber auf lange Sicht wird es krachen und zu sehr unschönen Fehlern führen.

Basis der Ursache:

ist darin begründet das es in fakt nicht möglich ist auf diese Weise die VCL in eigenen Modulen zu vergewaltigen. Dies ist niemals so vorgesehen gewesen. Die grundsätzliche Ursache liegt also im Unvermögen derjenigen Programmierer die solche Tricks als saubere Lösung vorschlagen und nicht die Zusammenhänge der VCL begriffen haben. Ist leider so, und ich rate dir von solchen Lösungen Abstand zu nehmen.


Gruß Hagen
  Mit Zitat antworten Zitat