MP3を再生したり変換したり、といった機能を持つアプリケーションを作っているわけで、以前は
Delphi用のMP3再生VCLであるTMP3PLAYERを使っていたのだが、これが公開停止して暫く経っており、今後入手できる見込みもない。
そこで、今でもVectorにDLLが存在していて、それなりに入手の容易なVBMP3.DLLを用い、自前でMP3関連の
モジュールを作ることにした。VBMP3のDLLをDelphiから使用する方法については資料も多いし、全部の機能を使うわけでもないので、必要なものだけヘッダファイル的なものを作って使おうと思っていたのだが…
ちなみにVBMP3は以下で入手可能
従来どおりのヘッダファイルを書いていくと、たとえば
Char配列128
バイトとか、そういう記述によく当たる。
これを普通に
HogeHoge: Array[0..127] of Char;
と書くと、これはDelphi2007までは正しいのだが、Delphi2009からは正しくない。なぜなら、Delphi2009においてChar型とは、
Unicode一文字を格納する型であり、1バイトではないからだ。
よって、上記の宣言は、
HogeHoge: Array[0..127] of AnsiChar;
と書いてやらないといけない。また同様に、DLL呼び出し字にStringの
ポインタ渡しのため、PChar(HogeHoge)という書き方も間違いとなる。これは
- まず、Unicodeのストリング型であるHogeHogeをAnsiStringに変換する
- それをAnsiChar型に変換し、そのポインタを取得する
という必要があるので、従来
function hoge(pszFileName: PChar):Boolean;
:
if (hoge(PChar(strHuga))) then ...
みたいな定義と構文だったところを
function hoge(pszFileName: PAnsiChar):Boolean;
:
if (hoge(PAnsiChar(AnsiString(strHuga)))) then ...
と、明示的にAnsiString型を意識して定義および呼び出しをしてやらなくてはならない。
また、AnsiString型からString型への代入は、暗黙の型キャストとしてヒントが出る(問題はないけど)ので、これも消したかったら、String型へのキャストを明示してやる必要がある。
というわけで、内部的にはあまり意識しなくてもよかったUnicode関連だが、DLL呼び出しにおいて大きく嵌まった。Delphi2009を使用してかつ外部のDLLを利用する場合には要注意だ。
posted by Tig3r at 05:25|
Comment(0)
|
TrackBack(0)
|
Delphi