2008年12月07日

CompactFM テクニカルノート

CompactFM を作っている時に気付いた点などソフトウェア開発をする際に参考になりそうな情報を少しずつ記述していこうかと思います。
将来的には CompactFM のソースもオープンにする予定です。

今回は gogo.dll を利用して mp3 にエンコードする際の注意点と、WINAMP に付属する enc_aacplus.dll を利用して AAC+ する際のポイントなどについて書きます。

■gogo.dll を利用して mp3 にエンコードする際の注意点

gogo.dll は DLL の初期化時に現在の DLL の場所をレジストリの HKEY_CURRENT_USER\Software\MarineCat\GOGO_DLL に INSTPATH という名前で文字列を書き込みます。
これは本来午後のこ〜だをインストールしたあとで他のプログラムが DLL を利用するために使える便利なものですが、別な場所に gogo.dll がある場合は問題を引き起こす原因になります

午後のこ〜だをインストールし、午後のこ〜だの GUI などを一度起動する

レジストリに午後のこ〜だのインストール位置が記録される

他のプログラムが正常に gogo.dll を見つけ出し、呼び出せるようになる

他のプログラムに付属されていたなどの理由で別の場所に存在する gogo.dll を実行する

レジストリにその付属された gogo.dll のある場所が書き込まれる

他のプログラムが正常に gogo.dll を見つけ出し、呼び出せる
(ただし呼び出しているのは午後のこ〜だがインストールされた場所にある gogo.dll ではない)

これによって以下の問題が起こり得ると考えられます。

・意図しないタイミングで dll のバージョンが変わってしまうかも知れない
・ユーザが gogo.dll を付属したソフトのフォルダを移動、削除したりすると、その付属したソフトを起動するまで別のソフトが dll を見つけ出せなくなってしまうかも知れない

後者の問題は削除の場合、他のソフトが午後のこ〜だを見つけ出せなくなったことを理由に午後のこ〜だの再インストールを促す結果になってしまう可能性があります(実際には午後のこ〜だ付属の GUI を起動するだけでカレントディレクトリにファイルがあるのでレジストリは元に戻る)。
本来の位置以外にファイルを設置する場合は dllinst.c を編集し、レジストリキーを書き込まないようにしておくべきでしょう。


■enc_aacplus.dll を使うとき……

この DLL は C++ のクラスを使ったインターフェイスを提供しているため、Delphi 側で thiscall 規約で呼び出すようにしなければなりません。
この辺の仕組みに気付いていれば仲介 DLL などを作らずとも Delphi 側からダイレクトに DLL を呼ぶことができます。

Winamp を正常にインストールしている場合、HKEY_CURRENT_USER\Software\Winamp にはインストール先が登録されているはずです。
このデータを参照することで enc_aacplus.dll がある場所を推測することが可能になるため、DLL のコピーなどの作業を要求することなく DLL を使った処理が可能になります。

ただし、enc_aacplus.dll は nscrt.dll を必要とします。これはパスが通ったところに dll が存在すれば問題ありません。
逆にいうと環境変数を一時的に変更して Winamp のインストール先を登録したりすると enc_aacplus.dll を見つけられるようになります。
あるいはもっと簡単に、カレントディレクトリを一時的に変更するだけでも動きます。

これらを行い DLL を呼び出すようにしたサンプルコードはこちら
posted by oov at 19:01| Comment(0) | TrackBack(0) | プログラム | このブログの読者になる | 更新情報をチェックする
この記事へのコメント

この記事へのトラックバック
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。