2009年01月07日

Delphi2009でDLLを使用する場合、文字コードで嵌まる

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)という書き方も間違いとなる。これは
  1. まず、Unicodeのストリング型であるHogeHogeをAnsiStringに変換する
  2. それを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を利用する場合には要注意だ。

【Delphiの最新記事】
posted by Tig3r at 05:25| Comment(0) | TrackBack(0) | Delphi
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/25244724

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