Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   iTunes steuern mit iTunes Type Library (https://www.delphipraxis.net/135849-itunes-steuern-mit-itunes-type-library.html)

iBooot 18. Jun 2009 21:23


iTunes steuern mit iTunes Type Library
 
Hallo Leute!
Also ich möchte mit Delphi ein kleines Progrämmchen ( :-D ) schreiben, mit dem ich iTunes steuern kann.
Ich habe das Programm schonmal mit VB programmiert und es hat einwandfrei funktioniert.
Dazu habe ich die iTunesTypeLibrary verwendet.
Aber dies mit Delphi zu realisieren ist da um einiges schwieriger.
Ich habe in Delphi schon die iTunesTypeLibrary eingebunden.
Dazu hab ich dann Beispiele gesucht.. aber irgendwie kommt jedesmal eine Fehlermeldung, wenn
ich irgendwie auf iTunes zugreifen will oder so.
Und nach stundenlangem durchforsten von google bin ich immer noch nicht schlauer als vorher.
Kann mir da vielleicht jemand ein funktionierendes Beispiel geben.
Ich habe Delphi 5.
Danke im Vorraus.

LG
-iBooot

Bernhard Geyer 18. Jun 2009 21:36

Re: iTunes steuern mit iTunes Type Library
 
Zitat:

Zitat von iBooot
...aber irgendwie kommt jedesmal eine Fehlermeldung, wenn
ich irgendwie auf iTunes zugreifen will oder so.

Mit "Fehlermeldung und so" können wir dir nicht besser helfen. Gut wäre wenn du uns die genaue Fehlermeldung mitteilst. Normalerweise ist es nicht sehr schwierig eine Type Library in Delphi zu verwenden.

iBooot 18. Jun 2009 21:42

Re: iTunes steuern mit iTunes Type Library
 
Oh sorry hab ich vergessen :'D
Zitat:

Im Projekt pTest.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Addresse 00444759 im Modul 'pTest.exe'
Lesen von Addresse 00000000'. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen
Und diese Meldung kam bei jedem Versuch, den ich gemacht habe.
Die einzelnen Versuche kann ich auch morgen nochmal posten, wenn ich die alle zusammengesucht finde.

LG
-iBooot

Bernhard Geyer 18. Jun 2009 21:58

Re: iTunes steuern mit iTunes Type Library
 
Poste doch mal den Quellcode. Der fehler deutet darauf hin das du dein Interface nicht angeforder hast (i.d. Art: MyInterface := CoMyInterface.Create)

iBooot 19. Jun 2009 19:21

Re: iTunes steuern mit iTunes Type Library
 
joa.. das wäre schonmal mein erster Fehler.
In keinem Beispiel, dass ich gefunden, war irgendetwas mit Interface zu sehen.
Und ich weiß auch nicht wie das gehen soll und was das bringt.. :?

Zu den Quelltexten..
Ich habe jetzt kein genauen Quelltext mehr, da ich durch viel rumprobieren den Quelltext ziemlich verunstaltet habe.
Aber ich poste mal die Links zu den Beispielen:
http://www.codeproject.com/KB/cs/itunestray.aspx
http://www.delphipraxis.net/internal...=381756#381756
http://www.delphipraxis.net/internal...ct.php?t=61708 Davon ist der 11. Beitrag der entscheidenste.
Doch jeder versuch führte zu dieser Fehlermeldung.

Ich werde später nochmal einen richtigen Quelltext posten (ich setz mich jetzt dran).

LG
-iBot


€dit:
Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, iTunesLib_TLB,
  StdCtrls;
Und im FormCreate:
Delphi-Quellcode:
var it: IITTrack;
begin
     label1.caption:=it.Get_Artist;
end;
2. Versuch:
Delphi-Quellcode:
var iTunes: IiTunes;
begin
     label1.caption:=iTunes.CurrentTrack.name;
end;

Bernhard Geyer 19. Jun 2009 21:19

Re: iTunes steuern mit iTunes Type Library
 
du mußt die INterfaces anfordern:

Delphi-Quellcode:
iTunes := CoiTunes.Create;

iBooot 19. Jun 2009 21:25

Re: iTunes steuern mit iTunes Type Library
 
Okay danke.
Ich habe das jetzt mal so versucht:
Delphi-Quellcode:
var iTunes: IiTunes;
begin
     iTunes := CoiTunesApp.create;
     showmessage(iTunes.CurrentTrack.Get_Album)
end;
Aber sobald ich das Projekt starte, geht die Form gar nicht erst auf und iTunes wird automatisch in den Vordergrund geholt.
Und nach einer gewissen Zeit geht die Fehlermeldung dann auch noch auf.

Also ich weiß nicht mehr weiter. Ich hoffe ihr könnt mir jetzt helfen.

LG
-iBooot

Bernhard Geyer 20. Jun 2009 12:51

Re: iTunes steuern mit iTunes Type Library
 
[quote="iBooot"]Und nach einer gewissen Zeit geht die Fehlermeldung dann auch noch auf.
An welcher Zeile. Ist GetCurrentTrack evtl. nil?
Kanns schlecht Testen das ich Apple-SW-Freien PC habe (Nachdem bei meinem iPod nach etwas über 1 Jahre der Akku nicht mehr mitspielt)

iBooot 20. Jun 2009 13:03

Re: iTunes steuern mit iTunes Type Library
 
Der Fehler kommt wieder bei "showmessage(iTunes.CurrentTrack.Get_Album);".
Und wenn das Gleich nil wär, würde der mir das doch anzeigen oder?

Bernhard Geyer 20. Jun 2009 15:59

Re: iTunes steuern mit iTunes Type Library
 
Zitat:

Zitat von iBooot
Der Fehler kommt wieder bei "showmessage(iTunes.CurrentTrack.Get_Album);".
Und wenn das Gleich nil wär, würde der mir das doch anzeigen oder?

Macht er doch:
Zitat:

Lesen von Addresse 00000000'

iBooot 20. Jun 2009 16:12

Re: iTunes steuern mit iTunes Type Library
 
Achso okay.
Und was muss ich dafür ändern?
Ich hab das nochmal ausprobiert:
1) iTunes geöffnet und Lied abspielen lassen
2) Quelltext:
Delphi-Quellcode:
var it: IiTunes;
begin
     it := CoiTunesApp.create;
     showmessage(it.CurrentTrack.Get_Album)
