Objekt aus anderer Anwendung auslesen

Dario Linsky

Erfahrenes Mitglied
Hallo zusammen,

ich hab in meiner Anwendung ein MDI-Formular, das in der Klassendefinition eine Public-Variable besitzt:

Code:
type
  TMDIForm = class(TForm)
  // ...
  public
    DbConn: TADOConnection;
  end;

Beim Starten der Anwendung wird eine DLL aufgerufen und das Application-Objekt aus der aufrufenden Anwendung in die DLL übergeben:
Code:
procedure Starten(PApp: TApplication); export; stdcall;
Aus dem Objekt such ich mir dann das MDI-Formular (PApp.MainForm) und darüber möchte ich dann gerne auf das TADOConnection-Objekt zugreifen:
Code:
var
  DbConn: TADOConnection;
begin
  DbConn := TADOConnection(PApp.MainForm.FindComponent('DbConn'));

Bis hierhin läuft das auch alles ohne Probleme, aber die Variable in der DLL, die ich eigentlich mit dem Objekt aus der Anwendung belegen möchte, enthält nur einen nil-Pointer. Also können keine Daten abgefragt werden.
Hat irgendjemand eine Ahnung, wie ich an das Objekt aus der übergeordneten Anwendung kommen kann?

PS: Die DLL enthält die DLL-Kindformulare, das Anzeigen davon funktioniert auch ohne Probleme. Allerdings gibt es da auch noch ein kleines Problem: Die Steuerelemente in dem MDIChild-Formular reagieren nicht auf die Tab-Taste (SetFocus ins nächste Control der Tab-Reihenfolge). Wär gut, wenn das auch noch jemand wüsste. Aber das kann ich mit entsprechendem Tippaufwand auch selbst machen.
 

Dario Linsky

Erfahrenes Mitglied
Das Problem hat sich inzwischen mehr oder weniger erledigt. Mit DLLs ist das soweit ich rausfinden konnte überhaupt nicht machbar, weil beim Übergeben des Application-Objektes (oder eines anderen Objektes) nur ein Zeiger auf die Klasse TApplication (oder was auch immer) übergeben wird. Und dieser ist zu allgemein.
Ausserdem hat jede DLL ihr eigenes Application-Objekt und ist in sich geschlossen - wie eine normale Anwendung eben.
Deswegen funktionierte das auch nicht mit dem TabIndex. Das Formular wurde zwar als MDIChild angezeigt, aber konnte von dem MDIForm nur als irgendein Objekt erkannt werden (MDIChildCount war 0).

Lösen lässt sich das Problem, wenn man anstelle von DLLs normale Packages benutzt. Die kann man ja nachher noch in *.dll umbenennen, wenn man das möchte. :)
Einziger Nachteil ist dabei, dass man sich mit den ganzen Laufzeitdateien rumärgern muss. :(