やっぱり例外飛んで来るのか...

新しくVC++ 2010 Expressで作ったWindows用の再生履歴送信アプリ。

以前作ったC#版での反省を踏まえて例外処理を入れた。

よくあるパターンなのだが、iTunesで何かを聞いているときに、どれでもいいから曲のプロパティを見る(Macなら情報を見るに相当)。

MacでAppleScriptとかScripting Bridgeを使ったアプリケーションでiTunesにアクセスしている時には何も処理していなくても例外にはならないし、これらはパラレルに処理される。つまり、曲の情報を見ている裏で自作アプリがiTunesの再生履歴を取得することができる。

しかし、Windowsでは例外が飛んで来る。C#バージョンを作ったときは、プロパティ画面を開いた状態で、COMの処理が走ると「例外が発生しました」ダイアログが表示された。アプリが落ちることはなかったが、処理が継続しなかった。

もちろん、C#も例外処理はできるから、このためにC++に乗り換えたわけではなくて、興味本位でC++に開発環境を変えただけなので言語については直接の関係はない。

ただし、WindowsでiTunesにCOMでアクセスするときにどうもプロパティを開いていると例外になっているようなのだ。今回は、COMアクセスするところ(処理的にはアプリケーションオブジェクトの取得、プレイリストを取得してトラック情報を取得している)をtryブロックで囲んで、例外が飛んできたら処理を中断してその回の処理は行わないようにしている。

プログラム的にはリアルタイム監視ではなく5分に一度のタイマー起動のポーリングなので、同じ曲を続けて再生しない限りは一度や二度、処理が飛ばされても影響はない。履歴がサーバに反映されないだけだ。

ただ、なんとなく、気持ち悪いなぁ、というか、Mac版と違うというか、COMインタフェースの問題なのか、Last.fmのクライアントみたいなのはどんな処理してるのか?などなど興味は尽きない。

コメント