Reference Counting mit COM richtig benutzen [gelöst]

Antworten
RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Reference Counting mit COM richtig benutzen [gelöst]

Beitrag von RSE »

Hallo!

Ich beschäftige mich gerade mit der Referenzzählung von COM-Objekten. Diese sind ja alle von IUNKNOWN abgeleitet und erben somit alle den gleichen Referenzzählungsmechanismus. Das heißt laut MSDN, dass der Zähler beim Instanzieren (IUnknown::QueryInterface Method) hochgesetzt wird. Wenn ich nun in Lazarus den damit bekommenen Zeiger auf das Interface vervielfache, bekommt ja der Referenzzähler davon nichts mit. Genausowenig, wenn ich einfach den letzten Pointer auf dieses Interface auf nil setze. Daraus schließe ich, dass ich nach Benutzung genau 1x IUnknown::Release aufrufen muss und dann den letzten Pointer auf nil setzen kann.

Sind diese Annahmen alle richtig, oder macht FPC da irgendwas von alleine? Die von mir benutzten Interfaces kennt Lazarus jedenfalls nicht, die musste ich mir selbst definieren.
Zuletzt geändert von RSE am Mi 16. Dez 2009, 11:00, insgesamt 1-mal geändert.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Reference Counting mit COM, wie richtig benutzen?

Beitrag von Hitman »

--> TInterfacedObject

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Reference Counting mit COM, wie richtig benutzen?

Beitrag von RSE »

Hm, ich sehe gerade, dass sich die von mir benutzten COM-Objekte (es handelt sich um DirectShow) alle von IUnknown bzw. IDispatch ableiten. TInterfacedObject ist nicht in der Hierarchie meiner DirectShow-Klassen enthalten.

Edit: Was wolltest du mir damit sagen?
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Reference Counting mit COM, wie richtig benutzen?

Beitrag von Hitman »

Öhm - verwechsel nicht Interfaces mit Klassen. Du kriegst sicher von den COM Objekten nur die Interfaces zurück. Da die Klassen dahinter sich wahrscheinlich selbst um ihr Ref-Counting kümmern, musst du dir da keinen Kopf machen. Wenn du selbst Klassen mit einem von IUnknown abgeleiteten Interface implementierst, musst du das schon - und da ist TInterfacedObject eine gute Grundlage, wenn du es nicht alles selbst machen willst.

Und nebenbei: FPC versteht COM Interfaces und das damit verbundene IUnknown. Heißt: "nutz sie einfach"

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Reference Counting mit COM, wie richtig benutzen?

Beitrag von RSE »

Also noch mal ganz klar: Ich benutze die COM-Objekte von DirectShow. Keine selbst geschriebenen Klassen. Somit entfällt demnach TInterfacedObject komplett. Diese Objekte sind referenzgezählt, das bestätigst du mir. Du sagst "nutz sie einfach". Ich will sie aber auch richtig benutzen und nicht haufenweise ungenutzte Objekte übriglassen! Daher meine initiale Frage: Wie funktioniert das mit dem Reference Counting? Wann genau wind hoch- und wann runtergezählt? Wie soll das Objekt, welches ich über das Interface anspreche, mitbekommen, wenn ich den Interfacezeiger kopiere oder nil setze? Um meine Vermutung zu wiederholen: Ich nehme an, dass ich für die Freigabe genau ein mal die Methode _Release aufrufen muss, welche den Referenzcounter 1x runterzählt. Ist diese Annahme richtig?
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Reference Counting mit COM, wie richtig benutzen?

Beitrag von Hitman »

Nein - die RTL kümmert sich selbst darum ... der Assignment Operator ruft _AddRef auf. Und sobald eine Interface Variable den Gültigkeitsbereich verlässt (oder überschrieben wird, siehe Assignment Operator ;-)), wird _Release aufgerufen.

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Reference Counting mit COM, wie richtig benutzen?

Beitrag von RSE »

Okay, danke!
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6848
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Reference Counting mit COM richtig benutzen [gelöst]

Beitrag von af0815 »

Hat wer ev. eine Quelle mit Beispielcode für das oben diskutierte (oder die richtige Frage für Google), THX
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Reference Counting mit COM richtig benutzen [gelöst]

Beitrag von RSE »

Es wäre schon hilfreich wenn du etwas genauer spezifizierst, nach was du suchst, da doch so einige Themen angeschnitten wurden...
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6848
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Reference Counting mit COM richtig benutzen [gelöst]

Beitrag von af0815 »

RSE hat geschrieben:Es wäre schon hilfreich wenn du etwas genauer spezifizierst, nach was du suchst, da doch so einige Themen angeschnitten wurden...
Lazarus und COM selbst. Insbesonders das der späten Bindung (late binding) per IUnknown.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Reference Counting mit COM richtig benutzen [gelöst]

Beitrag von RSE »

Hm, so kann ich dir dazu direkt nix sagen. Ich wollte DirectShow benutzen, um Mediendatenströme abspielen zu können, also habe ich mir die Pascal-Interfaces im Netz besorgt und benutze sie nun. Dazu benutze ich direkt das MSDN als Hilfe, um zu wissen, welche Funktionen es gibt, was sie tun und wie man sie verwenden muss. Was da alles im Hintergrund abläuft, weiß ich nicht sooo genau. Mit early und late binding habe ich mich auch noch nicht auseinandergesetzt.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Antworten