Entwickler-Ecke

Multimedia / Grafik - Probleme mit Windows Media Player ActiveX Control


mad.scientist - Mo 31.01.05 21:28
Titel: Probleme mit Windows Media Player ActiveX Control
Hallo Leute,

ich habe ein seltsames Problem mit dem ActiveX-Control zum Windows Media Player (9 oder 10). Ich habe das Control (WMP.dll) in Delphi importiert und eine Komponente erzeugen lassen (TWindowsMediaPlayer). Wenn ich jetzt entsprechend der Beschreibung aus dem SDK versuche, mittels der Funktion TWindowsMediaPlayer.newMedia(const bstrURL: WideString): IWMPMedia eine Mediendatei zu öffnen, um sie z.B. in eine Playlist einzufügen, dann bekomme ich eine Zugriffsverletzung.

Hier der Beispielcode:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.bt_ReadFileClick(Sender: TObject);
var
  i: Integer;           // Schleifenvariable
  NMedia: IWMPMedia;    // Typ für Mediendateien
  NPath: String;        // Dateiname, auch WideString versucht
begin
  PL.clear;                           // Globale Playlist leeren
  if OpenDialog1.Execute then begin   // Dateinamen abfragen
    for i := 0 to OpenDialog1.Files.Count - 1 do begin    // Schleife über selektierte Dateinamen
      NPath := OpenDialog1.Files[i];  // eigentlich überflüssig
      NMedia := WMP.newMedia(NPath);  // <-- liefert Zugriffsverletzung 
      PL.appendItem(NMedia);          // Datei an die globale Playlist anhängen
    end;
  end;
end;

Kennt jemand dieses Problem oder sieht jemand meinen Fehler?

Danke und Gruß, Florian


herzi - Di 01.02.05 10:54

Moin und Hmmm,

gleiches Problem bei mir auch.

Per WMP.mediaCollection.add() kannste das Problem aber hoffentlich umgehen. Fehlercode ist "'ungültiger Variant-Typ".

mfg herzi


ase - Di 01.02.05 10:58

- Liegt es daran, dass ihr dieser Methode einen String übergibt? Wolln die nicht immer WideString haben? Oft wollen die auch einen VariantArray haben. Kopier doch mal die Definition der Methode hier rein.
- is WMP auch <> nil?


ase


mad.scientist - Di 01.02.05 22:14

Hallo Ihr freundlichen Antworter,

herzi hat folgendes geschrieben:
Moin und Hmmm,

gleiches Problem bei mir auch.

Per WMP.mediaCollection.add() kannste das Problem aber hoffentlich umgehen. Fehlercode ist "'ungültiger Variant-Typ".

WMP.mediaCollection.add() geht zwar mit MP3s, aber z.B. nicht mit OGGs, da man die im WMP nicht in die Mediendatenbank aufnehmen kann. .newMedia() kennt (theoretisch...) alle Dateitypen, für die im System ein Codec installiert ist, .mediaCollection.add() nur diejenigen, die mehr oder weniger WMP-nativ sind.

Der Fehlercode deutet ja darauf hin, dass das ActiveX-Control eher etwas anderes als einen String (oder auch einen WideString, das habe ich bereits getestet) erwartet. Nur - was?

ase hat folgendes geschrieben:
- Liegt es daran, dass ihr dieser Methode einen String übergibt? Wolln die nicht immer WideString haben? Oft wollen die auch einen VariantArray haben. Kopier doch mal die Definition der Methode hier rein.
- is WMP auch &lt;&gt; nil?

Hier ist die Definition aus der WMPLib_TLB.pas:

Delphi-Quelltext
1:
2:
3:
4:
function TWindowsMediaPlayer.newMedia(const bstrURL: WideString): IWMPMedia;
begin
  Result := DefaultInterface.newMedia(bstrURL);
end;

Aber wer weiß, ob Delphi die richtig importiert hat? Das SDK [http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmplay10/mmp_sdk/playernewmedia.asp] redet nur von einem "String", aber was versteht MS unter einem "String"? Wie definierst Du den VariantArray? Diese ganzen unterschiedlichen Typen für Strings - normale und kurze und lange und nullterminierte und Zeiger auf Strings und was auch immer noch alles - gehen mir ziemlich auf den Keks. Ich war eigentlich lange Zeit eher Pascal(Gott hab es selig!)/Delphi-only und habe mich um API-Funktionen herzlich wenig geschert. Jetzt muss ich jedesmal überlegen, was für Typen die Funktionen eigentlich übergeben haben wollen ... :?

WMP ist definitiv <> nil, WMP ist eine visuelle Komponente im Form und lässt sich auch ansonsten problemlos steuern.

