ホーム >プログラム >Delphi 6 ローテクTips >Unicode版mp3infp.dllをDelphiから使う

mp3infp.dllのUnicode対応版をDelphi 6から使ってみようというページ。
値を取得したりプロパティページを呼び出したりするのは確認していますが、書き込み系は私は必要なかったのでコンバートしただけで試していません。
使う場合は注意してください。



どういういきさつなのか分かりませんが、現在はmp3infpの作者ではない方がUnicode対応版を作成していてWin32工作小屋 サポートBBSにアップしているようです。
Unicode版の方はBBSでダウンロードしたファイルを解凍してインストーラを起動してmp3infpをインストールしないとmp3infp.dllを取り出せないようです。
また解凍したフォルダの直下にインストーラがないのでインストールの仕方が分かりづらく戸惑ってしまいます。
インストーラは解凍したフォルダ中のsrc\installフォルダ中にあります。
mp3infp254h_u10.exeなどのバージョン番号つきの実行ファイルがインストーラなのでそれを起動させてインストールします。
インストールできたらWindowsのSystem32フォルダにmp3infp.dllがあるのでそれをコピーして使います。


mp3infp_GetValueWの使い方の例。
wmaのタイトルやアーティスト名などを取得する場合、多分こんな感じでいいんじゃないかと思います。

implementation
uses
  use_mp3infpW;


procedure TForm1.Button1Click(Sender: TObject);
var
  lp_Buff: PWideChar;
  ls_Str, ls_Title, ls_Artist, ls_Album: WideString;
begin
  if (OpenDialog1.Execute) then begin
    if (mp3infp_LoadW(Handle, PWideChar(WideString(OpenDialog1.FileName))) = ERROR_SUCCESS) then begin
      mp3infp_GetValueW('INAM', @lp_Buff); ls_Title  := WideString(lp_Buff); //タイトル
      mp3infp_GetValueW('IART', @lp_Buff); ls_Artist := WideString(lp_Buff); //アーティスト
      mp3infp_GetValueW('IPRD', @lp_Buff); ls_Album  := WideString(lp_Buff); //アルバム

      ls_Str := ls_Title + #13 + ls_Artist + #13 + ls_Album;
      MessageBoxW(Handle, PWideChar(ls_Str), '', MB_APPLMODAL or MB_SETFOREGROUND)
    end;
  end;
end;

この例ではOpenDialog1がUnicode対応のファイルダイアログではないのでUnicodeな文字を含んだファイル名のタグは取得できません。
Unicodeな文字を含まないファイル名であればタイトルやアーティスト名などのタグ中のUnicodeな文字は取得できます。
Unicode対応でないファイルダイアログのFileNameプロパティをmp3infp_LoadWに渡す場合、上記の例のようにOpenDialog1.FileNameをWideStringでキャストしてからPWideCharでキャストします。

Unicodeな文字を含んだファイル名のタグを取得したい場合はUnicode対応のファイルダイアログを利用するとかUnicode対応のドラッグアンドドロップを利用するとかしないとなりません。


unit use_mp3infpW;


interface
uses
  Windows;

const
  mp3infp = 'mp3infp.dll';

{
function mp3infp_GetVer: DWORD; stdcall';
function mp3infp_ViewPropEx(hWnd: HWND; const szFileName: PAnsiChar; dwPage: DWORD; modeless: BOOL; param1: DWORD; param2: DWORD): Integer; stdcall';
function mp3infp_ViewProp(hWnd: HWND; const szFileName: PAnsiChar; dwPage: DWORD): BOOL; stdcall;
function mp3infp_GetType: DWORD; stdcall;
function mp3infp_Load(hWnd: HWND; const szFileName: PAnsiChar): DWORD; stdcall;
function mp3infp_GetValue(const szValueName: PAnsiChar; buf: Pointer): BOOL; stdcall;
function mp3infp_mp3_GetTagType: DWORD; stdcall;
function mp3infp_SetConf(tag: PAnsiChar; value: PAnsiChar): BOOL; stdcall;
function mp3infp_SetValue      (const szValueName: PAnsiChar; const buf: PAnsiChar): DWORD; stdcall;
function mp3infp_Save          (const szFileName: PAnsiChar): DWORD; stdcall;
function mp3infp_mp3_MakeId3v1 (const szFileName: PAnsiChar): DWORD; stdcall;
function mp3infp_mp3_DelId3v1  (const szFileName: PAnsiChar): DWORD; stdcall;
function mp3infp_mp3_MakeId3v2 (const szFileName: PAnsiChar): DWORD; stdcall;
function mp3infp_mp3_DelId3v2  (const szFileName: PAnsiChar): DWORD; stdcall;
function mp3infp_mp3_MakeRMP   (const szFileName: PAnsiChar): DWORD; stdcall;
function mp3infp_mp3_DelRMP    (const szFileName: PAnsiChar): DWORD; stdcall;
function mp3infp_mp3_MakeApeTag(const szFileName: PAnsiChar): DWORD; stdcall;
function mp3infp_mp3_DelApeTag (const szFileName: PAnsiChar): DWORD; stdcall;
}

{=======================================================================================
名前:  mp3infp_GetVer
概要:  mp3infpのバージョンを取得する
引数:  なし
戻値:  DWORD  バージョン情報
        Ver.2.11  = 0x0211
備考:
対応:  Ver2.11〜
}

function mp3infp_GetVer: DWORD; stdcall external mp3infp;


{=======================================================================================
名前:  mp3infp_ViewPropEx
概要:  mp3infpに対応したファイル形式のプロパティを開く(モーダルダイアログ版)
説明:  指定ファイルのプロパティをmp3infpのタブをアクティブにして開きます
        ※シェルエクステンションを使用せずにmp3infp.dll単独の動作となります
        ※シェルエクステンション標準のプロパティページは表示されません
引数:
        IN HWND hWnd        呼び出し元ウインドウハンドル
                            呼び出し元ウインドウ上にダイアログを表示します
                            NULLならデスクトップを指定したとみなします
        IN char *szFileName  対象ファイル名をフルパスで指定。
        IN DWORD dwPage     ・mp3infpの何ページ目をアクティブにするか指定する(0=ID3v1 / 1=ID3v2 / 2=RiffSIF / 3=APE(Ver2.47))
                            ・タグを含まないmp3の場合のみ有効
                            ・タグを含む場合はID3v2/APE/RiffSIF/ID3v1の順で検索して、最初に見つかったタグをアクティブにします
        IN BOOL modeless    TRUEならプロパティを表示したまま制御を返します。戻り値にはプロパティのウインドウハンドルが入ります。
                            FALSEならプロパティを閉じるまで制御を返しません。
        DWORD param1        未使用(0を指定してください)
        DWORD param2        未使用(0を指定してください)

戻値:  int 成功=0以上/失敗=-1
対応:  Ver2.48〜
}

function mp3infp_ViewPropEx (hWnd: HWND; const szFileName: PAnsiChar; dwPage: DWORD; modeless: BOOL; param1: DWORD; param2: DWORD): Integer; stdcall external mp3infp;
function mp3infp_ViewPropExA(hWnd: HWND; const szFileName: PAnsiChar; dwPage: DWORD; modeless: BOOL; param1: DWORD; param2: DWORD): Integer; stdcall external mp3infp;
function mp3infp_ViewPropExW(hWnd: HWND; const szFileName: PWideChar; dwPage: DWORD; modeless: BOOL; param1: DWORD; param2: DWORD): Integer; stdcall external mp3infp;

{=======================================================================================
名前:  mp3infp_ViewProp
概要:  mp3infpに対応したファイル形式のプロパティを開く
説明:  指定ファイルのプロパティをmp3infpのタブをアクティブにして開きます
引数:
        IN HWND hWnd        呼び出し元ウインドウハンドル
        IN char *szFileName 対象ファイル名をフルパスで指定。
        IN DWORD dwPage     ・mp3infpの何ページ目をアクティブにするか指定する(0=ID3v1 / 1=ID3v2 / 2=RiffSIF / 3=APE(Ver2.47))
                            ・タグを含まないmp3の場合のみ有効
                            ・タグを含む場合はID3v2/APE/RiffSIF/ID3v1の順で検索して、最初に見つかったタグをアクティブにします

戻値:  BOOL 成功=TRUE/失敗=FALSE
対応:  Ver2.00〜
}

function mp3infp_ViewProp (hWnd: HWND; const szFileName: PAnsiChar; dwPage: DWORD): BOOL; stdcall external mp3infp;
function mp3infp_ViewPropA(hWnd: HWND; const szFileName: PAnsiChar; dwPage: DWORD): BOOL; stdcall external mp3infp;
function mp3infp_ViewPropW(hWnd: HWND; const szFileName: PWideChar; dwPage: DWORD): BOOL; stdcall external mp3infp;

{=======================================================================================
名前:  mp3infp_Load
概要:  タグ情報をロードする
引数:
        IN HWND hWnd        呼び出し元ウインドウを指定します。無い場合はNULL。
        IN const char *szFileName   対象ファイル名をフルパスで指定。
戻値:  DWORD
        -1=ロード失敗
        ERROR_SUCCESS=成功
        (その他)=Win32エラーコード (FormatMessageで文字列を取得できる)
対応:  Ver2.26〜
}

function mp3infp_Load (hWnd: HWND; const szFileName: PAnsiChar): DWORD; stdcall external mp3infp;
function mp3infp_LoadA(hWnd: HWND; const szFileName: PAnsiChar): DWORD; stdcall external mp3infp;
function mp3infp_LoadW(hWnd: HWND; const szFileName: PWideChar): DWORD; stdcall external mp3infp;

{
////////////////////////////////////////////////////////////////////
表1 mp3infp_GetValue()/mp3infp_SetValue()でszValueNameに指定する名前一覧
////////////////////////////////////////////////////////////////////

    [共通](※1)
    ファイル名              "FILE"  (v2.41〜)
    拡張子                  "FEXT"  (v2.41〜)
    パス                    "PATH"  (v2.41〜)
    サイズ(byte単位)        "SIZ1"  (v2.41〜)
    サイズ(Kbyte単位)       "SIZK"  (v2.41〜)
    サイズ(Mbyte単位)       "SIZM"  (v2.41〜)


    [MP3]                   ID3v1       ID3v2       RiffSIF     APE
    フォーマット(※1)       "AFMT"      "AFMT"      "AFMT"      "AFMT"
    演奏時間(※1)           "TIME"      "TIME"      "TIME"      "TIME"
    タイトル                "INAM_v1"   "INAM_v2"   "INAM_rmp"  "INAM_APE"
    アーティスト            "IART_v1"   "IART_v2"   "IART_rmp"  "IART_APE"
    アルバム                "IPRD_v1"   "IPRD_v2"   "IPRD_rmp"  "IPRD_APE"
    コメント                "ICMT_v1"   "ICMT_v2"   "ICMT_rmp"  "ICMT_APE"
    作成日                  "ICRD_v1"   "ICRD_v2"   "ICRD_rmp"  "ICRD_APE"
    ジャンル                "IGNR_v1"   "IGNR_v2"   "IGNR_rmp"  "IGNR_APE"
    (ID3v2/RiffSIF)
    著作権                              "ICOP_v2"   "ICOP_rmp"
    ソフトウェア/エンコーダ             "ISFT_v2"   "ISFT_rmp"
    (ID3v2)
    作曲                                "COMP_v2"
    Orig.アーティスト                   "OART_v2"
    URL                                 "URL_v2"
    エンコードした人                    "ENC2_v2"
    (RiffSIF)
    ソース                                          "ISRC_rmp"
    エンジニア                                      "IENG_rmp"
    (ID3v1/2)
    トラック番号            "TRACK_v1"  "TRACK_v2"              "TRACK_APE"

    [WAV]
    フォーマット(※1)       "AFMT"
    演奏時間(※1)           "TIME"
    タイトル(※2)           "INAM"
    タイトル(※2)           "ISBJ"
    アーティスト            "IART"
    アルバム                "IPRD"
    コメント                "ICMT"
    作成日                  "ICRD"
    ジャンル                "IGNR"
    著作権                  "ICOP"
    ソフトウェア            "ISFT"
    ソース                  "ISRC"
    エンジニア              "IENG"

    [AVI]
    音声フォーマット(※1)   "AFMT"
    映像フォーマット(※1)   "VFMT"
    時間(※1)               "TIME"
    タイトル(※2)           "INAM"
    タイトル(※2)           "ISBJ"
    アーティスト            "IART"
    コメント                "ICMT"
    作成日                  "ICRD"
    ジャンル                "IGNR"
    著作権                  "ICOP"
    ソフトウェア            "ISFT"
    ソース                  "ISRC"
    エンジニア              "IENG"
    AVIバージョン           "AVIV"    (v2.37〜)

    [VQF]
    フォーマット(※1)       "AFMT"
    演奏時間(※1)           "TIME"
    タイトル                "INAM"
    アーティスト            "IART"
    コメント                "ICMT"
    著作権                  "ICOP"
    保存名                  "FILE"

    [WMA]
    音声フォーマット(※1)   "AFMT"
    映像フォーマット(※1)   "VFMT"
    時間(※1)               "TIME"
    タイトル                "INAM"
    トラック                "TRACK"
    アーティスト            "IART"
    アルバム                "IPRD"
    コメント                "ICMT"
    作成日                  "ICRD"
    ジャンル                "IGNR"
    著作権                  "ICOP"
    URL(Album)              "URL1"
    URL(関連)               "URL2"

    [OGG]
    フォーマット(※1)       "AFMT"
    演奏時間(※1)           "TIME"
    タイトル                "INAM"
    アーティスト            "IART"
    アルバム                "IPRD"
    コメント                "ICMT"
    作成日                  "ICRD"
    ジャンル                "IGNR"
    トラック番号            "TRACK"

    [APE]
    フォーマット(※1)       "AFMT"
    演奏時間(※1)           "TIME"
    タイトル                "INAM"
    アーティスト            "IART"
    アルバム                "IPRD"
    コメント                "ICMT"
    作成日                  "ICRD"
    ジャンル                "IGNR"
    トラック番号            "TRACK"

    [MP4]    (v2.53〜)
    音声フォーマット(※1)   "AFMT"
    映像フォーマット(※1)   "VFMT"
    タイトル                "INAM"
    アーティスト            "IART"
    アルバム                "IPRD"
    グループ                "IGRP"
    作曲                    "COMPOSER"
    ジャンル                "IGNR"
    トラック番号1           "TRACK1"        (1以上の数値)
    トラック番号2           "TRACK2"        (1以上の数値)
    ディスク番号1           "DISC1"         (1以上の数値)
    ディスク番号2           "DISC2"         (1以上の数値)
    テンポ                  "BPM"           (数値)
    作成日                  "ICRD"          (4桁の数値 例:"2004")
    コンピレーション        "COMPILATION"   ("1" or "0")
    コメント                "ICMT"
    ツール                  "TOOL"


(※1)mp3infp_SetValue()では利用できません。
(※2)mp3infpではロード時にINAMを優先、無ければISBJを表示。セーブ時にはISBJを削除、INAMを保存します。
}


const
  MP3INFP_FILE_UNKNOWN = $00;
  MP3INFP_FILE_MP3     = $01;
  MP3INFP_FILE_WAV     = $02;
  MP3INFP_FILE_AVI     = $03;
  MP3INFP_FILE_VQF     = $04;
  MP3INFP_FILE_WMA     = $05;
  MP3INFP_FILE_OGG     = $07;
  MP3INFP_FILE_APE     = $08;
  MP3INFP_FILE_MP4     = $09;

{=======================================================================================
名前:  mp3infp_GetType
概要:  ファイルの種類を取得する
補足:  mp3infp_Load()の後に呼び出してください
引数:  なし
戻値:  DWORD

#define MP3INFP_FILE_UNKNOWN  0x00
#define MP3INFP_FILE_MP3      0x01
#define MP3INFP_FILE_WAV      0x02
#define MP3INFP_FILE_AVI      0x03
#define MP3INFP_FILE_VQF      0x04
#define MP3INFP_FILE_WMA      0x05
#define MP3INFP_FILE_OGG      0x07
#define MP3INFP_FILE_APE      0x08
対応:  Ver2.26〜
#define MP3INFP_FILE_MP4      0x09
対応:  Ver2.53〜
}

function mp3infp_GetType: DWORD; stdcall external mp3infp;


{=======================================================================================
名前:  mp3infp_GetValue
概要:  タグ情報を取得する
補足:  mp3infp_Load()の後に呼び出してください
引数:
        IN const char *szValueName    タグの種類を示す名前(表1を参照)
        OUT char **buf                タグ情報を示すバッファのポインタを受け取るポインタ
戻値:  BOOL 成功=TRUE/失敗=FALSE
対応:  Ver2.26〜
}


function mp3infp_GetValue (const szValueName: PAnsiChar; buf: PPAnsiChar): BOOL; stdcall external mp3infp;
function mp3infp_GetValueA(const szValueName: PAnsiChar; buf: PPAnsiChar): BOOL; stdcall external mp3infp;
function mp3infp_GetValueW(const szValueName: PWideChar; buf: PPWideChar): BOOL; stdcall external mp3infp;

const
  MP3INFP_HAS_MP3_ID3V1   = $00000001;
  MP3INFP_HAS_MP3_ID3V2   = $00000002;
  MP3INFP_HAS_MP3_RIFFSIF = $00000004;
  MP3INFP_HAS_MP3_ID3V1_0 = $00000008;  // v2.43〜
  MP3INFP_HAS_MP3_ID3V1_1 = $00000010;  // v2.43〜
  MP3INFP_HAS_MP3_ID3V2_2 = $00000020;  // v2.43〜
  MP3INFP_HAS_MP3_ID3V2_3 = $00000040;  // v2.43〜
  MP3INFP_HAS_MP3_ID3V2_4 = $00000080;  // v2.43〜
  MP3INFP_HAS_MP3_APEV1   = $00000100;  // v2.47〜
  MP3INFP_HAS_MP3_APEV2   = $00000200;  // v2.47〜


{=======================================================================================
名前:  mp3infp_mp3_GetTagType
概要:  mp3が持っているタグの種類を取得する
補足:  mp3infp_Load()の後に呼び出してください
引数:  なし
戻値:  DWORD (OR)
#define MP3INFP_HAS_MP3_ID3V1      0x00000001
#define MP3INFP_HAS_MP3_ID3V2      0x00000002
#define MP3INFP_HAS_MP3_RIFFSIF    0x00000004
#define MP3INFP_HAS_MP3_ID3V1_0    0x00000008  // v2.43〜
#define MP3INFP_HAS_MP3_ID3V1_1    0x00000010  // v2.43〜
#define MP3INFP_HAS_MP3_ID3V2_2    0x00000020  // v2.43〜
#define MP3INFP_HAS_MP3_ID3V2_3    0x00000040  // v2.43〜
#define MP3INFP_HAS_MP3_ID3V2_4    0x00000080  // v2.43〜
#define MP3INFP_HAS_MP3_APEV1      0x00000100  // v2.47〜
#define MP3INFP_HAS_MP3_APEV2      0x00000200  // v2.47〜
対応:  Ver2.27〜
}

function mp3infp_mp3_GetTagType: DWORD; stdcall external mp3infp;


{=======================================================================================
名前:  mp3infp_SetConf
概要:  mp3infpの動作設定
引数:  IN char *tag      設定項目(表2参照)
        IN char *val      設定値(表2参照)
戻値:  BOOL 成功=TRUE/失敗=FALSE
対応:  Ver2.42〜
補足:  ・他のプロセスのmp3infp.dll/シェル拡張のmp3infpには影響しない
        ・設定内容は保存されない
}

function mp3infp_SetConf(tag: PAnsiChar; value: PAnsiChar): BOOL; stdcall external mp3infp;


{=======================================================================================
////////////////////////////////////////////////////////////////////
mp3infp_SetConf()指定する設定項目・値一覧
////////////////////////////////////////////////////////////////////

    [Waveファイルのコーデック名称の取得方法](Ver2.42〜)
    (項目名)
    "wave_CodecFind"
    (値)
    "0"(default)    mp3infp内蔵辞書 → Windows APIを利用の順で検索(高速)
    "1"             Windows APIを利用 → 自力解析の順で検索(低速)
    "2"             mp3infp内蔵辞書(高速)
    "3"             Windows APIを利用(低速)

    [Aviファイルのコーデック名称の取得方法](Ver2.42〜)
    (項目名)
    "avi_CodecFind"
    (値)
    "0"(default)    mp3infp内蔵辞書 → Windows APIを利用の順で検索(高速)
    "1"             Windows APIを利用 → 自力解析の順で検索(低速)
    "2"             mp3infp内蔵辞書(高速)
    "3"             Windows APIを利用(低速)

    [ID3v1で拡張ジャンルを使用する](Ver2.43〜)
    (項目名)
    "mp3_UseExtGenre"
    (値)
    "0"(default)    無効
    "1"             有効

    [ID3v2で文字列をUnicodeで書き込む](Ver2.43〜)
    (項目名)
    "mp3_ID3v2Unicode"
    (値)
    "0"(default)    無効
    "1"             有効

    [ID3v2を非同期化する](Ver2.43〜)
    (項目名)
    "mp3_ID3v2Unsync"
    (値)
    "0"             無効
    "1"(default)    有効

    [保存時のID3v2バージョン](Ver2.43〜)
    ※この設定値はmp3infp_Load()の実行によって上書きされます。
    (項目名)
    "mp3_SaveID3v2Version"
    (値)
    "2.2"           ID3v2.2
    "2.3"(default)  ID3v2.3
    "2.4"           ID3v2.4
}


{=======================================================================================
名前:  mp3infp_SetValue
概要:  タグ情報を設定する
補足:  mp3infp_Load()の後に呼び出してください
引数:
        IN const char *szValueName    タグの種類を示す名前(表1を参照)
        IN const char *buf            タグ情報を示す文字列
戻値:  DWORD
        -1=失敗
        ERROR_SUCCESS=成功
対応:  Ver.2.43〜
}

function mp3infp_SetValue (const szValueName: PAnsiChar; const buf: PAnsiChar): DWORD; stdcall external mp3infp;
function mp3infp_SetValueA(const szValueName: PAnsiChar; const buf: PAnsiChar): DWORD; stdcall external mp3infp;
function mp3infp_SetValueW(const szValueName: PWideChar; const buf: PWideChar): DWORD; stdcall external mp3infp;

{=======================================================================================
名前:  mp3infp_Save
概要:  タグ情報を保存する
補足:  mp3infp_Load()の後に呼び出してください
引数:  IN const char *szFileName    対象ファイル名をフルパスで指定。
戻値:  DWORD
        -1=失敗
        -2=2Gバイトを超えるファイルを扱うことはできません。(WAVファイルのみ)
        ERROR_SUCCESS=成功
        (その他)=Win32エラーコード (FormatMessageで文字列を取得できる)
対応:  Ver.2.43〜
}

function mp3infp_Save (const szFileName: PAnsiChar): DWORD; stdcall external mp3infp;
function mp3infp_SaveA(const szFileName: PAnsiChar): DWORD; stdcall external mp3infp;
function mp3infp_SaveW(const szFileName: PWideChar): DWORD; stdcall external mp3infp;

{=======================================================================================
名前:  mp3infp_mp3_MakeId3v1
概要:  ID3TAG V1を作成する
補足:  mp3infp_Load()の後に呼び出してください
        変更は直ちに反映されます
        mp3ファイルにのみ利用してください(wavファイルは対象外)
引数:  IN char *szFileName    対象ファイル名をフルパスで指定。
戻値:  DWORD
        -1=失敗
        ERROR_SUCCESS=成功
        (その他)=Win32エラーコード (FormatMessageで文字列を取得できる)
対応:  Ver.2.43〜
}

function mp3infp_mp3_MakeId3v1 (const szFileName: PAnsiChar): DWORD; stdcall external mp3infp;
function mp3infp_mp3_MakeId3v1A(const szFileName: PAnsiChar): DWORD; stdcall external mp3infp;
function mp3infp_mp3_MakeId3v1W(const szFileName: PWideChar): DWORD; stdcall external mp3infp;

{=======================================================================================
名前:  mp3infp_mp3_DelId3v1
概要:  ID3TAG V1を削除する
補足:  mp3infp_Load()の後に呼び出してください
        変更は直ちに反映されます
        mp3ファイルにのみ利用してください(wavファイルは対象外)
引数:  IN char *szFileName    対象ファイル名をフルパスで指定。
戻値:  DWORD
        -1=失敗
        ERROR_SUCCESS=成功
        (その他)=Win32エラーコード (FormatMessageで文字列を取得できる)
対応:  Ver.2.43〜
}

function mp3infp_mp3_DelId3v1 (const szFileName: PAnsiChar): DWORD; stdcall external mp3infp;
function mp3infp_mp3_DelId3v1A(const szFileName: PAnsiChar): DWORD; stdcall external mp3infp;
function mp3infp_mp3_DelId3v1W(const szFileName: PWideChar): DWORD; stdcall external mp3infp;

{=======================================================================================
名前:  mp3infp_mp3_MakeId3v2
概要:  ID3TAG V2を作成する
補足:  mp3infp_Load()の後に呼び出してください
        変更は直ちに反映されます
        mp3ファイルにのみ利用してください(wavファイルは対象外)
引数:  IN char *szFileName    対象ファイル名をフルパスで指定。
戻値:  DWORD
        -1=失敗
        ERROR_SUCCESS=成功
        (その他)=Win32エラーコード (FormatMessageで文字列を取得できる)
対応:  Ver.2.43〜
}

function mp3infp_mp3_MakeId3v2 (const szFileName: PAnsiChar): DWORD; stdcall external mp3infp;
function mp3infp_mp3_MakeId3v2A(const szFileName: PAnsiChar): DWORD; stdcall external mp3infp;
function mp3infp_mp3_MakeId3v2W(const szFileName: PWideChar): DWORD; stdcall external mp3infp;

{=======================================================================================
名前:  mp3infp_mp3_DelId3v2
概要:  ID3TAG V2を削除する
補足:  mp3infp_Load()の後に呼び出してください
        変更は直ちに反映されます
        mp3ファイルにのみ利用してください(wavファイルは対象外)
引数:  IN char *szFileName    対象ファイル名をフルパスで指定。
戻値:  DWORD
        -1=失敗
        ERROR_SUCCESS=成功
        (その他)=Win32エラーコード (FormatMessageで文字列を取得できる)
対応:  Ver.2.43〜
}

function mp3infp_mp3_DelId3v2 (const szFileName: PAnsiChar): DWORD; stdcall external mp3infp;
function mp3infp_mp3_DelId3v2A(const szFileName: PAnsiChar): DWORD; stdcall external mp3infp;
function mp3infp_mp3_DelId3v2W(const szFileName: PWideChar): DWORD; stdcall external mp3infp;

{=======================================================================================
名前:  mp3infp_mp3_MakeRMP
概要:  mp3形式からRMP形式に変換する
補足:  mp3infp_Load()の後に呼び出してください
        変更は直ちに反映されます
        mp3ファイルにのみ利用してください(wavファイルは対象外)
引数:  IN char *szFileName    対象ファイル名をフルパスで指定。
戻値:  DWORD
        -1=失敗
        ERROR_SUCCESS=成功
        (その他)=Win32エラーコード (FormatMessageで文字列を取得できる)
対応:  Ver.2.43〜
}

function mp3infp_mp3_MakeRMP (const szFileName: PAnsiChar): DWORD; stdcall external mp3infp;
function mp3infp_mp3_MakeRMPA(const szFileName: PAnsiChar): DWORD; stdcall external mp3infp;
function mp3infp_mp3_MakeRMPW(const szFileName: PWideChar): DWORD; stdcall external mp3infp;

{=======================================================================================
名前:  mp3infp_mp3_DelRMP
概要:  RMP形式からmp3形式に変換する
補足:  mp3infp_Load()の後に呼び出してください
        変更は直ちに反映されます
        mp3ファイルにのみ利用してください(wavファイルは対象外)
引数:  IN char *szFileName    対象ファイル名をフルパスで指定。
戻値:  DWORD
        -1=失敗
        ERROR_SUCCESS=成功
        (その他)=Win32エラーコード (FormatMessageで文字列を取得できる)
対応:  Ver.2.43〜
}

function mp3infp_mp3_DelRMP (const szFileName: PAnsiChar): DWORD; stdcall external mp3infp;
function mp3infp_mp3_DelRMPA(const szFileName: PAnsiChar): DWORD; stdcall external mp3infp;
function mp3infp_mp3_DelRMPW(const szFileName: PWideChar): DWORD; stdcall external mp3infp;

{=======================================================================================
名前:  mp3infp_mp3_MakeApeTag
概要:  APE Tagを作成する
補足:  mp3infp_Load()の後に呼び出してください
        変更は直ちに反映されます
        mp3ファイルにのみ利用してください(wavファイルは対象外)
引数:  IN char *szFileName    対象ファイル名をフルパスで指定。
戻値:  DWORD
        -1=失敗
        ERROR_SUCCESS=成功
        (その他)=Win32エラーコード (FormatMessageで文字列を取得できる)
対応:  Ver.2.47〜
}

function mp3infp_mp3_MakeApeTag (const szFileName: PAnsiChar): DWORD; stdcall external mp3infp;
function mp3infp_mp3_MakeApeTagA(const szFileName: PAnsiChar): DWORD; stdcall external mp3infp;
function mp3infp_mp3_MakeApeTagW(const szFileName: PWideChar): DWORD; stdcall external mp3infp;

{=======================================================================================
名前:  mp3infp_mp3_DelApeTag
概要:  APE Tagを削除する
補足:  mp3infp_Load()の後に呼び出してください
        変更は直ちに反映されます
        mp3ファイルにのみ利用してください(wavファイルは対象外)
引数:  IN char *szFileName    対象ファイル名をフルパスで指定。
戻値:  DWORD
        -1=失敗
        ERROR_SUCCESS=成功
        (その他)=Win32エラーコード (FormatMessageで文字列を取得できる)
対応:  Ver.2.47〜
}

function mp3infp_mp3_DelApeTag (const szFileName: PAnsiChar): DWORD; stdcall external mp3infp;
function mp3infp_mp3_DelApeTagA(const szFileName: PAnsiChar): DWORD; stdcall external mp3infp;
function mp3infp_mp3_DelApeTagW(const szFileName: PWideChar): DWORD; stdcall external mp3infp;


implementation


end.

最近WindowsのDLL読み込みの脆弱性が問題になっていますね。
これはまぁ要するに読み込むDLLをフルパスで指定してしまうというのが一番確実な解決策なのであろう思います。
ということで、実行プログラムのフォルダにあるmp3infp.dllからのみ動的に読み込むようにしてみました。

unit use_mp3infpU;
//実行プログラムのフォルダにあるmp3infp.dllのみを動的に読み込むユニット。

{$DEFINE UNICODE}


interface
uses
  Windows;

const
  MP3INFP_FILE_UNKNOWN = $00;
  MP3INFP_FILE_MP3     = $01;
  MP3INFP_FILE_WAV     = $02;
  MP3INFP_FILE_AVI     = $03;
  MP3INFP_FILE_VQF     = $04;
  MP3INFP_FILE_WMA     = $05;
  MP3INFP_FILE_OGG     = $07;
  MP3INFP_FILE_APE     = $08;
  MP3INFP_FILE_MP4     = $09;

const
  MP3INFP_HAS_MP3_ID3V1   = $00000001;
  MP3INFP_HAS_MP3_ID3V2   = $00000002;
  MP3INFP_HAS_MP3_RIFFSIF = $00000004;
  MP3INFP_HAS_MP3_ID3V1_0 = $00000008;  // v2.43〜
  MP3INFP_HAS_MP3_ID3V1_1 = $00000010;  // v2.43〜
  MP3INFP_HAS_MP3_ID3V2_2 = $00000020;  // v2.43〜
  MP3INFP_HAS_MP3_ID3V2_3 = $00000040;  // v2.43〜
  MP3INFP_HAS_MP3_ID3V2_4 = $00000080;  // v2.43〜
  MP3INFP_HAS_MP3_APEV1   = $00000100;  // v2.47〜
  MP3INFP_HAS_MP3_APEV2   = $00000200;  // v2.47〜


type
  Tmp3infp_GetVer         = function: DWORD; stdcall;
  Tmp3infp_GetType        = function: DWORD; stdcall;
  Tmp3infp_mp3_GetTagType = function: DWORD; stdcall;

  Tmp3infp_ViewPropExA     = function(hWnd: HWND; const szFileName: PAnsiChar; dwPage: DWORD; modeless: BOOL; param1: DWORD; param2: DWORD): Integer; stdcall;
  Tmp3infp_ViewPropA       = function(hWnd: HWND; const szFileName: PAnsiChar; dwPage: DWORD): BOOL; stdcall;
  Tmp3infp_LoadA           = function(hWnd: HWND; const szFileName: PAnsiChar): DWORD; stdcall;
  Tmp3infp_GetValueA       = function(const szValueName: PAnsiChar; buf: PPAnsiChar): BOOL; stdcall;
  Tmp3infp_SetConfA        = function(tag: PAnsiChar; val: PAnsiChar): BOOL; stdcall;
  Tmp3infp_SetValueA       = function(const szValueName: PAnsiChar; const buf: PAnsiChar): DWORD; stdcall;
  Tmp3infp_SaveA           = function(const szFileName: PAnsiChar): DWORD; stdcall;
  Tmp3infp_mp3_MakeId3v1A  = function(const szFileName: PAnsiChar): DWORD; stdcall;
  Tmp3infp_mp3_DelId3v1A   = function(const szFileName: PAnsiChar): DWORD; stdcall;
  Tmp3infp_mp3_MakeId3v2A  = function(const szFileName: PAnsiChar): DWORD; stdcall;
  Tmp3infp_mp3_DelId3v2A   = function(const szFileName: PAnsiChar): DWORD; stdcall;
  Tmp3infp_mp3_MakeRMPA    = function(const szFileName: PAnsiChar): DWORD; stdcall;
  Tmp3infp_mp3_DelRMPA     = function(const szFileName: PAnsiChar): DWORD; stdcall;
  Tmp3infp_mp3_MakeApeTagA = function(const szFileName: PAnsiChar): DWORD; stdcall;
  Tmp3infp_mp3_DelApeTagA  = function(const szFileName: PAnsiChar): DWORD; stdcall;

  Tmp3infp_ViewPropExW     = function(hWnd: HWND; const szFileName: PWideChar; dwPage: DWORD; modeless: BOOL; param1: DWORD; param2: DWORD): Integer; stdcall;
  Tmp3infp_ViewPropW       = function(hWnd: HWND; const szFileName: PWideChar; dwPage: DWORD): BOOL; stdcall;
  Tmp3infp_LoadW           = function(hWnd: HWND; const szFileName: PWideChar): DWORD; stdcall;
  Tmp3infp_GetValueW       = function(const szValueName: PWideChar; buf: PPWideChar): BOOL; stdcall;
  Tmp3infp_SetConfW        = function(tag: PWideChar; val: PWideChar): BOOL; stdcall;
  Tmp3infp_SetValueW       = function(const szValueName: PWideChar; const buf: PWideChar): DWORD; stdcall;
  Tmp3infp_SaveW           = function(const szFileName: PWideChar): DWORD; stdcall;
  Tmp3infp_mp3_MakeId3v1W  = function(const szFileName: PWideChar): DWORD; stdcall;
  Tmp3infp_mp3_DelId3v1W   = function(const szFileName: PWideChar): DWORD; stdcall;
  Tmp3infp_mp3_MakeId3v2W  = function(const szFileName: PWideChar): DWORD; stdcall;
  Tmp3infp_mp3_DelId3v2W   = function(const szFileName: PWideChar): DWORD; stdcall;
  Tmp3infp_mp3_MakeRMPW    = function(const szFileName: PWideChar): DWORD; stdcall;
  Tmp3infp_mp3_DelRMPW     = function(const szFileName: PWideChar): DWORD; stdcall;
  Tmp3infp_mp3_MakeApeTagW = function(const szFileName: PWideChar): DWORD; stdcall;
  Tmp3infp_mp3_DelApeTagW  = function(const szFileName: PWideChar): DWORD; stdcall;
var
  mp3infp_GetVer:         Tmp3infp_GetVer;
  mp3infp_GetType:        Tmp3infp_GetType;
  mp3infp_mp3_GetTagType: Tmp3infp_mp3_GetTagType;

  //Ansi版
  mp3infp_ViewPropExA:     Tmp3infp_ViewPropExA;
  mp3infp_ViewPropA:       Tmp3infp_ViewPropA;
  mp3infp_LoadA:           Tmp3infp_LoadA;
  mp3infp_GetValueA:       Tmp3infp_GetValueA;
  mp3infp_SetConfA:        Tmp3infp_SetConfA;
  mp3infp_SetValueA:       Tmp3infp_SetValueA;
  mp3infp_SaveA:           Tmp3infp_SaveA;
  mp3infp_mp3_MakeId3v1A:  Tmp3infp_mp3_MakeId3v1A;
  mp3infp_mp3_DelId3v1A:   Tmp3infp_mp3_DelId3v1A;
  mp3infp_mp3_MakeId3v2A:  Tmp3infp_mp3_MakeId3v2A;
  mp3infp_mp3_DelId3v2A:   Tmp3infp_mp3_DelId3v2A;
  mp3infp_mp3_MakeRMPA:    Tmp3infp_mp3_MakeRMPA;
  mp3infp_mp3_DelRMPA:     Tmp3infp_mp3_DelRMPA;
  mp3infp_mp3_MakeApeTagA: Tmp3infp_mp3_MakeApeTagA;
  mp3infp_mp3_DelApeTagA:  Tmp3infp_mp3_DelApeTagA;

  //Unicode版
  mp3infp_ViewPropExW:     Tmp3infp_ViewPropExW;
  mp3infp_ViewPropW:       Tmp3infp_ViewPropW;
  mp3infp_LoadW:           Tmp3infp_LoadW;
  mp3infp_GetValueW:       Tmp3infp_GetValueW;
  mp3infp_SetConfW:        Tmp3infp_SetConfW;
  mp3infp_SetValueW:       Tmp3infp_SetValueW;
  mp3infp_SaveW:           Tmp3infp_SaveW;
  mp3infp_mp3_MakeId3v1W:  Tmp3infp_mp3_MakeId3v1W;
  mp3infp_mp3_DelId3v1W:   Tmp3infp_mp3_DelId3v1W;
  mp3infp_mp3_MakeId3v2W:  Tmp3infp_mp3_MakeId3v2W;
  mp3infp_mp3_DelId3v2W:   Tmp3infp_mp3_DelId3v2W;
  mp3infp_mp3_MakeRMPW:    Tmp3infp_mp3_MakeRMPW;
  mp3infp_mp3_DelRMPW:     Tmp3infp_mp3_DelRMPW;
  mp3infp_mp3_MakeApeTagW: Tmp3infp_mp3_MakeApeTagW;
  mp3infp_mp3_DelApeTagW:  Tmp3infp_mp3_DelApeTagW;

  {$IFDEF UNICODE}
    mp3infp_ViewPropEx:     Tmp3infp_ViewPropExW;
    mp3infp_ViewProp:       Tmp3infp_ViewPropW;
    mp3infp_Load:           Tmp3infp_LoadW;
    mp3infp_GetValue:       Tmp3infp_GetValueW;
    mp3infp_SetConf:        Tmp3infp_SetConfW;
    mp3infp_SetValue:       Tmp3infp_SetValueW;
    mp3infp_Save:           Tmp3infp_SaveW;
    mp3infp_mp3_MakeId3v1:  Tmp3infp_mp3_MakeId3v1W;
    mp3infp_mp3_DelId3v1:   Tmp3infp_mp3_DelId3v1W;
    mp3infp_mp3_MakeId3v2:  Tmp3infp_mp3_MakeId3v2W;
    mp3infp_mp3_DelId3v2:   Tmp3infp_mp3_DelId3v2W;
    mp3infp_mp3_MakeRMP:    Tmp3infp_mp3_MakeRMPW;
    mp3infp_mp3_DelRMP:     Tmp3infp_mp3_DelRMPW;
    mp3infp_mp3_MakeApeTag: Tmp3infp_mp3_MakeApeTagW;
    mp3infp_mp3_DelApeTag:  Tmp3infp_mp3_DelApeTagW;
  {$ELSE}
    mp3infp_ViewPropEx:     Tmp3infp_ViewPropExA;
    mp3infp_ViewProp:       Tmp3infp_ViewPropA;
    mp3infp_Load:           Tmp3infp_LoadA;
    mp3infp_GetValue:       Tmp3infp_GetValueA;
    mp3infp_SetConf:        Tmp3infp_SetConfA;
    mp3infp_SetValue:       Tmp3infp_SetValueA;
    mp3infp_Save:           Tmp3infp_SaveA;
    mp3infp_mp3_MakeId3v1:  Tmp3infp_mp3_MakeId3v1A;
    mp3infp_mp3_DelId3v1:   Tmp3infp_mp3_DelId3v1A;
    mp3infp_mp3_MakeId3v2:  Tmp3infp_mp3_MakeId3v2A;
    mp3infp_mp3_DelId3v2:   Tmp3infp_mp3_DelId3v2A;
    mp3infp_mp3_MakeRMP:    Tmp3infp_mp3_MakeRMPA;
    mp3infp_mp3_DelRMP:     Tmp3infp_mp3_DelRMPA;
    mp3infp_mp3_MakeApeTag: Tmp3infp_mp3_MakeApeTagA;
    mp3infp_mp3_DelApeTag:  Tmp3infp_mp3_DelApeTagA;
  {$ENDIF}

implementation
uses
  Forms,
  PsAPI,
  ShellAPI,
  SysUtils;


//以下のルーチンは読み込むmp3infp.dllをフルパスで指定するために実行ファイルのパス名
//名を取得するために必要。
function gfnsExeNameGet(sStr: WideString): WideString; overload;
var
  li_Count: Integer;
  lpp_Arg, lpp_Param: PPWideChar;
begin
  Result := '';
  if (sStr <> '') then begin
    lpp_Param := CommandLineToArgvW(PWideChar(sStr), li_Count);
    try
      lpp_Arg := lpp_Param;
      Result  := WideString(lpp_Arg^); //実行ファイル名
    finally
      LocalFree(Cardinal(lpp_Param));
    end;
  end;
end;

function gfnsExeNameGet: WideString; overload;
//WideString対応の実行プログラム名を返す。
  function lfni_ProcessIDGet(hHandle: HWND): DWORD;
  begin
    GetWindowThreadProcessId(hHandle, @Result);
  end;
  function lfns_ExeNameGet(hHandle: HWND): WideString;
  //ウィンドウハンドルからexeファイル名を返す
  //http://m--takahashi.com/bbs/pastlog/02500/02414.html
  //http://www.geocities.jp/fjtkt/problems/2003_0004.html
  var
    lh_Process: THandle;
    ls_PWExe:   PWideChar;
  begin
    Result := '';
    lh_Process := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, lfni_ProcessIDGet(hHandle));
    try
      ls_PWExe := AllocMem((MAX_PATH + 1) * 2);
      try
        //プロセスハンドルを渡すだけで実行ファイル名を得られた。インスタンスハンドルはいらないようだ。
        if (GetModuleFileNameExW(lh_Process, 0, ls_PWExe, MAX_PATH) <> 0) then begin
          Result := WideString(ls_PWExe);
        end;
      finally
        FreeMem(ls_PWExe);
      end;
    finally
      CloseHandle(lh_Process);
    end;
  end;
var
  lh_Handle: HWND;
begin
  lh_Handle := Application.Handle;
  if (lh_Handle <> 0) then begin
    Result := lfns_ExeNameGet(lh_Handle);
  end;
  if (Result = '') then begin
    Result := gfnsExeNameGet(GetCommandLineW);
  end;
end;

function gfnsFilePathGet(sFile: WideString): WideString;
{
Unicode対応ExtractFilePath。
ドライブ名も含む。
末尾の'\'はつく。
ドライブ名のみの場合も'\'はつく。
ただしパスが空文字の場合のみ'\'はつかない。
}

var
  i: Integer;
