Windows ist es eigentlich egal, von wo auf die Daten zugegriffen wird, solange die Zeiger auf die Daten korrekt sind.
Das Problem liegt also, wenn man korrete Zeiger übergibt, nicht an Windows, sondern an den bereits erwähnten Code-Dopplungen.
Wenn man weiß, was man macht, kann man natürlich auch Daten zwischen der Anwendung und der DLL direkt übergebn (sollte dann aber sichergehen, dass beide die gleiche Version der Unit nutzen), muss aber damit leben, dass bestimmte Dinge nicht, bzw nur relativ aufwändig realisiert werden können.
Vorteilhafter ist es aber allgemein, wenn man im Kontext der Plugin-Programmierung bzw. dem Datenaustausch zwischen Anwendung und DLL ganz auf OOP verzichtet und nur im eigenen Bereich (also nur anwendungsintern und\oder nur DLL-intern) mit OOP arbeitet und für den Austausch zwischen beiden Teilen statische Strukturen (Records, Arrays) verwendet und ggf. der DLL eine Pointer-Tabelle mit Zeigern auf Funktionen der Hauptanwendung bereitstellt, die verwendet werden können.
Dies hat zwar den kleinen Nachteil, dass ein paar Vorzüge von Delphi flöten gehen, aber den großen Vorteil, dass man auch mit anderen Programmiersprachen relativ problemlos Erweiterungen für die Anwendung schreiben kann.
Ferner ein Tipp am Rande: Es empfiehlt sich, bei Anwendungen, die Plugins nutzen sollen, einen Memory-Manager wie FastMM4 zu verwenden, da dieser innerhalb der DLL automatisch den Speichermanager der Hauptanwendung übernimmt. Damit gehen dann neben Records und statischen Arrays auch Operationen wie String-Manipulation, Dyn. Arrays und das Verwalten von Speicherblöcken die zwischen Anwendung und DLL geshared werden wesentlich Reibungsloser. Ist ein MM geladen, der dies nicht kann (z.B. BorMM oder ShareMem), dürfen Speicherblöcke nur in dem Anwendungsteil freigegeben werden, in dem diese auch reserviert wurden.
_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.