Kleine Ergänzung, folgendes habe ich in Google Groups [http://groups.google.de/groups?hl=de&lr=&client=firefox-a&rls=org.mozilla:de-DE:official&threadm=aaGdneceIt1JWJrdRVn-hQ%40comcast.com&rnum=6&prev=/groups%3Fq%3Dplayer.newmedia%26hl%3Dde%26lr%3D%26client%3Dfirefox-a%26rls%3Dorg.mozilla:de-DE:official%26selm%3DaaGdneceIt1JWJrdRVn-hQ%2540comcast.com%26rnum%3D6] gefunden:
Zitat:
I just make it to work using "CComBSTR" instead of "unsigned short filename[MAX_PATH]" for the filename variable. But I don't understand why array of shorts won't work for newMedia.
Was zum Teufel ist ein CComBSTR in Delphi (siehe mein Kommentar oben :x)??

Grüße,
Florian


mad.scientist - Di 01.02.05 22:49

Hallo nochmal,

es funktioniert übrigens noch nicht einmal die (eigentlich total sinnlose) Syntax

Delphi-Quelltext
1:
NMedia := WMP.newMedia(WMP.currentMedia.sourceURL);                    

die aus der sourceURL des aktuell gespielten MediaFiles ein newMedia erzeugen sollte.

Strange.

Florian


ase - Mi 02.02.05 10:49

Servus

Also ich denke schon das Delphi das Interface korrekt importiert hat.

Die function benötigt einen WideString. Der benutzt 2 Byte pro zeichen. Ein Zeichen ist dann ein WideChar (2 Bytes). Leider hab ich jetzt hier kein Delphi am Start aber ich weiß, dass es functionen String <--> WideString gibt. Versuch mal StringToWideString() oder so. Steht auch definitiv in der Delphi Hilfe. Wichtig ist nur, dass du den WideString dann auch wieder freigibst. Steht da glaub ich auch drinnen. Alternativ könntest du deine NPath Variable mal als WideString definieren.

Wenn das auch nicht klappt, dann schnapp dir die Import Files vom Office. Da gibts garantiert auch Funktionen die nur einen String erwarten. Schau dir an wie das da gemacht wird.

Ein VariantArray scheint es nicht zu sein da VariantArray meist so definiert werden:

Delphi-Quelltext
1:
function varArrayFunc(var Params): HResult;                    


Interessant zu wissen wäre auch, ob die AV schon beim 1. Schleifendurchlauf kommt, oder erst bei einem späteren Durchlauf.

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt.


herzi - Mi 02.02.05 13:43

Hab jetzt mal das ganze in VFP(Microsoft Visual Studio) und C# getestet. Bei beiden PS klappt es, nur unter Delphi nicht. :?: :?: :?:

kA woran das jetzt noch liegen könnte.


mad.scientist - Do 03.02.05 00:47

ase hat folgendes geschrieben:
Die function benötigt einen WideString. Der benutzt 2 Byte pro zeichen. Ein Zeichen ist dann ein WideChar (2 Bytes). Leider hab ich jetzt hier kein Delphi am Start aber ich weiß, dass es functionen String <--> WideString gibt. Versuch mal StringToWideString() oder so. Steht auch definitiv in der Delphi Hilfe. Wichtig ist nur, dass du den WideString dann auch wieder freigibst. Steht da glaub ich auch drinnen. Alternativ könntest du deine NPath Variable mal als WideString definieren.

NPath als WideString zu definieren habe ich bereits versucht, ohne Veränderung. Meines Wissens kann Delphi auch automatisch zwischen String und WideString konvertieren, oder? Ich habe jedenfalls keine Funktionen zur Typumwandlung gefunden.

ase hat folgendes geschrieben:
Wenn das auch nicht klappt, dann schnapp dir die Import Files vom Office. Da gibts garantiert auch Funktionen die nur einen String erwarten. Schau dir an wie das da gemacht wird.

Was sind die "Import Files vom Office"? Sagt mir nix.

ase hat folgendes geschrieben:
Interessant zu wissen wäre auch, ob die AV schon beim 1. Schleifendurchlauf kommt, oder erst bei einem späteren Durchlauf.

Yep, sofort beim ersten Aufruf. Auch ohne Schleife.

Warum zum Teufel passiert dieser Fehler offensichtlich nur in Delphi??? :?

Immer noch verwirrte Grüße,
Florian


mad.scientist - Sa 19.02.05 23:43

Hat keiner mehr eine Idee dazu?

Gruß, Florian


[r2d2] - Mo 21.03.05 00:18

Doch, ich. Ich bin deine Rettung.
Probier doch einfach mal

Delphi-Quelltext
1:
WMP.URL:='C:\blabla.wmv'                    

So einfach ist das. Keine Ahnung, warum die andere Methode nicht funzt.


mad.scientist - Mo 21.03.05 15:01

user profile icon[r2d2] hat folgendes geschrieben:
Doch, ich. Ich bin deine Rettung.
Probier doch einfach mal

Delphi-Quelltext
1:
WMP.URL:='C:\blabla.wmv'                    

So einfach ist das. Keine Ahnung, warum die andere Methode nicht funzt.

Naja, so einfach ist es auch wieder nicht ... :( Wenn Du die Eigenschaft WMP.URL setzt, dann öffnest Du diese Datei auch direkt. Damit kannst Du z.B. keine Playlisten verwenden! Und parallel zu einem laufenden Track geht schon gar nichts ...

Danke trotzdem, aber ich bin immer noch nicht schlauer :cry:

Florian


mad.scientist - Di 26.04.05 22:29

Hi Ihr da draußen noch einmal!

Hat denn keiner eine Lösung für dieses Problem - die Kombination Delphi/Windows Media Player ist nun ja nicht sooo abstrus, oder?

Hoffnungsvolle Grüße,
Florian