AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi DirectShow - Audioplayer mit Fehlermeldung

DirectShow - Audioplayer mit Fehlermeldung

Ein Thema von hathor · begonnen am 9. Nov 2014 · letzter Beitrag vom 9. Nov 2014
Antwort Antwort
hathor
(Gast)

n/a Beiträge
 
#1

DirectShow - Audioplayer mit Fehlermeldung

  Alt 9. Nov 2014, 11:49
Am Ende gibt es eine Fehlermeldung:
DirectShow_MP3.exe funktioniert nicht mehr.

Wer findet den Fehler oder eine Lösung?

Im Anhang ist die EXE und das MP3-File.

Delphi-Quellcode:
program DirectShow_MP3;

{$APPTYPE CONSOLE}
uses
DirectShow9,
Windows,
ActiveX;

var
pGraph : IGraphBuilder;
pControl : IMediaControl;
pEvent : IMediaEvent;
hr : HRESULT;
evCode : integer = 0;
begin
hr := CoInitialize(nil);

if FAILED(hr) then
begin
Writeln('ERROR - Could not initialize COM library');
Halt(0);
end;

// Create the filter graph manager and query for interfaces.
hr := CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, pGraph);
if FAILED(hr) then
begin
Writeln('ERROR - Could not create the Filter Graph Manager.');
Halt(0);
end;

pGraph.QueryInterface(IID_IMediaControl, pControl);
pGraph.QueryInterface(IID_IMediaEvent, pEvent);

// IMPORTANT: Change this string to a file on your system.
hr := pGraph.RenderFile('Alarm01.mp3', nil); // Build the graph
if SUCCEEDED(hr) then
begin
hr := pControl.Run(); // Run the graph
if SUCCEEDED(hr) then
begin
pEvent.WaitForCompletion(300000, evCode); // 5 Min wait for completion
//pEvent.WaitForCompletion(INFINITE, evCode);
// Note: Do not use INFINITE in a real application, because it
// can block indefinitely.
end;
end;
(* WRONG CODE
pControl._Release();
pEvent._Release();
pGraph._Release();
CoUninitialize();
//WriteLn('Press Return');
//ReadLn;
Halt(0);
end. *)

//CORRECTION
pControl:=nil;
pEvent:=nil;
pGraph:=nil;
CoUninitialize;
end.
Miniaturansicht angehängter Grafiken
ds_mp3-fehler.jpg  
Angehängte Dateien
Dateityp: zip DS_MP3.zip (235,7 KB, 13x aufgerufen)

Geändert von hathor ( 9. Nov 2014 um 15:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
40.107 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: DirectShow - Audioplayer mit Fehlermeldung

  Alt 9. Nov 2014, 12:47
Warum wird Delphi-Referenz durchsuchenHalt benutzt, um ein Programm "regulär" zu beenden?

Warum werden Interfacereferenzen nicht mit nil freigegeben?

Warum wurde keine Fehlerbehandlung in das Programm eingebaut?
(SysUtils + Try-Except)

Wie wäre es, wenn du den Programmcode in eine Prozedur auslagerst?
(da würde dann die Speicherverwaltung alles ordentlich freigeben, vorallem wenn man keine globalen Variablen verwendet und erst Recht nicht in der DPR.)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu ( 9. Nov 2014 um 12:50 Uhr)
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#3

AW: DirectShow - Audioplayer mit Fehlermeldung

  Alt 9. Nov 2014, 12:55
Danke!
Halt() war nur zum Testen, _Release hielt ich für eingebaute Funktionen von ActiveX.
Geändert funktioniert es.

Delphi-Quellcode:
...
pControl:=nil;
pEvent:=nil;
pGraph:=nil;
CoUninitialize;
end.

Geändert von hathor ( 9. Nov 2014 um 12:58 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: DirectShow - Audioplayer mit Fehlermeldung

  Alt 9. Nov 2014, 13:48
Zitat:
_Release hielt ich für eingebaute Funktionen von ActiveX.
Ist eigentlich auch Richtig..
Warum das in Delphi so nicht gemacht wird (funktioniert) obwohl eigentlich von der API vorgeschrieben weis ich auch nicht.
Davon ab bin ich auch schon über das Problem gestolpert.
C++, C# geht.. Delphi macht da wieder ne Ausnahme.

gruss

Geändert von EWeiss ( 9. Nov 2014 um 13:57 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
40.107 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: DirectShow - Audioplayer mit Fehlermeldung

  Alt 9. Nov 2014, 13:58
Halt schießt nicht das Programm ab, sondern es entläd auch noch alle Units usw.

Beim Entladen des DPR-Codes, werden dort die Interface-Variablen runtergezählt, aber die Instanzen sind bereits weg ... *peng*
Außerdem steht Halt nunmal eher für einen Fehlerabbruch, auf den Windows natürlich reagieren kann.
> siehe System._Halt0, RunError usw.

PS: entferne mal die mp3, starte das Programm ... *peng*
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu ( 9. Nov 2014 um 14:06 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 20:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf