| Autor |
Beitrag |
Odeng
Hält's aus hier
Beiträge: 14
Win XP
Delphi, Perl, VB, C++
|
Verfasst: 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:
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 
Hält's aus hier
Beiträge: 14
Win XP
Delphi, Perl, VB, C++
|
Verfasst: 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
      
Beiträge: 17
|
Verfasst: 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 
Hält's aus hier
Beiträge: 14
Win XP
Delphi, Perl, VB, C++
|
Verfasst: 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
      
Beiträge: 35
|
Verfasst: 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 
Hält's aus hier
Beiträge: 14
Win XP
Delphi, Perl, VB, C++
|
Verfasst: 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
      
Beiträge: 35
|
Verfasst: 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 
Hält's aus hier
Beiträge: 14
Win XP
Delphi, Perl, VB, C++
|
Verfasst: 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
      
Beiträge: 35
|
Verfasst: 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
      
Beiträge: 17
|
Verfasst: 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:
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 public 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)); showmessage(nmedia.durationstring); wmp.controls.play; 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.
Späte Grüße,
Florian
|
|
|