[VB6] und andere ... COM Referenzzählung

02/06/2010 - 23:55 von Wolfgang Enzinger | Report spam
Hallo zusammen,

unter diversen Links wie
http://www.aboutvb.de/khw/artikel/k...ounter.htm
http://freevbcode.com/ShowCode.Asp?ID"9
usw. findet man Funktionen, mit denen man rauskriegen kann, von wievielen
Objektreferenzen eine COM-Objektinstanz momentan sozusagen "am Leben erhalten"
wird - ich kann das manchmal recht gut gebrauchen, wenn ich eine
Objektreferenz an andere Objekte übergeben will, von denen dann der letzte
"Konsument" diverse Aufràumarbeiten übernehmen soll (z.B. Aufruf einer
.Close-Methode o.à.).

Das funktioniert auch einwandfrei, ist aber offensichtlich so nur auf Objekte
anwendbar, die mit VB5/6 kompiliert wurden. Denn wenn ich die o.a. Funktion
beispielweise auf eine DAO.Database oder eine VB.Collection loslasse, kommen
da recht abenteuerliche Werte raus. Ist ja eigentlich auch logisch, da die
COM-Spezifikation für IUnknown nur die Funktionen QueryInterface, AddRef und
Release vorschreibt, aber den Referenzzàhler selbst nicht offenlegt. Bei VB5/6
weiss man halt mittlerweile (wohl per Trial & Error), wo der abgelegt ist.
Aber wie ist das bei anderen Sprachen?

Ich hege zwar die Befürchtung, dass man das so pauschal gar nicht sagen kann,
höchstens vielleicht bei Sprachen/Kompilern, die es einem wie VB5/6 ersparen,
das ganze COM-Gedöns zu Fuß erledigen zu müssen (PowerBASIC ab Version 9
z.B.), aber vielleicht tàusche ich mich ja ... also wenn irgendjemand eine
Idee hat, unter welchen Adressen man es zumindest versuchen könnte (irgendein
Quasi-Standard halt), bitte her damit. :-)

XPost & followup2 de.comp.lang.misc

Viele Grüsse,
Wolfgang
http://www.enzinger.net
 

Lesen sie die antworten

#1 Markus Schaaf
03/06/2010 - 12:31 | Warnen spam
Wolfgang Enzinger schrieb:

unter diversen Links wie ...
usw. findet man Funktionen, mit denen man rauskriegen kann, von wievielen
Objektreferenzen eine COM-Objektinstanz momentan sozusagen "am Leben erhalten"
wird



Das ist nicht einmal ein schlechter Hack, es ist ein Irrweg.

- ich kann das manchmal recht gut gebrauchen, wenn ich eine
Objektreferenz an andere Objekte übergeben will, von denen dann der letzte
"Konsument" diverse Aufràumarbeiten übernehmen soll (z.B. Aufruf einer
.Close-Methode o.à.).



Wenn ich das Vorhaben richtig verstehe, ist das ein Fall für
COM-Aggregation. Allerdings weiß ich nicht, ob VB das unterstützt. Wenn
nicht, bleibt Dir nur der Fußweg, alle nötigen Interfaces zu
implementieren und die Aufrufe an das innere Objekt weiterzuleiten.

Das funktioniert auch einwandfrei, ist aber offensichtlich so nur auf Objekte
anwendbar, die mit VB5/6 kompiliert wurden. Denn wenn ich die o.a. Funktion
beispielweise auf eine DAO.Database oder eine VB.Collection loslasse, kommen
da recht abenteuerliche Werte raus. Ist ja eigentlich auch logisch, da die
COM-Spezifikation für IUnknown nur die Funktionen QueryInterface, AddRef und
Release vorschreibt, aber den Referenzzàhler selbst nicht offenlegt.



Selbst da funktioniert es nicht, sobald Du auf "gemarshallte" Obejekte
zugreifst.

Ähnliche fragen