begin
  Result := '';
  if (sFile <> '') then begin
    for i := Length(sFile) downto 1 do begin
      if (sFile[i] = '\') or (sFile[i] = '/') then begin
        Result := Copy(sFile, 1, i);
        Break;
      end else if (sFile[i] = ':') then begin
        Result := Copy(sFile, 1, i) + '\';
        Break;
      end;
    end;
  end;
end;

function gfnsExePathGet: WideString;
begin
  Result := gfnsFilePathGet(gfnsExeNameGet);
end;


//------------------------------------------------------------------------------
var
  LhModuleHandle: HMODULE;

procedure lpcInitFunc;
var
  ls_Path: WideString;
begin
  //実行プログラムのフォルダ。
  ls_Path := gfnsExePathGet;
  //実行プログラムのフォルダにあるmp3infp.dllのみ有効。
  LhModuleHandle := LoadLibraryW(PWideChar(ls_Path + 'mp3infp.dll'));
  if (LhModuleHandle <> 0) then begin
    mp3infp_GetVer         := GetProcAddress(LhModuleHandle, 'mp3infp_GetVer');
    mp3infp_GetType        := GetProcAddress(LhModuleHandle, 'mp3infp_GetType');
    mp3infp_mp3_GetTagType := GetProcAddress(LhModuleHandle, 'mp3infp_mp3_GetTagType');

    //Ansi版
    mp3infp_ViewPropExA     := GetProcAddress(LhModuleHandle, 'mp3infp_ViewPropExA');
    mp3infp_ViewPropA       := GetProcAddress(LhModuleHandle, 'mp3infp_ViewPropA');
    mp3infp_LoadA           := GetProcAddress(LhModuleHandle, 'mp3infp_LoadA');
    mp3infp_GetValueA       := GetProcAddress(LhModuleHandle, 'mp3infp_GetValueA');
    mp3infp_SetConfA        := GetProcAddress(LhModuleHandle, 'mp3infp_SetConfA');
    mp3infp_SetValueA       := GetProcAddress(LhModuleHandle, 'mp3infp_SetValueA');
    mp3infp_SaveA           := GetProcAddress(LhModuleHandle, 'mp3infp_SaveA');
    mp3infp_mp3_MakeId3v1A  := GetProcAddress(LhModuleHandle, 'mp3infp_mp3_MakeId3v1A');
    mp3infp_mp3_DelId3v1A   := GetProcAddress(LhModuleHandle, 'mp3infp_mp3_DelId3v1A');
    mp3infp_mp3_MakeId3v2A  := GetProcAddress(LhModuleHandle, 'mp3infp_mp3_MakeId3v2A');
    mp3infp_mp3_DelId3v2A   := GetProcAddress(LhModuleHandle, 'mp3infp_mp3_DelId3v2A');
    mp3infp_mp3_MakeRMPA    := GetProcAddress(LhModuleHandle, 'mp3infp_mp3_MakeRMPA');
    mp3infp_mp3_DelRMPA     := GetProcAddress(LhModuleHandle, 'mp3infp_mp3_DelRMPA');
    mp3infp_mp3_MakeApeTagA := GetProcAddress(LhModuleHandle, 'mp3infp_mp3_MakeApeTagA');
    mp3infp_mp3_DelApeTagA  := GetProcAddress(LhModuleHandle, 'mp3infp_mp3_DelApeTagA');

    //Unicode版
    mp3infp_ViewPropExW     := GetProcAddress(LhModuleHandle, 'mp3infp_ViewPropExW');
    mp3infp_ViewPropW       := GetProcAddress(LhModuleHandle, 'mp3infp_ViewPropW');
    mp3infp_LoadW           := GetProcAddress(LhModuleHandle, 'mp3infp_LoadW');
    mp3infp_GetValueW       := GetProcAddress(LhModuleHandle, 'mp3infp_GetValueW');
    mp3infp_SetConfW        := GetProcAddress(LhModuleHandle, 'mp3infp_SetConfW');
    mp3infp_SetValueW       := GetProcAddress(LhModuleHandle, 'mp3infp_SetValueW');
    mp3infp_SaveW           := GetProcAddress(LhModuleHandle, 'mp3infp_SaveW');
    mp3infp_mp3_MakeId3v1W  := GetProcAddress(LhModuleHandle, 'mp3infp_mp3_MakeId3v1W');
    mp3infp_mp3_DelId3v1W   := GetProcAddress(LhModuleHandle, 'mp3infp_mp3_DelId3v1W');
    mp3infp_mp3_MakeId3v2W  := GetProcAddress(LhModuleHandle, 'mp3infp_mp3_MakeId3v2W');
    mp3infp_mp3_DelId3v2W   := GetProcAddress(LhModuleHandle, 'mp3infp_mp3_DelId3v2W');
    mp3infp_mp3_MakeRMPW    := GetProcAddress(LhModuleHandle, 'mp3infp_mp3_MakeRMPW');
    mp3infp_mp3_DelRMPW     := GetProcAddress(LhModuleHandle, 'mp3infp_mp3_DelRMPW');
    mp3infp_mp3_MakeApeTagW := GetProcAddress(LhModuleHandle, 'mp3infp_mp3_MakeApeTagW');
    mp3infp_mp3_DelApeTagW  := GetProcAddress(LhModuleHandle, 'mp3infp_mp3_DelApeTagW');

    {$IFDEF UNICODE}
      mp3infp_ViewPropEx     := mp3infp_ViewPropExW;
      mp3infp_ViewProp       := mp3infp_ViewPropW;
      mp3infp_Load           := mp3infp_LoadW;
      mp3infp_GetValue       := mp3infp_GetValueW;
      mp3infp_SetConf        := mp3infp_SetConfW;
      mp3infp_SetValue       := mp3infp_SetValueW;
      mp3infp_Save           := mp3infp_SaveW;
      mp3infp_mp3_MakeId3v1  := mp3infp_mp3_MakeId3v1W;
      mp3infp_mp3_DelId3v1   := mp3infp_mp3_DelId3v1W;
      mp3infp_mp3_MakeId3v2  := mp3infp_mp3_MakeId3v2W;
      mp3infp_mp3_DelId3v2   := mp3infp_mp3_DelId3v2W;
      mp3infp_mp3_MakeRMP    := mp3infp_mp3_MakeRMPW;
      mp3infp_mp3_DelRMP     := mp3infp_mp3_DelRMPW;
      mp3infp_mp3_MakeApeTag := mp3infp_mp3_MakeApeTagW;
      mp3infp_mp3_DelApeTag  := mp3infp_mp3_DelApeTagW;
    {$ELSE}
      mp3infp_ViewPropEx     := mp3infp_ViewPropExA;
      mp3infp_ViewProp       := mp3infp_ViewPropA;
      mp3infp_Load           := mp3infp_LoadA;
      mp3infp_GetValue       := mp3infp_GetValueA;
      mp3infp_SetConf        := mp3infp_SetConfA;
      mp3infp_SetValue       := mp3infp_SetValueA;
      mp3infp_Save           := mp3infp_SaveA;
      mp3infp_mp3_MakeId3v1  := mp3infp_mp3_MakeId3v1A;
      mp3infp_mp3_DelId3v1   := mp3infp_mp3_DelId3v1A;
      mp3infp_mp3_MakeId3v2  := mp3infp_mp3_MakeId3v2A;
      mp3infp_mp3_DelId3v2   := mp3infp_mp3_DelId3v2A;
      mp3infp_mp3_MakeRMP    := mp3infp_mp3_MakeRMPA;
      mp3infp_mp3_DelRMP     := mp3infp_mp3_DelRMPA;
      mp3infp_mp3_MakeApeTag := mp3infp_mp3_MakeApeTagA;
      mp3infp_mp3_DelApeTag  := mp3infp_mp3_DelApeTagA;
    {$ENDIF}
  end;
end;

{=======================================================================================
名前:  mp3infp_GetVer
概要:  mp3infpのバージョンを取得する
引数:  なし
戻値:  DWORD  バージョン情報
        Ver.2.11  = 0x0211
備考:
対応:  Ver2.11〜
}

//function mp3infp_GetVer: DWORD; stdcall external mp3infp;


{=======================================================================================
名前:  mp3infp_ViewPropEx
概要:  mp3infpに対応したファイル形式のプロパティを開く(モーダルダイアログ版)
説明:  指定ファイルのプロパティをmp3infpのタブをアクティブにして開きます
        ※シェルエクステンションを使用せずにmp3infp.dll単独の動作となります
        ※シェルエクステンション標準のプロパティページは表示されません
引数:
        IN HWND hWnd        呼び出し元ウインドウハンドル
                            呼び出し元ウインドウ上にダイアログを表示します
                            NULLならデスクトップを指定したとみなします
        IN char *szFileName  対象ファイル名をフルパスで指定。
        IN DWORD dwPage     ・mp3infpの何ページ目をアクティブにするか指定する(0=ID3v1 / 1=ID3v2 / 2=RiffSIF / 3=APE(Ver2.47))
                            ・タグを含まないmp3の場合のみ有効
                            ・タグを含む場合はID3v2/APE/RiffSIF/ID3v1の順で検索して、最初に見つかったタグをアクティブにします
        IN BOOL modeless    TRUEならプロパティを表示したまま制御を返します。戻り値にはプロパティのウインドウハンドルが入ります。
                            FALSEならプロパティを閉じるまで制御を返しません。
        DWORD param1        未使用(0を指定してください)
        DWORD param2        未使用(0を指定してください)

戻値:  int 成功=0以上/失敗=-1
対応:  Ver2.48〜
}

//function mp3infp_ViewPropEx (hWnd: HWND; const szFileName: PAnsiChar; dwPage: DWORD; modeless: BOOL; param1: DWORD; param2: DWORD): Integer; stdcall external mp3infp;

{=======================================================================================
名前:  mp3infp_ViewProp
概要:  mp3infpに対応したファイル形式のプロパティを開く
説明:  指定ファイルのプロパティをmp3infpのタブをアクティブにして開きます
引数:
        IN HWND hWnd        呼び出し元ウインドウハンドル
        IN char *szFileName 対象ファイル名をフルパスで指定。
        IN DWORD dwPage     ・mp3infpの何ページ目をアクティブにするか指定する(0=ID3v1 / 1=ID3v2 / 2=RiffSIF / 3=APE(Ver2.47))
                            ・タグを含まないmp3の場合のみ有効
                            ・タグを含む場合はID3v2/APE/RiffSIF/ID3v1の順で検索して、最初に見つかったタグをアクティブにします

戻値:  BOOL 成功=TRUE/失敗=FALSE
対応:  Ver2.00〜
}

//function mp3infp_ViewProp (hWnd: HWND; const szFileName: PAnsiChar; dwPage: DWORD): BOOL; stdcall external mp3infp;

{=======================================================================================
名前:  mp3infp_Load
概要:  タグ情報をロードする
引数:
        IN HWND hWnd        呼び出し元ウインドウを指定します。無い場合はNULL。
        IN const char *szFileName   対象ファイル名をフルパスで指定。
戻値:  DWORD
        -1=ロード失敗
        ERROR_SUCCESS=成功
        (その他)=Win32エラーコード (FormatMessageで文字列を取得できる)
対応:  Ver2.26〜
}

//function mp3infp_Load (hWnd: HWND; const szFileName: PAnsiChar): DWORD; stdcall external mp3infp;

{
////////////////////////////////////////////////////////////////////
表1 mp3infp_GetValue()/mp3infp_SetValue()でszValueNameに指定する名前一覧
////////////////////////////////////////////////////////////////////

    [共通](※1)
    ファイル名              "FILE"  (v2.41〜)
    拡張子                  "FEXT"  (v2.41〜)
    パス                    "PATH"  (v2.41〜)
    サイズ(byte単位)        "SIZ1"  (v2.41〜)
    サイズ(Kbyte単位)       "SIZK"  (v2.41〜)
    サイズ(Mbyte単位)       "SIZM"  (v2.41〜)


    [MP3]                   ID3v1       ID3v2       RiffSIF     APE
    フォーマット(※1)       "AFMT"      "AFMT"      "AFMT"      "AFMT"
    演奏時間(※1)           "TIME"      "TIME"      "TIME"      "TIME"
    タイトル                "INAM_v1"   "INAM_v2"   "INAM_rmp"  "INAM_APE"
    アーティスト            "IART_v1"   "IART_v2"   "IART_rmp"  "IART_APE"
    アルバム                "IPRD_v1"   "IPRD_v2"   "IPRD_rmp"  "IPRD_APE"
    コメント                "ICMT_v1"   "ICMT_v2"   "ICMT_rmp"  "ICMT_APE"
    作成日                  "ICRD_v1"   "ICRD_v2"   "ICRD_rmp"  "ICRD_APE"
    ジャンル                "IGNR_v1"   "IGNR_v2"   "IGNR_rmp"  "IGNR_APE"
    (ID3v2/RiffSIF)
    著作権                              "ICOP_v2"   "ICOP_rmp"
    ソフトウェア/エンコーダ             "ISFT_v2"   "ISFT_rmp"
    (ID3v2)
    作曲                                "COMP_v2"
    Orig.アーティスト                   "OART_v2"
    URL                                 "URL_v2"
    エンコードした人                    "ENC2_v2"
    (RiffSIF)
    ソース                                          "ISRC_rmp"
    エンジニア                                      "IENG_rmp"
    (ID3v1/2)
    トラック番号            "TRACK_v1"  "TRACK_v2"              "TRACK_APE"

    [WAV]
    フォーマット(※1)       "AFMT"
    演奏時間(※1)           "TIME"
    タイトル(※2)           "INAM"
    タイトル(※2)           "ISBJ"
    アーティスト            "IART"
    アルバム                "IPRD"
    コメント                "ICMT"
    作成日                  "ICRD"
    ジャンル                "IGNR"
    著作権                  "ICOP"
    ソフトウェア            "ISFT"
    ソース                  "ISRC"
    エンジニア              "IENG"

    [AVI]
    音声フォーマット(※1)   "AFMT"
    映像フォーマット(※1)   "VFMT"
    時間(※1)               "TIME"
    タイトル(※2)           "INAM"
    タイトル(※2)           "ISBJ"
    アーティスト            "IART"
    コメント                "ICMT"
    作成日                  "ICRD"
    ジャンル                "IGNR"
    著作権                  "ICOP"
    ソフトウェア            "ISFT"
    ソース                  "ISRC"
    エンジニア              "IENG"
    AVIバージョン           "AVIV"    (v2.37〜)

    [VQF]
    フォーマット(※1)       "AFMT"
    演奏時間(※1)           "TIME"
    タイトル                "INAM"
    アーティスト            "IART"
    コメント                "ICMT"
    著作権                  "ICOP"
    保存名                  "FILE"

    [WMA]
    音声フォーマット(※1)   "AFMT"
    映像フォーマット(※1)   "VFMT"
    時間(※1)               "TIME"
    タイトル                "INAM"
    トラック                "TRACK"
    アーティスト            "IART"
    アルバム                "IPRD"
    コメント                "ICMT"
    作成日                  "ICRD"
    ジャンル                "IGNR"
    著作権                  "ICOP"
    URL(Album)              "URL1"
    URL(関連)               "URL2"

    [OGG]
    フォーマット(※1)       "AFMT"
    演奏時間(※1)           "TIME"
    タイトル                "INAM"
    アーティスト            "IART"
    アルバム                "IPRD"
    コメント                "ICMT"
    作成日                  "ICRD"
    ジャンル                "IGNR"
    トラック番号            "TRACK"

    [APE]
    フォーマット(※1)       "AFMT"
    演奏時間(※1)           "TIME"
    タイトル                "INAM"
    アーティスト            "IART"
    アルバム                "IPRD"
    コメント                "ICMT"
    作成日                  "ICRD"
    ジャンル                "IGNR"
    トラック番号            "TRACK"

    [MP4]    (v2.53〜)
    音声フォーマット(※1)   "AFMT"
    映像フォーマット(※1)   "VFMT"
    タイトル                "INAM"
    アーティスト            "IART"
    アルバム                "IPRD"
    グループ                "IGRP"
    作曲                    "COMPOSER"
    ジャンル                "IGNR"
    トラック番号1           "TRACK1"        (1以上の数値)
    トラック番号2           "TRACK2"        (1以上の数値)
    ディスク番号1           "DISC1"         (1以上の数値)
    ディスク番号2           "DISC2"         (1以上の数値)
    テンポ                  "BPM"           (数値)
    作成日                  "ICRD"          (4桁の数値 例:"2004")
    コンピレーション        "COMPILATION"   ("1" or "0")
    コメント                "ICMT"
    ツール                  "TOOL"


(※1)mp3infp_SetValue()では利用できません。
(※2)mp3infpではロード時にINAMを優先、無ければISBJを表示。セーブ時にはISBJを削除、INAMを保存します。
}


{
const
  MP3INFP_FILE_UNKNOWN = $00;
  MP3INFP_FILE_MP3     = $01;
  MP3INFP_FILE_WAV     = $02;
  MP3INFP_FILE_AVI     = $03;
  MP3INFP_FILE_VQF     = $04;
  MP3INFP_FILE_WMA     = $05;
  MP3INFP_FILE_OGG     = $07;
  MP3INFP_FILE_APE     = $08;
  MP3INFP_FILE_MP4     = $09;
}

{=======================================================================================
名前:  mp3infp_GetType
概要:  ファイルの種類を取得する
補足:  mp3infp_Load()の後に呼び出してください
引数:  なし
戻値:  DWORD

#define MP3INFP_FILE_UNKNOWN  0x00
#define MP3INFP_FILE_MP3      0x01
#define MP3INFP_FILE_WAV      0x02
#define MP3INFP_FILE_AVI      0x03
#define MP3INFP_FILE_VQF      0x04
#define MP3INFP_FILE_WMA      0x05
#define MP3INFP_FILE_OGG      0x07
#define MP3INFP_FILE_APE      0x08
対応:  Ver2.26〜
#define MP3INFP_FILE_MP4      0x09
対応:  Ver2.53〜
}

//function mp3infp_GetType: DWORD; stdcall external mp3infp;


{=======================================================================================
名前:  mp3infp_GetValue
概要:  タグ情報を取得する
補足:  mp3infp_Load()の後に呼び出してください
引数:
        IN const char *szValueName    タグの種類を示す名前(表1を参照)
        OUT char **buf                タグ情報を示すバッファのポインタを受け取るポインタ
戻値:  BOOL 成功=TRUE/失敗=FALSE
対応:  Ver2.26〜
}


//function mp3infp_GetValue (const szValueName: PAnsiChar; buf: PPAnsiChar): BOOL; stdcall external mp3infp;
{
const
  MP3INFP_HAS_MP3_ID3V1   = $00000001;
  MP3INFP_HAS_MP3_ID3V2   = $00000002;
  MP3INFP_HAS_MP3_RIFFSIF = $00000004;
  MP3INFP_HAS_MP3_ID3V1_0 = $00000008;  // v2.43〜
  MP3INFP_HAS_MP3_ID3V1_1 = $00000010;  // v2.43〜
  MP3INFP_HAS_MP3_ID3V2_2 = $00000020;  // v2.43〜
  MP3INFP_HAS_MP3_ID3V2_3 = $00000040;  // v2.43〜
  MP3INFP_HAS_MP3_ID3V2_4 = $00000080;  // v2.43〜
  MP3INFP_HAS_MP3_APEV1   = $00000100;  // v2.47〜
  MP3INFP_HAS_MP3_APEV2   = $00000200;  // v2.47〜
}


{=======================================================================================
名前:  mp3infp_mp3_GetTagType
概要:  mp3が持っているタグの種類を取得する
補足:  mp3infp_Load()の後に呼び出してください
引数:  なし
戻値:  DWORD (OR)
#define MP3INFP_HAS_MP3_ID3V1      0x00000001
#define MP3INFP_HAS_MP3_ID3V2      0x00000002
#define MP3INFP_HAS_MP3_RIFFSIF    0x00000004
#define MP3INFP_HAS_MP3_ID3V1_0    0x00000008  // v2.43〜
#define MP3INFP_HAS_MP3_ID3V1_1    0x00000010  // v2.43〜
#define MP3INFP_HAS_MP3_ID3V2_2    0x00000020  // v2.43〜
#define MP3INFP_HAS_MP3_ID3V2_3    0x00000040  // v2.43〜
#define MP3INFP_HAS_MP3_ID3V2_4    0x00000080  // v2.43〜
#define MP3INFP_HAS_MP3_APEV1      0x00000100  // v2.47〜
#define MP3INFP_HAS_MP3_APEV2      0x00000200  // v2.47〜
対応:  Ver2.27〜
}

//function mp3infp_mp3_GetTagType: DWORD; stdcall external mp3infp;


{=======================================================================================
名前:  mp3infp_SetConf
概要:  mp3infpの動作設定
引数:  IN char *tag      設定項目(表2参照)
        IN char *val      設定値(表2参照)
戻値:  BOOL 成功=TRUE/失敗=FALSE
対応:  Ver2.42〜
補足:  ・他のプロセスのmp3infp.dll/シェル拡張のmp3infpには影響しない
        ・設定内容は保存されない
}

//function mp3infp_SetConf(tag: PAnsiChar; value: PAnsiChar): BOOL; stdcall external mp3infp;


{=======================================================================================
////////////////////////////////////////////////////////////////////
mp3infp_SetConf()指定する設定項目・値一覧
////////////////////////////////////////////////////////////////////

    [Waveファイルのコーデック名称の取得方法](Ver2.42〜)
    (項目名)
    "wave_CodecFind"
    (値)
    "0"(default)    mp3infp内蔵辞書 → Windows APIを利用の順で検索(高速)
    "1"             Windows APIを利用 → 自力解析の順で検索(低速)
    "2"             mp3infp内蔵辞書(高速)
    "3"             Windows APIを利用(低速)

    [Aviファイルのコーデック名称の取得方法](Ver2.42〜)
    (項目名)
    "avi_CodecFind"
    (値)
    "0"(default)    mp3infp内蔵辞書 → Windows APIを利用の順で検索(高速)
    "1"             Windows APIを利用 → 自力解析の順で検索(低速)
    "2"             mp3infp内蔵辞書(高速)
    "3"             Windows APIを利用(低速)

    [ID3v1で拡張ジャンルを使用する](Ver2.43〜)
    (項目名)
    "mp3_UseExtGenre"
    (値)
    "0"(default)    無効
    "1"             有効

    [ID3v2で文字列をUnicodeで書き込む](Ver2.43〜)
    (項目名)
    "mp3_ID3v2Unicode"
    (値)
    "0"(default)    無効
    "1"             有効

    [ID3v2を非同期化する](Ver2.43〜)
    (項目名)
    "mp3_ID3v2Unsync"
    (値)
    "0"             無効
    "1"(default)    有効

    [保存時のID3v2バージョン](Ver2.43〜)
    ※この設定値はmp3infp_Load()の実行によって上書きされます。
    (項目名)
    "mp3_SaveID3v2Version"
    (値)
    "2.2"           ID3v2.2
    "2.3"(default)  ID3v2.3
    "2.4"           ID3v2.4
}


{=======================================================================================
名前:  mp3infp_SetValue
概要:  タグ情報を設定する
補足:  mp3infp_Load()の後に呼び出してください
引数:
        IN const char *szValueName    タグの種類を示す名前(表1を参照)
        IN const char *buf            タグ情報を示す文字列
戻値:  DWORD
        -1=失敗
        ERROR_SUCCESS=成功
対応:  Ver.2.43〜
}

//function mp3infp_SetValue (const szValueName: PAnsiChar; const buf: PAnsiChar): DWORD; stdcall external mp3infp;

{=======================================================================================
名前:  mp3infp_Save
概要:  タグ情報を保存する
補足:  mp3infp_Load()の後に呼び出してください
引数:  IN const char *szFileName    対象ファイル名をフルパスで指定。
戻値:  DWORD
        -1=失敗
        -2=2Gバイトを超えるファイルを扱うことはできません。(WAVファイルのみ)
        ERROR_SUCCESS=成功
        (その他)=Win32エラーコード (FormatMessageで文字列を取得できる)
対応:  Ver.2.43〜
}

//function mp3infp_Save (const szFileName: PAnsiChar): DWORD; stdcall external mp3infp;


{=======================================================================================
名前:  mp3infp_mp3_MakeId3v1
概要:  ID3TAG V1を作成する
補足:  mp3infp_Load()の後に呼び出してください
        変更は直ちに反映されます
        mp3ファイルにのみ利用してください(wavファイルは対象外)
引数:  IN char *szFileName    対象ファイル名をフルパスで指定。
戻値:  DWORD
        -1=失敗
        ERROR_SUCCESS=成功
        (その他)=Win32エラーコード (FormatMessageで文字列を取得できる)
対応:  Ver.2.43〜
}

//function mp3infp_mp3_MakeId3v1 (const szFileName: PAnsiChar): DWORD; stdcall external mp3infp;

{=======================================================================================
名前:  mp3infp_mp3_DelId3v1
概要:  ID3TAG V1を削除する
補足:  mp3infp_Load()の後に呼び出してください
        変更は直ちに反映されます
        mp3ファイルにのみ利用してください(wavファイルは対象外)
引数:  IN char *szFileName    対象ファイル名をフルパスで指定。
戻値:  DWORD
        -1=失敗
        ERROR_SUCCESS=成功
        (その他)=Win32エラーコード (FormatMessageで文字列を取得できる)
対応:  Ver.2.43〜
}

//function mp3infp_mp3_DelId3v1 (const szFileName: PAnsiChar): DWORD; stdcall external mp3infp;

{=======================================================================================
名前:  mp3infp_mp3_MakeId3v2
概要:  ID3TAG V2を作成する
補足:  mp3infp_Load()の後に呼び出してください
        変更は直ちに反映されます
        mp3ファイルにのみ利用してください(wavファイルは対象外)
引数:  IN char *szFileName    対象ファイル名をフルパスで指定。
戻値:  DWORD
        -1=失敗
        ERROR_SUCCESS=成功
        (その他)=Win32エラーコード (FormatMessageで文字列を取得できる)
対応:  Ver.2.43〜
}

//function mp3infp_mp3_MakeId3v2 (const szFileName: PAnsiChar): DWORD; stdcall external mp3infp;

{=======================================================================================
名前:  mp3infp_mp3_DelId3v2
概要:  ID3TAG V2を削除する
補足:  mp3infp_Load()の後に呼び出してください
        変更は直ちに反映されます
        mp3ファイルにのみ利用してください(wavファイルは対象外)
引数:  IN char *szFileName    対象ファイル名をフルパスで指定。
戻値:  DWORD
        -1=失敗
        ERROR_SUCCESS=成功
        (その他)=Win32エラーコード (FormatMessageで文字列を取得できる)
対応:  Ver.2.43〜
}

//function mp3infp_mp3_DelId3v2 (const szFileName: PAnsiChar): DWORD; stdcall external mp3infp;

{=======================================================================================
名前:  mp3infp_mp3_MakeRMP
概要:  mp3形式からRMP形式に変換する
補足:  mp3infp_Load()の後に呼び出してください
        変更は直ちに反映されます
        mp3ファイルにのみ利用してください(wavファイルは対象外)
引数:  IN char *szFileName    対象ファイル名をフルパスで指定。
戻値:  DWORD
        -1=失敗
        ERROR_SUCCESS=成功
        (その他)=Win32エラーコード (FormatMessageで文字列を取得できる)
対応:  Ver.2.43〜
}

//function mp3infp_mp3_MakeRMP (const szFileName: PAnsiChar): DWORD; stdcall external mp3infp;

{=======================================================================================
名前:  mp3infp_mp3_DelRMP
概要:  RMP形式からmp3形式に変換する
補足:  mp3infp_Load()の後に呼び出してください
        変更は直ちに反映されます
        mp3ファイルにのみ利用してください(wavファイルは対象外)
引数:  IN char *szFileName    対象ファイル名をフルパスで指定。
戻値:  DWORD
        -1=失敗
        ERROR_SUCCESS=成功
        (その他)=Win32エラーコード (FormatMessageで文字列を取得できる)
対応:  Ver.2.43〜
}

//function mp3infp_mp3_DelRMP (const szFileName: PAnsiChar): DWORD; stdcall external mp3infp;

{=======================================================================================
名前:  mp3infp_mp3_MakeApeTag
概要:  APE Tagを作成する
補足:  mp3infp_Load()の後に呼び出してください
        変更は直ちに反映されます
        mp3ファイルにのみ利用してください(wavファイルは対象外)
引数:  IN char *szFileName    対象ファイル名をフルパスで指定。
戻値:  DWORD
        -1=失敗
        ERROR_SUCCESS=成功
        (その他)=Win32エラーコード (FormatMessageで文字列を取得できる)
対応:  Ver.2.47〜
}

//function mp3infp_mp3_MakeApeTag (const szFileName: PAnsiChar): DWORD; stdcall external mp3infp;

{=======================================================================================
名前:  mp3infp_mp3_DelApeTag
概要:  APE Tagを削除する
補足:  mp3infp_Load()の後に呼び出してください
        変更は直ちに反映されます
        mp3ファイルにのみ利用してください(wavファイルは対象外)
引数:  IN char *szFileName    対象ファイル名をフルパスで指定。
戻値:  DWORD
        -1=失敗
        ERROR_SUCCESS=成功
        (その他)=Win32エラーコード (FormatMessageで文字列を取得できる)
対応:  Ver.2.47〜
}

//function mp3infp_mp3_DelApeTag (const szFileName: PAnsiChar): DWORD; stdcall external mp3infp;



//==============================================================================
initialization
  lpcInitFunc;

finalization
  FreeLibrary(LhModuleHandle);

end.