Autor Beitrag
Odeng
Hält's aus hier
Beiträge: 14

Win XP
Delphi, Perl, VB, C++
BeitragVerfasst: So 08.10.06 22:06 
Hallo!

Vor ca 1,5 Jahren wurde hier ein Thema bzw Problem diskutiert, bei dem durch Aufruf der Funktion NewMedia(WideString) vom WindowsMediaPLayer immer eine Zugriffsverletzung ausgelöst wurde. Damals kam es aber zu keinem Ergebnis (es wurden sogar Fehler in Delphi debatiert).

Das Problem:

Folgende Quellcode soll zunächst eine neue Playlist erstellen und in dieser eine Datei aufnehmen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
 var NewLied     : IWMPMedia;
     NewListe,
     AktListe    : IWMPPlaylist;
     PlayListen  : IWMPPlaylistArray;
     I           : Integer;

 if Opendialog1.execute then
 begin
 Paylisten:=Mediaplayer.playlistCollection.getByName('MeineMediaPlayerPlaylist');
   If Playlisten.count<>0 then
   begin
     for I:=0 to Playlisten.count-1 do
     begin
       AktListe:=Playlisten.Item(I);
       Mediaplayer.playlistCollection.remove(AktListe);
     end;
   end;

   NewListe:=Mediaplayer.playlistCollection.newPlaylist('MeineMediaPlayerPlaylist');

   NewLied:=Mediaplayer.newMedia(OpenDialog1.Filename);
   NewListe.appendItem(NewLied);
   MediaPLayer.currentPlaylist:=NewListe;
 end;


In Zeile 21 wird nun besagte Funktion des Players aufgerufen und (nach einiger Wartezeit) kommt die Fehlermeldung 'Zugriffsverletzung' hervor :-(

Mein Quellcode stimmt auch soweit mit dem von vor 1,5 Jahren überein.

Meine Frage nun: Haben sich hier neue Leute eingefunden oder sind den "alten" neue Erkenntnisse gekommen, was hier falsch läuft. Ich habe meinen Quellcode aus dem Internet aus einem VB-Code übersetzt. Da, so der Autor, funktioniert es. Ich bin ein bischen ratloas, da ich auch keinen Code finden kann, der von meinem abweicht.

Vielen Dank


___________
Ich bitte es zu erntschuldigen, wenn mein Thread nicht ganz eueren Normen entspricht. Danke

_________________
__________________
Es gibt nichts Gutes, außer man tut es :-)
Odeng Threadstarter
Hält's aus hier
Beiträge: 14

Win XP
Delphi, Perl, VB, C++
BeitragVerfasst: Mi 11.10.06 19:46 
Titel: ich nochmal..
mmmh, gibt es echt keinen, der eine Idee hat?? Bin jetzt (2 Tage später) noch Ratloser als vorher.....

_________________
__________________
Es gibt nichts Gutes, außer man tut es :-)
mad.scientist
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: So 07.01.07 23:57 
Hi Odeng,

immer noch keiner eine Lösung? Ich bin auch noch nicht schlauer geworden, würde die Geschichte aber immer noch gerne nutzen. Der Bug ist auch mit BDS2005 PE und WMP 11 noch aktuell.

Vielleicht nochmal 1 1/2 Jahre warten?

Herzliche Grüße,
Florian
Odeng Threadstarter
Hält's aus hier
Beiträge: 14

Win XP
Delphi, Perl, VB, C++
BeitragVerfasst: Mo 08.01.07 11:37 
Hallo Florian!

Ja, es scheint wirklich nicht so leicht zu sein. Und ich bin mittlerweiler der Meinung, dass es sich um einem Deklarationsfehler in der Routine handelt und dieser Fehler nicht in meiner / unserer Nutzung liegt.

Egal, frei nach dem Motto "viele Wege führen nach Rom" habe ich das Problem anders gelöst. Ich erzeuge in einem File selber eine Playlist und lade diese in den Player. Nicht schön, aber selten. Leider verliere ich hierdurch viel der ursprünglichen Funktionalität....

