"Globale" Objekte

21/04/2010 - 18:25 von Lothar Geyer | Report spam
Um von einem Hauptprogramm und von Klassen, die in .dll-Dateien liegen,
auf die selben Daten zugreifen zu können, verwende ich Objekte, auf die
ich über die Running Object Table zugreife. Der Tipp kam hier aus der NG
und es funktioniert auch alles.

Aber zum Verstàndnis.
Es handelt sich dabei doch einfach um Objekte, deren "Adresse" ich über
die ROT holen kann. Und welches Objekt es ist, kann ich in der
GetObject-Methode angeben:

Const ContextIntID As String = "tmContextI.clsContextI"

Public Sub GetROTContextInt(ROTObject As clsIfContextInt)
Set ROTObject = GetObject(, ContextIntID)
...

Ich hoffe, ich habe das richtig verstanden.

Das heißt aber, dass - wenn ich die Anwendung zwei Mal starte - beide
Instanzen meiner Anwendung auf das selbe ROT-)Objekt und damit auf die
selben Daten zugreifen. Das möchte ich aber nicht. Jede Instanz des
Hauptprogramms soll ihre eigene Kopie des Objektes
tmContextI.clsContextI besitzen. Und die Objekte, die aus den
.dll-Dateien erzeugt werden, sollen auf den clsContextI zugreifen, der
vom jeweiligen Hauptprogramm erzeugt wurde.

Ist das möglich? Wie kann ich das erreichen?

Lothar Geyer
 

Lesen sie die antworten

#1 Schmidt
21/04/2010 - 23:49 | Warnen spam
"Lothar Geyer" schrieb im Newsbeitrag
news:

Um von einem Hauptprogramm und von Klassen,
die in .dll-Dateien liegen, auf die selben Daten zugreifen
zu können, verwende ich Objekte, auf die ich über die
Running Object Table zugreife.


Normalerweise benötigt man die ROT nur dann, wenn
man eine Objekt-Instanz für den Zugriff aus *unterschiedlichen*
Prozessen heraus benutzen möchte - und ein Prozess
dabei der "führende" Server-Prozess ist, welcher das
Singleton-Objekt überhaupt erst instanziiert und in der
ROT platziert hat.

Für den Zugriff auf solch ein zentrales Objekt innerhalb
*ein und desselben* Prozesses (aus seinen InProcess
laufenden "Satelliten-ActiveX-Dlls") gibt es einfachere
und weniger fehlertràchtige Ansàtze.

Im Prinzip muss die Hauptanwendung (das "Exe-Projekt")
nur die zentrale Objektinstanz erzeugen (z.B. in Sub Main)
und in eine globale *.bas-Modul-Variable tun.

Einen Pointer auf dieses instanziierte Objekt kann man
dann z.B. hinter ein Fenster-Handle packen (z.B. per
SetProp) ... so dass die Satelliten-Dlls sich das Dingen
dann (ohne in den Dll-Class-Instanzen dann über
COM-Interfaces arbeiten zu müssen, wie etwa Events) -
relativ problemlos ( z.B. per FindWindow) von "zentraler
Stelle" besorgen können.

Eigentlich ist das Problem *InProcess* wirklich nur auf
die Frage reduziert, wie man aus Dll-basierten Klassen
heraus (ohne COM-Interfaces für die Kommunikation
zu bemühen) die 4Bytes (die Long-Value, den ObjPtr)
dieses Singleton-Objekts relativ einfach "rüber-bekommt".

SetProp in Verbindung mit FindWindow wurde ja
bereits erwàhnt - Du kannst diesen Long-Wert aber
auch "mal eben" in die Registry schreiben (vielleicht
zusammen mit der Process-ID und dem aktuellen
Datum - und die Dlls schauen dann dort nach ;-)...
oder Shared-Memory - oder Win-Messaging -
im Prinzip geht für die paar Bytes jede Form von IPC,
wenn Du denn unbedingt auf eine explizite Hineingabe
in die Dll-Klassen per "normalem Interface-Call"
verzichten willst.

Und wie man aus solch einem ObjPtr-Longwert dann
wieder eine gültige (mit in den Client-Dlls sauber hoch-
gezàhltem Referenz-Counter) Objekt-Referenz macht,
ist für Dich wahrscheinlich nicht das Problem.

Olaf

Ähnliche fragen