Auswahl einer von mehreren DLL-Instanzen (ROT?)

19/03/2008 - 11:14 von Jens Duczmal | Report spam
Hallo Newsgroup,

ich beschàftige mich gerade ein wenig mit dem "Running Object Table".

Angenommen ich habe eine Anwendung A die entweder eine öffentliche
Klasse bereitstellt oder eine DLL instanziert.

Wenn ich diese Anwendung nun 3 mal starte, dann dürften ja
auch drei Instanzen der Klasse/DLL offen sein.

Kann ich von einer anderen Anwendung B gezielt auf eine
dieser Klasseninstanzen zugreifen?

Also ich habe hier Quellcode, das ich EINE bzw. die erste
Instanz abgreifen kann.

Laut MSDN sieht es so aus, als würde sich immer nur die
erste Instanz beim ROT registrieren. Zumindest für Office-Anwendungen
(stand da so im Beispiel). Ob das immer so ist, weiss ich nicht.

Hat jemand eine Idee, ob mir EnumRunning hilft?
Ich tue mich da momentan noch etwas schwer mit dem Verstàndnis.


Oder benötige ich den Krams gar nicht und kann mit VB.NET-Funktionen
irgednwie anders gezielt auf eine von mehreren DLL-Instanzen
zugreifen?

Sinn den Spieles wàre ein Datenaustausch zwischen zwei Applikationen
über eine gemeinsame Schnittstelle. Wobei jeweils von Anwendung A und
Anwendung B mehrere geöffnet sein können und sich die richtigen
Instanzen quasi gegenseitig finden müssen.

WM_COPYDATA wollte ich da nicht unbedingt benutzen. Etwas
Schnittstellenmàssiges wàre schon um Einiges schöner :-)
(jaja, immer diese sonderwünsche)

Jens
 

Lesen sie die antworten

#1 Jens Duczmal
19/03/2008 - 15:37 | Warnen spam
Hallo nochmal,

also, was ich rausgefunden habe ist:

1) Eine Klasse/Objekt kann mehrfach in der ROT registriert werden.
2) Man kann diese Objekte auch durchlaufen.
3) Interessanterweise bekomme ich trotz Durchlaufens des ROT
jedes mal das ERSTE Objekt zurück.

Laut MSDN

Registering a second object with the same moniker, or re-registering the
same object with the same moniker, creates a second entry in the ROT. In
this case, Register returns MK_S_MONIKERALREADYREGISTERED. Each call to
Register must be matched by a call to IRunningObjectTable::Revoke
because even duplicate entries have different pdwRegister identifiers. A
problem with duplicate registrations is that there is no way to
determine which object will be returned if the moniker is specified in a
subsequent call to IRunningObjectTable::IsRunning.

Okay. So wie ich das verstehe, gibt es nur ein Problem mit IsRunning,
weil man dort nicht weiss, welche Objektinstanz überprüft wird.

Ich arbeite damit aber gar nicht. Ich verstehe aber auch nicht, wieso
ich immer das erste erzeuge Objekt zurückbekomme.

Interessant ist auch der Rückgabewert von "Register". Mit der MSDN
gehe ich da keinesfalls konform, zumal dort nirgendwo die HEX-Werte
für z.B. MK_S_MONIKERblabla erlàutert sind. Die habe ich zwar
woanders in den Tiefen des Inet gefunden, aber die sind nicht
ansatzweise Deckungsgleich mit meinen Rückgabewerten.

Also beim ersten Aufruf erhalte ich &H10000 zurück.
Beim zweiten mal &H200001 und dann &H30002

Scheint also so, als würden die nur durchgezàhlt werden.
In der MSDN steht davon allerdings überhaupt nichts.
Dàmlich sowas.


Mein Quellcode-Ausschnitt zum Durchlaufen wàre:
While (monikerEnumerator.Next(1, monikers, numFetched) = 0)
Dim ctx As IBindCtx
ctx = CreateBindCtx(0)

Dim runningObjectName As String = ""
monikers(0).GetDisplayName(ctx, Nothing, runningObjectName)
runningObjectName = runningObjectName.ToUpper
If (runningObjectName.StartsWith(objName.ToUpper)) Then
Dim runningObjectVal As Object = Nothing
runningObjectTable.GetObject(monikers(0),
runningObjectVal)
ROTObj = CType(runningObjectVal, ROTObject)

und das ROTObj wàre dann meine Klasse.
Mit CType(runningObjectVal,Object) hatte ich es auch schon probiert.
Dies hier ist die letzte Änderung.


Bitte um Hilfe :-(

Jens

Ähnliche fragen