Autor Beitrag
mad.scientist
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Mo 31.01.05 21:28 
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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 168

WINXP pro, SUSE Linux 9.0
D7 Pers.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 203

Gentoo, Windows 9X, ME, 2k, NT, XP
Delphi 7 Prof., PHP 5 (Eclipse 3 SDK)
BeitragVerfasst: 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

_________________
-EN
mad.scientist Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: 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:
ausblenden 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 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 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Di 01.02.05 22:49 
Hallo nochmal,

es funktioniert übrigens noch nicht einmal die (eigentlich total sinnlose) Syntax
ausblenden Delphi-Quelltext
1:
NMedia := WMP.newMedia(WMP.currentMedia.sourceURL);					

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

Strange.

Florian
ase
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 203

Gentoo, Windows 9X, ME, 2k, NT, XP
Delphi 7 Prof., PHP 5 (Eclipse 3 SDK)
BeitragVerfasst: 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:
ausblenden 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.

_________________
-EN
herzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 168

WINXP pro, SUSE Linux 9.0
D7 Pers.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Sa 19.02.05 23:43 
Hat keiner mehr eine Idee dazu?

Gruß, Florian
[r2d2]
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109

WinXP
D5 Enterprise
BeitragVerfasst: Mo 21.03.05 00:18 
Doch, ich. Ich bin deine Rettung.
Probier doch einfach mal
ausblenden Delphi-Quelltext
1:
WMP.URL:='C:\blabla.wmv'					

So einfach ist das. Keine Ahnung, warum die andere Methode nicht funzt.
mad.scientist Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Mo 21.03.05 15:01 
user profile icon[r2d2] hat folgendes geschrieben:
Doch, ich. Ich bin deine Rettung.
Probier doch einfach mal
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: 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