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;
> oFileTrack.Set_RememberBookmark( bRememberBookmark );
> oFileTrack.Set_ExcludeFromShuffle( bExcludeFromShuffle );
oFileTrack.RememberBookmark := bRememberBookmark;
oFileTrack.ExcludeFromShuffle := bExcludeFromShuffle;
でもダメ?
>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 の場合、型を手動で設定しないといけないので.
oFileTrack := oTrack as IITFileOrCDTrack;
で、解決しました。
ついでに、気になっていることについて、聞いていいですか?
例えば、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 とかはどうやって得ればいいのでしょうか?
ツイート | ![]() |