AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi QueryInterface ausschließen
Thema durchsuchen
Ansicht
Themen-Optionen

QueryInterface ausschließen

Ein Thema von EWeiss · begonnen am 1. Nov 2018 · letzter Beitrag vom 1. Nov 2018
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

QueryInterface ausschließen

  Alt 1. Nov 2018, 08:49
Delphi-Quellcode:
TCustomSessionThread = class(TThread)
  //
end;

TSessionThread = class(TCustomSessionThread, IAudioSessionNotification)
der Compiler meckert weil
  • QueryInterface
  • _AddRef
  • _Release

in meiner Class nicht definiert ist.

Hier jedoch geht es auch ohne!
Delphi-Quellcode:
TCustomAudioVolume = class(TWinControl)
  //
end;

TAudioVolume = class(TCustomAudioVolume, IAudioSessionEvents, IMMNotificationClient,
  IAudioSessionNotification, IAudioEndpointVolumeCallback)
Ist doch wenn man vom TThread <> TWinControl mal absieht das gleiche.

Meine Frage also warum ?
Ich möchte diese in der TSessionThread Class nicht hinzufügen wenn es machbar ist.

gruss
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: QueryInterface ausschließen

  Alt 1. Nov 2018, 09:09
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 TSessionThread = class(TCustomSessionThread, IAudioSessionNotification) , dann musst du alle Methoden von IAudioSessionNotification und seinen Vorfahren implementieren, also den "Vertrag" erfüllen.
Es reicht auch als Stub, d.h die Methoden können auch leer sein.

Geändert von TiGü ( 1. Nov 2018 um 09:12 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: QueryInterface ausschließen

  Alt 1. Nov 2018, 09:16
Zitat:
TComponent implementiert die von IInterface/IUnknown geforderten Methoden QueryInterface, _AddRef und _Release.
Das erklärt einiges.. Danke.

Zitat:
Es reicht auch als Stub, d.h die Methoden können auch leer sein.
Jo habe ich gemacht nur dann habe ich die Warnungen
Zitat:
[dcc64 Warnung] SessionThread.pas(535): W1035 Rückgabewert der Funktion 'TCustomSessionThread.QueryInterface' könnte undefiniert sein
Muss dann wohl für die Unit die Warnungen ausschalten..

gruss
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: QueryInterface ausschließen

  Alt 1. Nov 2018, 09:25
Jo habe ich gemacht nur dann habe ich die Warnungen
Zitat:
[dcc64 Warnung] SessionThread.pas(535): W1035 Rückgabewert der Funktion 'TCustomSessionThread.QueryInterface' könnte undefiniert sein
Muss dann wohl für die Unit die Warnungen ausschalten..
An ein Result := S_OK oder Result := E_NOTIMPL oder Result := E_NOINTERFACE - je nachdem welches Verhalten man implementieren will - hast du nicht gedacht?
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#5

AW: QueryInterface ausschließen

  Alt 1. Nov 2018, 09:35
Spoiler: TWincontrol -> TControl -> TComponent

TComponent implementiert die von IInterface/IUnknown geforderten Methoden QueryInterface, _AddRef und _Release.
Ein eventuell interessanter Unterschied:

- TComponent._Release gibt die Instanz nicht frei.
- TInterfacedObject._Release gibt die Instanz frei.

https://stackoverflow.com/questions/...nt-leak-memory
Michael Justin
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: QueryInterface ausschließen

  Alt 1. Nov 2018, 09:39
Zitat:
je nachdem welches Verhalten man implementieren will - hast du nicht gedacht?
Schon. Aber! Wie der Vorredner erkannt hat wird in dem Fall meine Anwendung nicht mehr beendet.

gruss
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: QueryInterface ausschließen

  Alt 1. Nov 2018, 09:41
Zitat:
je nachdem welches Verhalten man implementieren will - hast du nicht gedacht?
Schon. Aber! Wie der Vorredner erkannt hat wird in dem Fall meine Anwendung nicht mehr beendet.

gruss
Weil der Thread noch läuft.
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: QueryInterface ausschließen

  Alt 1. Nov 2018, 09:55
Zitat:
Weil der Thread noch läuft.
Delphi-Quellcode:
      if Assigned(SessionThread) then
      begin
        SessionThread.EndThread;
        Sleep(100);
        SessionThread.Free;
      end;
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
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:
  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)
gruss

Geändert von EWeiss ( 1. Nov 2018 um 10:02 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: QueryInterface ausschließen

  Alt 1. Nov 2018, 10:22
Mach mal bitte so:

Delphi-Quellcode:
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;
Und beim beenden deines Threads:
Delphi-Quellcode:
      if Assigned(SessionThread) then
      begin
        SessionThread.Terminate;
        SessionThread.WaitFor;
        SessionThread.Free;
      end;
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: QueryInterface ausschließen

  Alt 1. Nov 2018, 10:37
Danke!
So scheint es zu funktionieren.

gruss

Geändert von EWeiss ( 1. Nov 2018 um 15:14 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz