iTunes COM で、最近のプロパティーにアクセスするには?

解決


Delphi第3世代  2006-05-08 14:43:26  No: 21415

iTunes COM
ヘルプファイル ( iTunes COM for Windows SDK )
http://developer.apple.com/sdk/itunescomsdk.html

を使って、いろいろ試しているのですが、
比較的最新に追加されたプロパティーにアクセスしようとすると、
'RPCRT4.dll'でエラーが怒ってしまいます。
どこがおかしいのでしょうか。

Delphi6 Personal
Windows XP Pro
iTunes 6.0.4.2 
タイプライブラリ iTunesLib_TLB バージョン 1.7

//----------------

uses
  iTunesLib_TLB {を追加}
..

  private
    { Private 宣言 }
    iTunesApp: IiTunes;

..

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  sFilePath: WideString;
  sName: WideString;
  sArtist: WideString;
  sAlbum: WideString;
  sGenre: WideString;
  sYear: WideString;
  bRememberBookmark: WordBool;
  bExcludeFromShuffle: WordBool;
  oTrack: IITTrack;
  oFileTrack: IITFileOrCDTrack;
  oTrackCollec: IITTrackCollection;
  oMainLibrary: IITLibraryPlaylist;
  oStatus: IITOperationStatus;
begin
  Windows.Beep(3000, 100);
  
  sFilePath := Edit1.Text;
  sName := Edit2.Text;
  sArtist := Edit3.Text;
  sAlbum := Edit4.Text;
  sGenre := Edit5.Text;
  sYear := Edit6.Text;
  bRememberBookmark := CheckBox1.Checked;
  bExcludeFromShuffle := CheckBox2.Checked;

  // iTunes 起動
  iTunesApp := CoiTunesApp.Create;
  try

    // ライブラリーのプレイリストを取得
    oMainLibrary := iTunesApp.LibraryPlaylist;

    // ライブラリーのプレイリストにファイルを追加
    // 複数のファイルが入ったフォルダーごと指定も可能
    oStatus := oMainLibrary.AddFile(sFilePath);

    // 処理が終わるまで待つ (?)
    while oStatus.InProgress do
    begin
      Application.ProcessMessages;
      Sleep(100);
    end;

    // 処理されたトラックが入ったコレクションが帰ってくる
    oTrackCollec := oStatus.Tracks;

    // コレクションに入っているトラックの数
    Label2.Caption := IntToStr(oTrackCollec.Count);
    // 順番にトラックのプロパティー、オプションを設定
    for i := 1 to oTrackCollec.Count do
    begin
      oTrack := oTrackCollec.Item[i];
      // より詳細な型へ変換
      oFileTrack := IITFileOrCDTrack( oTrack );

      oFileTrack.Set_Name( sName );
      oFileTrack.Set_Artist( sArtist );
      oFileTrack.Set_Album( sAlbum );
      oFileTrack.Set_Genre( sGenre );
      oFileTrack.Set_Year( StrToIntDef(Edit6.Text, CurrentYear) );
      
      {!! ここまではエラーなし}

      // 比較的最新の iTunes が必要
      // iTunes 5.0 and later (iTunes type library 1.5 and later).
      // なので バージョンチェック
      if not iTunesApp.CheckVersion( 1, 5 ) then
      begin
        ShowMessage( 'iTunes 5.0 以降が必要です' );
        Exit;
      end;
      
      {!! 最新のプロパティーにアクセスしようとするとエラー 'RPCRT4.dll' EAccessViolation }
      
      oFileTrack.Set_RememberBookmark( bRememberBookmark );
      oFileTrack.Set_ExcludeFromShuffle( bExcludeFromShuffle );
      
    end;

  finally
    Windows.Beep(3000, 100);
    // iTunes 終了
    iTunesApp.Quit;
  end;

end;


名前なし  2006-05-08 20:18:24  No: 21416

>  oFileTrack.Set_RememberBookmark( bRememberBookmark );
>  oFileTrack.Set_ExcludeFromShuffle( bExcludeFromShuffle );

   oFileTrack.RememberBookmark := bRememberBookmark;
   oFileTrack.ExcludeFromShuffle := bExcludeFromShuffle;
でもダメ?


Delphi第3世代  2006-05-09 01:36:05  No: 21417

>oFileTrack.RememberBookmark := bRememberBookmark;
>   oFileTrack.ExcludeFromShuffle := bExcludeFromShuffle;
>でもダメ?

やってみたところ、
[エラー] 読み込み専用プロパティに書き込むことはできません
となりコンパイルできませんでした。
IITFileOrCDTrack のコードをみてみると、↓のようになっていました。
  property RememberBookmark: WordBool read Get_RememberBookmark;
  procedure Set_RememberBookmark(RememberBookmark: WordBool); safecall;

---

改めて考えてみたら、
oFileTrack := IITFileOrCDTrack( oTrack );
に無理があるように感じます。

IITTrack から IITFileOrCDTrack に変換する正しい方法が、
あるような気がするのですが、調べても分かりませんでした。

他の言語の例をみたところ、型に関してゆるいので、
自動で判別してくれているみたいなのですが、
Delphi の場合、型を手動で設定しないといけないので.


Delphi第3世代  2006-05-09 02:16:31  No: 21418

oFileTrack := oTrack as IITFileOrCDTrack;

で、解決しました。


Delphi第3世代  2006-05-09 02:18:52  No: 21419

ついでに、気になっていることについて、聞いていいですか?
例えば、AddFileの場合、ヘルプファイルに、↓のように書かれているのですが、
 
//----------------------------
HRESULT IITLibraryPlaylist::AddFile  (  [in] BSTR  filePath,  
  [out, retval] IITOperationStatus **  iStatus 
 )   

Parameters:
 filePath  The full path to the file or folder to add.  
 iStatus  Returns an IITOperationStatus object corresponding to the asynchronous operation. If an error occurs, or no files were added, this will be set to NULL. 

Return values:
 S_OK  The operation was successful.  
 E_POINTER  filePath or iStatus is NULL.  
 E_INVALIDARG  filePath is empty or too long, or refers to a file that would require conversion.  
 ITUNES_E_OBJECTLOCKED  This playlist is read-only.  
 ITUNES_E_OBJECTDELETED  This playlist has been deleted.  
 E_FAIL  An unexpected error occurred.  
//----------------------------

この
Return values:
 S_OK
 E_POINTER
 E_INVALIDARG
 ..

を得るにはどうすればいいのでしょうか?
関数を実行して返してくるのは iStatus なので、
S_OK とかはどうやって得ればいいのでしょうか?


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加