end;
3) getestet

iTunes wurde wie schon vorher in den Vordergrund geholt und die Form öffnete gar nicht erst.
Das dauert dann etwa 20-30 Sekunden..
.. und dann kam aber eine andere Fehlermeldung (ist mir vorher vielleicht nicht aufgefallen , dass das eine andere ist):
Zitat:

Im Projekt pTest.exe ist eine Exception der Klasse EOleSysError aufgetreten. Meldung: 'Starten des Servers Fehlgeschlagen'. Prozeß wurde angehalten. Mit einzelne Anweisung oder Start fortsetzen.
Bitte was? ^^

Wenn ich ok drücke und starte öffnet die Form und es passiert nichts weiter (die Message wurde nicht angezeigt).

Hybrid666 23. Jun 2009 07:52

Re: iTunes steuern mit iTunes Type Library
 
Hi,

ich hatte da mal für mein Programm JoyToAny ne DLL geschrieben, die zwar nur play/pause, next track und previous track kann, aber vielleicht kann dir der code ja helfen:

http://joytoany.svn.sourceforge.net/...=1&view=markup

MfG

iBooot 28. Jun 2009 21:52

Re: iTunes steuern mit iTunes Type Library
 
Ganz ehrlich.. ich kann damit gar nichs anfangen.. sry..
Gibt es hier keinen, der mir helfen kann?
Irgendjemand muss doch schonmal mit Delphi auf iTunes zugegriffen haben ^^

LG
-iBot

DSFreak 28. Jun 2009 22:07

Re: iTunes steuern mit iTunes Type Library
 
Da hast du aber Glück... genau so etwas habe ich heute erst für meine mIRC-DLL geschrieben :mrgreen:
Ich habe jetzt nicht so viel Zeit, das ganze auf "normales" Format umzuschreiben, aber entferne einfach die ganzen unnötigen Parameter; das Ergebnis landet hier in data.

Ich weiss, da ist viel Copy&Paste drin, aber man kann ja nicht alles haben. :-D

Delphi-Quellcode:
unit Query;

interface

uses
  ComObj,
  ComTool,
  SysUtils,
  Variants,
  Windows,
  iTunesLib_TLB;

implementation

function queryFile(mWnd, aWnd: HWND; data, parms: PAnsiChar; show, nopause:boolean) : integer; stdcall;
var
  iTunes : OleVariant;
  playing : integer;
  ret : AnsiString;
  track : IITTrack;
  tkind : ITTrackKind;
  ftrack : IITFileOrCDTrack;
  utrack : IITURLTrack;
begin
  try
    iTunes := CreateOleObject('iTunes.Application');
    if not VarIsNull(iTunes) then begin
      playing := iTunes.PlayerState;
      if playing > 0 then begin
        track := IDispatch(iTunes.CurrentTrack) as IITTrack;
        tkind := track.Kind;
        if tkind = ITTrackKindURL then begin
          utrack := IDispatch(iTunes.CurrentTrack) as IITURLTrack;
          ret := AnsiString(utrack.URL);
        end
        else begin
          ftrack := track as IITFileOrCDTrack;
          ret := AnsiString(ftrack.Location);
        end;
        if (ret <> '') then begin
          StrCopy(data, PAnsiChar(ret));
          Exit(3);
        end
      end;
    end;
  except
  end;
  StrCopy(data, 'n/a');
  Result := 3;
end;

function queryType(mWnd, aWnd: HWND; data, parms: PAnsiChar; show, nopause:boolean) : integer; stdcall;
var
  iTunes : OleVariant;
  playing : integer;
  name, uret : AnsiString;
  fret : PAnsiChar;
  track : IITTrack;
  tkind : ITTrackKind;
  ftrack : IITFileOrCDTrack;
  utrack : IITURLTrack;
begin
  try
    iTunes := CreateOleObject('iTunes.Application');
    if not VarIsNull(iTunes) then begin
      playing := iTunes.PlayerState;
      if playing > 0 then begin
        track := IDispatch(iTunes.CurrentTrack) as IITTrack;
        tkind := track.Kind;
        if tkind = ITTrackKindURL then begin
          utrack := IDispatch(iTunes.CurrentTrack) as IITURLTrack;
          name := AnsiString(utrack.URL);
          uret := Copy(name, 1, Pos(AnsiString('://'), name) - 1);
          StrCopy(data, PAnsiChar(uret));
          Exit(3);
        end
        else if (tkind = ITTrackKindFile) or (tkind = ITTrackKindCD) then begin
          ftrack := track as IITFileOrCDTrack;
          name := AnsiString(ftrack.Location);
          fret := AnsiStrRScan(PAnsiChar(name), '.') + 1;
          StrCopy(data, fret);
          Exit(3);
        end;
      end;
    end;
  except
  end;
  StrCopy(data, 'n/a');
  Result := 3;
end;

function queryTitle(mWnd, aWnd: HWND; data, parms: PAnsiChar; show, nopause:boolean) : integer; stdcall;
var
  iTunes : OleVariant;
  playing : integer;
  name, interp : AnsiString;
  track : IITTrack;
  tkind : ITTrackKind;
  ftrack : IITFileOrCDTrack;
begin
  try
    iTunes := CreateOleObject('iTunes.Application');
    if not VarIsNull(iTunes) then begin
      playing := iTunes.PlayerState;
      if playing > 0 then begin
        track := IDispatch(iTunes.CurrentTrack) as IITTrack;
        tkind := track.Kind;
        if tkind = ITTrackKindURL then begin
          name := AnsiString(VarToStr(iTunes.CurrentStreamTitle));
          StrCopy(data, PAnsiChar(name));
          Exit(3);
        end
        else if (tkind = ITTrackKindFile) or (tkind = ITTrackKindCD) then begin
          ftrack := track as IITFileOrCDTrack;
          interp := AnsiString(ftrack.Artist);
          name := AnsiString(ftrack.name);
          StrCopy(data, PAnsiChar(interp));
          StrCat(data, ' - ');
          StrCat(data, PAnsiChar(name));
          Exit(3);
        end;
      end;
    end;
  except
  end;
  StrCopy(data, 'n/a');
  Result := 3;
end;

function queryBitrate(mWnd, aWnd: HWND; data, parms: PAnsiChar; show, nopause:boolean) : integer; stdcall;
var
  iTunes : OleVariant;
  playing : integer;
  track : IITTrack;
begin
  try
    iTunes := CreateOleObject('iTunes.Application');
    if not VarIsNull(iTunes) then begin
      playing := iTunes.PlayerState;
      if playing > 0 then begin
        track := IDispatch(iTunes.CurrentTrack) as IITTrack;
        StrCopy(data, PAnsiChar(AnsiString(IntToStr(track.BitRate))));
        Exit(3);
      end;
    end;
  except
  end;
  StrCopy(data, '-1');
  Result := 3;
end;

function queryLength(mWnd, aWnd: HWND; data, parms: PAnsiChar; show, nopause:boolean) : integer; stdcall;
var
  iTunes : OleVariant;
  playing : integer;
  track : IITTrack;
  tkind : ITTrackKind;
  ftrack : IITFileOrCDTrack;
begin
  try
    iTunes := CreateOleObject('iTunes.Application');
    if not VarIsNull(iTunes) then begin
      playing := iTunes.PlayerState;
      if playing > 0 then begin
        track := IDispatch(iTunes.CurrentTrack) as IITTrack;
        tkind := track.Kind;
        if tkind = ITTrackKindURL then begin
          StrCopy(data, '-1');
          Exit(3);
        end
        else if (tkind = ITTrackKindFile) or (tkind = ITTrackKindCD) then begin
          ftrack := track as IITFileOrCDTrack;
          StrCopy(data, PAnsiChar(AnsiString(IntToStr(ftrack.Duration))));
          Exit(3);
        end;
      end;
    end;
  except
  end;
  StrCopy(data, '-2');
  Result := 3;
end;

function queryLengthF(mWnd, aWnd: HWND; data, parms: PAnsiChar; show, nopause:boolean) : integer; stdcall;
var
  iTunes : OleVariant;
  playing : integer;
  track : IITTrack;
  tkind : ITTrackKind;
  ftrack : IITFileOrCDTrack;
begin
  try
    iTunes := CreateOleObject('iTunes.Application');
    if not VarIsNull(iTunes) then begin
      playing := iTunes.PlayerState;
      if playing > 0 then begin
        track := IDispatch(iTunes.CurrentTrack) as IITTrack;
        tkind := track.Kind;
        if tkind = ITTrackKindURL then begin
          StrCopy(data, 'Stream');
          Exit(3);
        end
        else if (tkind = ITTrackKindFile) or (tkind = ITTrackKindCD) then begin
          ftrack := track as IITFileOrCDTrack;
          StrCopy(data, PAnsiChar(AnsiString(ftrack.Time)));
          Exit(3);
        end;
      end;
    end;
  except
  end;
  StrCopy(data, 'n/a');
  Result := 3;
end;

function queryPosition(mWnd, aWnd: HWND; data, parms: PAnsiChar; show, nopause:boolean) : integer; stdcall;
var
  iTunes : OleVariant;
  playing : integer;
begin
  try
    iTunes := CreateOleObject('iTunes.Application');
    if not VarIsNull(iTunes) then begin
      playing := iTunes.PlayerState;
      if playing > 0 then begin
        StrCopy(data, PAnsiChar(AnsiString(IntToStr(iTunes.PlayerPosition))));
        Exit(3);
      end;
    end;
  except
  end;
  StrCopy(data, '-2');
  Result := 3;
end;

function queryPositionF(mWnd, aWnd: HWND; data, parms: PAnsiChar; show, nopause:boolean) : integer; stdcall;
var
  iTunes : OleVariant;
  playing, b, m, s : integer;
begin
  try
    iTunes := CreateOleObject('iTunes.Application');
    if not VarIsNull(iTunes) then begin
      playing := iTunes.PlayerState;
      if playing > 0 then begin
        b := iTunes.PlayerPosition;
        s := b mod 60;
        m := b div 60;
        StrCopy(data, PAnsiChar(AnsiString(Format('%d:%02d', [m, s]))));
        Exit(3);
      end;
    end;
  except
  end;
  StrCopy(data, 'n/a');
  Result := 3;
end;

function queryStatus(mWnd, aWnd: HWND; data, parms: PAnsiChar; show, nopause:boolean) : integer; stdcall;
var
  iTunes : OleVariant;
begin
  try
    iTunes := CreateOleObject('iTunes.Application');
    if not VarIsNull(iTunes) then begin
      StrCopy(data, PAnsiChar(AnsiString(IntToStr(iTunes.PlayerState))));
      Exit(3);
    end;
  except
  end;
  StrCopy(data, '-1');
  Result := 3;
end;

function queryStatusF(mWnd, aWnd: HWND; data, parms: PAnsiChar; show, nopause:boolean) : integer; stdcall;
var
  iTunes : OleVariant;
  state : ITPlayerState;
begin
  try
    iTunes := CreateOleObject('iTunes.Application');
    if not VarIsNull(iTunes) then begin
      state := iTunes.PlayerState;
      case state of
        ITPlayerStateStopped: StrCopy(data, 'Gestoppt');
        ITPlayerStatePlaying: StrCopy(data, 'Laufend');
        ITPlayerStateFastForward: StrCopy(data, 'Vorspulen');
        ITPlayerStateRewind: StrCopy(data, 'Zurückspulen');
        else StrCopy(data, 'Fehler');
      end;
      Exit(3);
    end;
  except
  end;
  StrCopy(data, '-1');
  Result := 3;
end;

function queryNum(mWnd, aWnd: HWND; data, parms: PAnsiChar; show, nopause:boolean) : integer; stdcall;
var
  iTunes : OleVariant;
  playing : integer;
  playlist : IITPlaylist;
begin
  try
    iTunes := CreateOleObject('iTunes.Application');
    if not VarIsNull(iTunes) then begin
      playing := iTunes.PlayerState;
      if playing > 0 then begin
        playlist := IDispatch(iTunes.CurrentPlaylist) as IITPlaylist;
        StrCopy(data, PAnsiChar(AnsiString(IntToStr(playlist.Tracks.Count))));
        Exit(3);
      end;
    end;
  except
  end;
  StrCopy(data, '-2');
  Result := 3;
end;

function queryInfo(mWnd, aWnd: HWND; data, parms: PAnsiChar; show, nopause:boolean) : integer; stdcall;
var
  iTunes : OleVariant;
  playing : integer;
  track : IITTrack;
  tkind : ITTrackKind;
