![]() |
AW: TWinControl via TInterfacedObject via TInterfacedPersistent
@Zacherl
Mit der Anleitung kann man allerdings nur Schiffbruch erleiden, oder? Wo ist denn jetzt der Unterschied zu der vorherigen Situation? - TAudioVolume erzeugen - Über TAudioVolumeProxy eine Interface-Instanz weiterreichen - TAudioVolume freigeben - Es knallt, wenn die Interface-Instanz auf nil gesetzt wird. Dieses Verhalten hatte der TE schon selber gebaut und auch noch mit viel weniger Code. Zitat:
|
AW: TWinControl via TInterfacedObject via TInterfacedPersistent
Um was es mir ging..
Ist die Unterschiede zu erfahren was ist besser, schneller bzw. Korrekter in der Ausführung. Wenn ich keine WinControls verwende macht es eigentlich keinen sinn darauf abzuleiten genauso wenig wie auf TComponent. Es stört mich nicht weiter da es funktioniert aber einen sinn ergibt das nicht wirklich. Ich könnte hier einfach tmpAudioVolume.Free mit tmpAudioVolume := Nil ersetzen. Aber es hängt noch mehr davon ab denn in Destroy müssen viele Dinge freigegeben werden. Deshalb wäre das keine Lösung. gruss |
AW: TWinControl via TInterfacedObject via TInterfacedPersistent
Zitat:
|
AW: TWinControl via TInterfacedObject via TInterfacedPersistent
Zitat:
Delphi-Quellcode:
als Objektreferenz gehalten werden, nicht als Interface. Erzeugen im Constructor und Freigeben im Destructor.
TAudioVolume
Delphi-Quellcode:
selbst implementiert dann gar kein Interface mehr und braucht auch nicht von
TAudioVolume
Delphi-Quellcode:
abzuleiten, sondern nur vom guten alten
TInterfacedObject/TInterfacedPersistent
Delphi-Quellcode:
.
TObject
Was intern mit dem Proxy passiert ist dadurch streng reguliert (da die Proxy Instanz privat ist, nie als Interface angesprochen wird und Erzeugung und Freigabe von
Delphi-Quellcode:
geregelt wird.
TAudioVolume
|
AW: TWinControl via TInterfacedObject via TInterfacedPersistent
funktioniert leider nicht und ich musste einiges umbauen.
FProxy.Free; invalid Pointer Ich lasse es jetzt wie es ist. gruss |
AW: TWinControl via TInterfacedObject via TInterfacedPersistent
Zitat:
|
AW: TWinControl via TInterfacedObject via TInterfacedPersistent
Zitat:
Delphi-Quellcode:
Aufrufe generiert ... aber das sollte dann ja eigentlich nicht am Interface bzw.
AddRef
Delphi-Quellcode:
selbst liegen, sondern ein Programmierfehler sein, oder liege ich hier falsch?
TInterfacedObject
|
AW: TWinControl via TInterfacedObject via TInterfacedPersistent
Hast du dir schon mal überlegt, warum dieser Proxy-Typ
Delphi-Quellcode:
diese Interfacs in der Deklaration aufweist?
TAudioVolumeProxy = class( TInterfacedObject,
IAudioVolume, IAudioSessionEvents, IMMNotificationClient, IAudioSessionNotification, IAudioEndpointVolumeCallback) Evtl. weil die verwendet werden um sich z.B. an einem
Delphi-Quellcode:
per
IAudioSessionControl
Delphi-Quellcode:
anzumelden, weil diese Interfaces ansonsten nutzlos wären wenn man die gar nicht verwendet?
HRESULT RegisterAudioSessionNotification( [in] IAudioSessionEvents *NewNotifications );
|
AW: TWinControl via TInterfacedObject via TInterfacedPersistent
Sehe ich kein Problem, sofern man ordnungsgemäß auch wieder
Delphi-Quellcode:
verwendet. Ich meine "irgendwo" müssen die Referenzen doch geleaked werden. Die entstehen ja nicht von alleine. Dann einfach die Referenzzählung zu deaktivieren, indem man
UnregisterAudioSessionNotification
Delphi-Quellcode:
verwendet, kann doch eigentlich nicht Sinn der Sache sein.
TInterfacedPersistence
|
AW: TWinControl via TInterfacedObject via TInterfacedPersistent
Wenn du dir selber aber die Interface Referenz nicht merkst
(dein Beispiel-Code)
Delphi-Quellcode:
und du gibst eine Interface-Referenz davon heraus, dann tickt ab da die RefCount-Bombe und die kann zu jedem Zeitpunkt platzen.
TAudioVolume = class(TObject)
strict private FProxy: TAudioVolumeProxy; strict protected FOnSessionCreate: TOnSessionCreate; public property OnSessionCreate: TOnSessionCreate read FOnSessionCreate write FOnSessionCreate; ...
Delphi-Quellcode:
begin
RegisterAudioSessionNotification(FProxy); UnregisterAudioSessionNotification(FProxy); end; { bumm, wenn diese Methode verlassen wird, denn wird FProxy zerstört } |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz