Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi DirectShow - Audioplayer mit Fehlermeldung (https://www.delphipraxis.net/182667-directshow-audioplayer-mit-fehlermeldung.html)

hathor 9. Nov 2014 11:49

DirectShow - Audioplayer mit Fehlermeldung
 
Liste der Anhänge anzeigen (Anzahl: 2)
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.

himitsu 9. Nov 2014 12:47

AW: DirectShow - Audioplayer mit Fehlermeldung
 
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.)

hathor 9. Nov 2014 12:55

AW: DirectShow - Audioplayer mit Fehlermeldung
 
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.

EWeiss 9. Nov 2014 13:48

AW: DirectShow - Audioplayer mit Fehlermeldung
 
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

himitsu 9. Nov 2014 13:58

AW: DirectShow - Audioplayer mit Fehlermeldung
 
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*


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:11 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