AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Interface 'IAudioEndpointVolume' läuft unter TurboDelphi aber nicht unter Delphi10.1?
Thema durchsuchen
Ansicht
Themen-Optionen

Interface 'IAudioEndpointVolume' läuft unter TurboDelphi aber nicht unter Delphi10.1?

Ein Thema von r29d43 · begonnen am 24. Nov 2016 · letzter Beitrag vom 27. Nov 2016
Antwort Antwort
Seite 1 von 2  1 2      
t.roller
(Gast)

n/a Beiträge
 
#1

AW: Interface 'IAudioEndpointVolume' läuft unter TurboDelphi aber nicht unter Delphi1

  Alt 26. Nov 2016, 15:23
"if momMuteStatus <> MuteStatus then..."

Das habe ich aber weiter oben schon mal gefragt:
Was hat MuteStatus für einen Wert?

Ausserdem würde ich GetMute nicht im Timer aufrufen - ist unsinnig, weil es global wirkt und nicht nur für das aufrufende Programm.
  Mit Zitat antworten Zitat
r29d43

Registriert seit: 18. Jan 2007
289 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Interface 'IAudioEndpointVolume' läuft unter TurboDelphi aber nicht unter Delphi1

  Alt 26. Nov 2016, 15:45
Ok, nachdem ich in der Interface-Unit bzgl. dieser GetMute-Funktion nun das Boolean durchs Bool ersetzt habe (und das auch noch in meinem Prog getan habe), sind die Exceptions verschwunden. Thx all. Müssten demnach dann nicht eigentlich auch noch alle übrigen Boolean-Typen in dieser Interface-Unit durch ein Bool ausgewechselt werden? Nehme mal an, ja. Hatte diese Unit irgendwann mal aus dem Netz gedownloaded. Und wie gesagt: Mit TurboDelphi hatte es immer problemlos geklappt.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: Interface 'IAudioEndpointVolume' läuft unter TurboDelphi aber nicht unter Delphi1

  Alt 26. Nov 2016, 16:24
Ok, nachdem ich in der Interface-Unit bzgl. dieser GetMute-Funktion nun das Boolean durchs Bool ersetzt habe (und das auch noch in meinem Prog getan habe), sind die Exceptions verschwunden. Thx all. Müssten demnach dann nicht eigentlich auch noch alle übrigen Boolean-Typen in dieser Interface-Unit durch ein Bool ausgewechselt werden? Nehme mal an, ja. Hatte diese Unit irgendwann mal aus dem Netz gedownloaded. Und wie gesagt: Mit TurboDelphi hatte es immer problemlos geklappt.
Jap mit ziemlicher Sicherheit. Microsoft Schnittstellen bzw. C im allgemeinen verwendet in der Regel 4-Byte Booleans (= BOOL). Dass es vorher geklappt hat war reiner Zufall, da du dir mit den falschen Parametern auf jeden Fall den Stack kaputt machst. Die Integer Results sind btw. auch falsch, das müsste HRESULT sein und stdcall kannst du mit safecall ersetzen, wenn du lieber Exceptions statt Error-Codes hast. Generell solltest du auf jeden Fall die Fehlercodes von MSDN-Library durchsuchenCoCreateInstance und den Interface Methoden prüfen.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
r29d43

Registriert seit: 18. Jan 2007
289 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Interface 'IAudioEndpointVolume' läuft unter TurboDelphi aber nicht unter Delphi1

  Alt 26. Nov 2016, 15:51
Ausserdem würde ich GetMute nicht im Timer aufrufen - ist unsinnig, weil es global wirkt und nicht nur für das aufrufende Programm.
Warum? GetMute ist doch nur eine Status-Abfrage. Da ist es imo doch unrelevant ob es eine quasi globale Abfrage ist oder nicht, oder?
  Mit Zitat antworten Zitat
t.roller
(Gast)

n/a Beiträge
 
#5

AW: Interface 'IAudioEndpointVolume' läuft unter TurboDelphi aber nicht unter Delphi1

  Alt 26. Nov 2016, 16:38
DELPHI wird bis zum bitteren Ende herumzicken - siehe Anhang.

Zitat:
"Einen Test auf Gleichheit mit Hilfe des Operators "ungleich" zu formulieren, kann jedoch als fragwürdiger Programmierstil aufgefaßt werden ... "
Datentyp bool in C/C++ (In C++ hat AUDIO_VOLUME_NOTIFICATION_DATA seinen Ursprung)
Angehängte Grafiken
Dateityp: jpg BOOL-BOOLEAN.jpg (28,8 KB, 19x aufgerufen)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Interface 'IAudioEndpointVolume' läuft unter TurboDelphi aber nicht unter Delphi1

  Alt 26. Nov 2016, 17:15
Zitat:
DELPHI wird bis zum bitteren Ende herumzicken - siehe Anhang.
Nicht wenn man es richtig macht..

Delphi-Quellcode:
  HR := AudioEndpointVolume.GetMute(b);
  if HR = S_OK then
    if Value <> b then
    begin
      // ** We should use very tricky code as follows.
      // ** If we use normal sentence like "AudioEndpointVolume.SetMute(Value, nil);"
      // ** it does not operate.
      if b then
        i := 0
      else
        i := 1;
      AudioEndpointVolume.SetMute(BOOL(i), @GUID_TAudioVolume);
    end;
Davon ab da ist einiges im argen, aber sei's drum.
Wenn du Boolean definierst solltest du es explicit casten.. siehe dieses Beispiel.

gruss

Geändert von EWeiss (26. Nov 2016 um 17:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

AW: Interface 'IAudioEndpointVolume' läuft unter TurboDelphi aber nicht unter Delphi1

  Alt 27. Nov 2016, 23:47
DELPHI wird bis zum bitteren Ende herumzicken - siehe Anhang
Mhh bei mir ist BOOL in der Windows.pas korrekt als BOOL = LongBool definiert.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
r29d43

Registriert seit: 18. Jan 2007
289 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Interface 'IAudioEndpointVolume' läuft unter TurboDelphi aber nicht unter Delphi1

  Alt 26. Nov 2016, 18:37
"if momMuteStatus <> MuteStatus then..."

Das habe ich aber weiter oben schon mal gefragt:
Was hat MuteStatus für einen Wert?
Du hattest das in Post7 mit dem Boolean-Wert auf der einen Seite und dem Integer-Wert auf der anderen Seite etwas falsch interpretiert, weil ja der Funktionswert nur für die Kontrolle, ob die Funktion überhaupt richtig arbeiten konnte, zurückgegeben wird. Der hat mit diesem abzufragenden MuteStatus ansonsten nämlich garnichts zu tun, weil dieser MuteStatus-Wert eben über den von dir angegebenen Parameter in der Klammer der Funktion übergeben wird. Von daher war das für mich also der nicht richtige Ansatz und weshalb ich diese Boolean-Antwort dann im Weiteren natürlich blöderweise insgesamt ignoriert. Zumal das von himitsu sicher keine Fehlinterpretation sein konnte. Aber deine Fehlinterpretation dieser Situation hatte mich einfach zu sehr davon abgebracht ..so dass ich tatsächlich nochmal einen dritten Anstoß von EWeiss in diese Richtung brauchte.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: Interface 'IAudioEndpointVolume' läuft unter TurboDelphi aber nicht unter Delphi1

  Alt 26. Nov 2016, 18:47
Zitat:
Du hattest das in Post7 mit dem Boolean-Wert auf der einen Seite und dem Integer-Wert auf der anderen Seite etwas falsch interpretiert
Zitat:
Woher bekommt MuteStatus : boolean; seinen Wert?
Getmute liefert einen INTEGER-Wert zurück.

Ersetze MMDevAPI:
Ok das war alles falsch basierend auf dein Schnipsel.
BOOL und HRESULT wäre richtig gewesen, aber gut.

Zitat:
so dass ich tatsächlich nochmal einen dritten Anstoß von EWeiss in diese Richtung brauchte.
Na ja himitsu hat da im Beitrag 8 schon drauf hingewiesen.
Zitat:
"Boolean" (1 Byte) ist auch falsch, da BOOL dem LongBool (4 Byte) entspricht.
Das wäre alles nicht passiert wenn du die Interface selbst übersetzt hättest.
Wie schon gesagt da ist noch einiges im argen.

Einfaches Beispiel..
Die richtige Code-Zeile für GetMute sieht aus wie folgt.

function GetMute(var pbMute: BOOL): HRESULT; stdcall; Durch den var Parameter pbMute hättest du Boolean gar nicht erst übergeben können (Der Fehler wäre also niemals aufgetreten)
Dann wie Zacherl schon sagte ist die Rückgabe HRESULT nicht Integer.. wenn schon dann "LongInt"
usw..

gruss

Geändert von EWeiss (26. Nov 2016 um 19:11 Uhr)
  Mit Zitat antworten Zitat
r29d43

Registriert seit: 18. Jan 2007
289 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Interface 'IAudioEndpointVolume' läuft unter TurboDelphi aber nicht unter Delphi1

  Alt 26. Nov 2016, 20:59
na, jetzt mach aber bitte mal ein bisschen halblang.

Zitat:
Zitat:
Woher bekommt MuteStatus : boolean; seinen Wert?
Getmute liefert einen INTEGER-Wert zurück.

Ersetze MMDevAPI:
Ok das war alles falsch basierend auf dein Schnipsel.
BOOL und HRESULT wäre richtig gewesen, aber gut.
Wieso basierend auf meinem Schnipsel? Das sehe ich minimal anders. Für mich liest sich das schlicht so, dass er diese Art der Ergebnisübergabe noch garnicht so richtig kannte und hier einfach einen angeblichen Vergleich zwischen Boolean- und INTEGER-Wert beanstanden wollte.


Zitat:
Zitat:
so dass ich tatsächlich nochmal einen dritten Anstoß von EWeiss in diese Richtung brauchte.
Na ja himitsu hat da im Beitrag 8 schon drauf hingewiesen.
Zitat:
"Boolean" (1 Byte) ist auch falsch, da BOOL dem LongBool (4 Byte) entspricht.
habe ich doch selbst schon so anklingen lassen, oder?

Zitat:
Das wäre alles nicht passiert wenn du die Interface selbst übersetzt hättest.
Da gebe ich dir allerdings recht. Obschon wage ich es mal festzustellen, dass sich der ganz große Tross des Programmierervolkes ebenfalls auf diese etwas schnellere Art und Weise fortzubewegen versucht. Es reicht imo, wenn man den im Internet irgendwo erspähten Code grundsätzlich begriffen hat, diesen vllt. noch da o. da etwas sinnvoll auskommentiert hat, und wenn der anschließend auch noch (jahrelang) fehlerlose Ergebnisse bringt, dann ist der eben gebongt. Erst wenn ich mal irgendein etwas größeres Projekt bzgl. dieses Themas machen möchte, und nicht nur ein kleines Mini-Progrämmchen, werde ich mir die Sache nochmal etwas gründlicher und eingehender zu Gemüte führen. Das wird auch bei sehr vielen anderen so die Regel sein, und ist durchaus auch sinnvoll bzw. notwendig, wenn überhaupt eine irgendwie nennenswerte Masse an interessantem Code, den man mal wenigstens so zur Kenntnis genommen haben sollte, herauskommen soll.



Zitat:
Wie schon gesagt da ist noch einiges im argen.
Danke, danke, danke, es sprach wohl der ganz ganz große Meister himself!

Zitat:
Einfaches Beispiel..
Die richtige Code-Zeile für GetMute sieht aus wie folgt.
Geschenkt, für solche extra schöngeschriebenen Sandmännchengeschichtchen bin ich schon zu alt.

usw..



Schönen Abend,
trotzdem noch.

Geändert von r29d43 (26. Nov 2016 um 21:19 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 14:37 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