Reference Counting mit COM richtig benutzen [gelöst]
-
- 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]
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.
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!
-
- 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?
--> TInterfacedObject
-
- 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?
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?
Edit: Was wolltest du mir damit sagen?
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!
-
- 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?
Ö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"
Und nebenbei: FPC versteht COM Interfaces und das damit verbundene IUnknown. Heißt: "nutz sie einfach"
-
- 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?
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!
-
- 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?
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.

-
- 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?
Okay, danke!
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!
- 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]
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).
-
- 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]
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!
- 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]
Lazarus und COM selbst. Insbesonders das der späten Bindung (late binding) per IUnknown.RSE hat geschrieben:Es wäre schon hilfreich wenn du etwas genauer spezifizierst, nach was du suchst, da doch so einige Themen angeschnitten wurden...
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- 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]
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!