begin
  try
    iTunes := CreateOleObject('iTunes.Application');
    if not VarIsNull(iTunes) then begin
      playing := iTunes.PlayerState;
      if playing > 0 then begin
        track := IDispatch(iTunes.CurrentTrack) as IITTrack;
        tkind := track.Kind;
        if tkind = ITTrackKindURL then begin
          StrCopy(data, '2');
          Exit(3);
        end
        else if (tkind = ITTrackKindFile) or (tkind = ITTrackKindCD) then begin
          StrCopy(data, '1');
          Exit(3);
        end
        else begin
          StrCopy(data, '3');
          Exit(3);
        end;
      end;
    end
    else begin
      StrCopy(data, '0');
      Exit(3);
    end;
  except
  end;
  StrCopy(data, '-1');
  Result := 3;
end;

exports
  queryFile,
  queryType,
  queryTitle,
  queryBitrate,
  queryLength,
  queryLengthF,
  queryPosition,
  queryPositionF,
  queryStatus,
  queryStatusF,
  queryNum,
  queryInfo;

end.
  • queryFile: Dateinamen inkl. Pfad bzw. Stream-URL
  • queryType: Dateiendung bzw. tream-Protokoll
  • queryTitle: aktuell gespielter Titel inkl. Interpret im Format "Interpret - Titel"
  • queryBitrate: Bitrate des aktuell gespielten Titel in kbit/s
  • queryLength: Länge des aktuell gespielten Titels in Sekunden
  • queryLengthF: Länge des aktuell gespielten Titels im Format mm:ss
  • queryPosition(F): das selbe nochmal für den Anteil des Songs, der schon gespielt wurde
  • queryStatus(F):
    Zitat:

    Enumeration values:
    ITPlayerStateStopped (0) Player is stopped.
    ITPlayerStatePlaying (1) Player is playing.
    ITPlayerStateFastForward (2) Player is fast forwarding.
    ITPlayerStateRewind (3) Player is rewinding.
  • queryNum: Anzahl der Titel in der aktuell gespielten Playlist
  • queryInfo: -1 = Fehler, 0 = iTunes nicht gefunden, 1 = Datei läuft, 2 = Stream läuft, 3 = etwas Unbekanntes läuft

//EDIT: falls, nötig, hab ich auch noch Funktionen für Play, Pause etc...

DSFreak 1. Jul 2009 22:25

Re: iTunes steuern mit iTunes Type Library
 
Hier noch die Kontrollprozeduren, sogar nicht im mIRC-Format :mrgreen:

Delphi-Quellcode:
unit Control;

interface

uses
  ComObj,
  Variants,
  Windows;

implementation

procedure play;
var
  iTunes : OleVariant;
begin
  try
    iTunes := CreateOleObject('iTunes.Application');
    if not VarIsNull(iTunes) then begin
      iTunes.Play;
    end;
  except
  end;
end;

procedure pause;
var
  iTunes : OleVariant;
begin
  try
    iTunes := CreateOleObject('iTunes.Application');
    if not VarIsNull(iTunes) then
      iTunes.Pause;
  except
  end;
end;

procedure prev;
var
  iTunes : OleVariant;
begin
  try
    iTunes := CreateOleObject('iTunes.Application');
    if not VarIsNull(iTunes) then
      iTunes.PreviousTrack;
  except
  end;
end;

procedure next;
var
  iTunes : OleVariant;
begin
  try
    iTunes := CreateOleObject('iTunes.Application');
    if not VarIsNull(iTunes) then
      iTunes.NextTrack;
  except
  end;
end;

procedure stop;
var
  iTunes : OleVariant;
begin
  try
    iTunes := CreateOleObject('iTunes.Application');
    if not VarIsNull(iTunes) then
      iTunes.Stop;
  except
  end;
end;

end.

iBooot 2. Jul 2009 15:44

Re: iTunes steuern mit iTunes Type Library
 
Danke :thumb:
Das ist ja ein bischen viel Copy&Paste :lol:
aber nja
ich setz mich mal wieder dran (so in 2 wochen. ich fahr morgen in Urlaub :'D )


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