![]() |
QueryInterface ausschließen
Delphi-Quellcode:
der Compiler meckert weil
TCustomSessionThread = class(TThread)
// end; TSessionThread = class(TCustomSessionThread, IAudioSessionNotification)
in meiner Class nicht definiert ist. Hier jedoch geht es auch ohne!
Delphi-Quellcode:
Ist doch wenn man vom TThread <> TWinControl mal absieht das gleiche.
TCustomAudioVolume = class(TWinControl)
// end; TAudioVolume = class(TCustomAudioVolume, IAudioSessionEvents, IMMNotificationClient, IAudioSessionNotification, IAudioEndpointVolumeCallback) Meine Frage also warum ? Ich möchte diese in der TSessionThread Class nicht hinzufügen wenn es machbar ist. gruss |
AW: QueryInterface ausschließen
Klicke dich per Strg+Linke Maustaste doch mal durch die Vererbungskette und sage mir, wie die Vorfahren heißen.
Spoiler: TWincontrol -> TControl -> TComponent TComponent implementiert die von IInterface/IUnknown geforderten Methoden QueryInterface, _AddRef und _Release. Wenn du direkt schreiben willst
Delphi-Quellcode:
, dann musst du alle Methoden von IAudioSessionNotification und seinen Vorfahren implementieren, also den "Vertrag" erfüllen.
TSessionThread = class(TCustomSessionThread, IAudioSessionNotification)
Es reicht auch als Stub, d.h die Methoden können auch leer sein. |
AW: QueryInterface ausschließen
Zitat:
Zitat:
Zitat:
gruss |
AW: QueryInterface ausschließen
Zitat:
Delphi-Quellcode:
oder
Result := S_OK
Delphi-Quellcode:
oder
Result := E_NOTIMPL
Delphi-Quellcode:
- je nachdem welches Verhalten man implementieren will - hast du nicht gedacht?
Result := E_NOINTERFACE
|
AW: QueryInterface ausschließen
Zitat:
- TComponent._Release gibt die Instanz nicht frei. - TInterfacedObject._Release gibt die Instanz frei. ![]() |
AW: QueryInterface ausschließen
Zitat:
gruss |
AW: QueryInterface ausschließen
Zitat:
Entweder implementierst du das Verhalten zum zerstören des Threads im _Release oder du machst es klassisch von außen mit DeinThread.Free, ggf. mit DeinThread.WaitFor und DeinThread.Terminate arbeiten. |
AW: QueryInterface ausschließen
Zitat:
Delphi-Quellcode:
Der läuft nicht bzw. wird beendet kann er aber nicht weil mein Thread beim _Released in dem Fall wie getestet E_NOTIMPL zurückgibt
if Assigned(SessionThread) then
begin SessionThread.EndThread; Sleep(100); SessionThread.Free; end; und der RefCounter nicht 0 ist. Wenn ich die Rückgaben nicht auswerte funktioniert alles. Aber dann hab ich halt die Warnung. Muss mal schau'n wie ich das jetzt mache. EDIT: Es sollte ja egal sein wo ich die Funktionen implementiere ob in TCustomSessionThread oder TSessionThread dieser erbt ja von TCustomSessionThread.
Delphi-Quellcode:
gruss
TCustomSessionThread = class(TThread)
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; function _AddRef: integer; stdcall; function _Release: integer; stdcall; end; TSessionThread = class(TCustomSessionThread, IAudioSessionNotification) |
AW: QueryInterface ausschließen
Mach mal bitte so:
Delphi-Quellcode:
Und beim beenden deines Threads:
function TCustomSessionThread._AddRef: Integer;
begin Result := -1; end; function TCustomSessionThread._Release: Integer; begin Result := -1; end; function TCustomSessionThread.QueryInterface(const IID: TGUID; out Obj): HResult; begin if GetInterface(IID, Obj) then Result := S_OK else Result := E_NOINTERFACE; end;
Delphi-Quellcode:
if Assigned(SessionThread) then
begin SessionThread.Terminate; SessionThread.WaitFor; SessionThread.Free; end; |
AW: QueryInterface ausschließen
Danke!
So scheint es zu funktionieren. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:56 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