Schönen Gruß, ich dachte schon es würde keinen Interessieren,
Oliver

_________________
__________________
Es gibt nichts Gutes, außer man tut es :-)
nivosta
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 35



BeitragVerfasst: Mo 08.01.07 13:49 
Hi,

habt Ihr schon mal versucht den String als PChar zu übergeben?

Wenn das auch nicht geht dan versucht es doch mal als untypt pointer, da es sich hier ja um ein interface handelt.

Gruß
Hubert
Odeng Threadstarter
Hält's aus hier
Beiträge: 14

Win XP
Delphi, Perl, VB, C++
BeitragVerfasst: Mo 08.01.07 14:33 
Holla Hubert!

Hab ich beides schon versucht und brachte mir keinerlei Änderung.
Das mit dem Pointer wollte der Debugger erst gar nicht....

Schöne Grüße (Jetzt kommt hier langsam Stimmung auf)
Oliver

_________________
__________________
Es gibt nichts Gutes, außer man tut es :-)
nivosta
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 35



BeitragVerfasst: Mo 08.01.07 14:43 
Wieso wollte der Compiler das nicht? Sollte dem eigentlich egal sein da der Type doch unsigned ist, dieser erst auf der anderen Seite ausgewertet stimmt dieser dann nicht erhälst du eine exception.
Odeng Threadstarter
Hält's aus hier
Beiträge: 14

Win XP
Delphi, Perl, VB, C++
BeitragVerfasst: Mo 08.01.07 14:48 
Hallo.

Ich muss ehrlich sagen, dass ich mich mit dem diesem Thema schon einige Zeit nicht mehr auseinander gesetzt habe, da ich für mich eine (wenn auch eher schlechte) Lösung gefunden habe.
Ich weiß, dass ich da Probleme hatte, müsste jetzt aber versuchen den Fehler und somit den Code zu reproduzieren.

Nichts desto trotz, ist der Aufruf der Routine deklarationsconform und müsste doch funktionieren, oder?

Grüße
Oliver

p.s.: Auch trotz meiner Lösung würde mich Interessieren, wie es den (besser) geht :-)

_________________
__________________
Es gibt nichts Gutes, außer man tut es :-)
nivosta
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 35



BeitragVerfasst: Mo 08.01.07 14:57 
Bin leider zur Zeit nicht an meinem Arbeitsplaz und habe somit keinen Zugriff auf Delphi. Ich habe aber ein Programm wo dieses Problem auch bestand. Es geht sich nur um die Art wie die Variable deklariert wird (habe das leider nicht mehr im Kopf :-( ) aber schaue mir das heute Abend mal an. Sage Morgen bescheid ob es geht.
mad.scientist
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Di 09.01.07 00:56 
Hi Oliver,

manchmal muss man eben nachts um halb eins alles von Hand machen.

Es muss wirklich ein Fehler im DLL-Import von Delphi sein, den folgender furchtbar schmutziger und simpler Code läuft ganz wunderbar wundervoll traumhaft großartig: 8)

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComObj;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  wmp: variant;
  nmedia, PL: variant;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  wmp := CreateOleObject('WMPlayer.OCX');
  PL := WMP.currentPlaylist;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  nmedia := wmp.newmedia('d:\02.mp3');
  PL.appenditem(nmedia);
  showmessage(inttostr(pl.count));      // wie erwartet: 1
  showmessage(nmedia.durationstring);   // und die länge des Tracks!
  wmp.controls.play;           // und es läuft ...!
end;

end.


Das Ganze ist so zwar völlig ohne Unterstützung, da Delphi weder die Syntax geschweige denn eine komfortable Komponente kennt, aber dafür läuft es wenigstens!

Hacking sucks ... hätte ich die Idee mit dem Direktzugriff auf das Ole-Objekt vor 1 1/2 Jahren gehabt, hätte ich mir einige Arbeit mit dem DSPack sparen können. :roll:

Späte Grüße,
Florian