mp3infpをx64へ移植(VC6編 part2)

やり方を少し整理したので、最新版を使ってもう一度やってみました。

用意するもの

  1. Microsoft Visual C++ 6.0 Professional(以下VC)
  2. Microsoft Platform SDK for Windows Server 2003 R2(以下PSDK)
  3. mp3infpのソースコード(Ver.2.52fを使用)

作業方法

  1. mp3infpのソースコードを適当な場所へ解凍(日本語を含まないパスの方がよい)
  2. PSDKのSet Windows XP x64 Build Environment (Retail)でコマンドプロンプトを起動させ、
    そこからVCを/useenvオプションを付けて起動させる

  3. OggVorbisのヘッダとライブラリのパスを追加
  4. カスタムビルドのコマンドラインを空にする
  5. リンクするライブラリから odbc32.lib,odbccp32.lib を削除
  6. リンクするライブラリに bufferoverflowu.lib を追加
  7. 全ての*.manifestのprocessorArchitectureをX86からAMD64(または*)へ変更
  8. ソースコードの修正(※1)
  9. 全てビルド
  10. 作成されたファイルmp3infp.cpl, mp3infp.dllをC:\WINDOWS\system32へコピー
  11. mp3infp_regist.exeを適当な場所へコピー
  12. その下にフォルダlanguageを作成し、Japanese.lngをコピー
  13. レジストリエディタ(regedit.exe)を起動して、HKEY_LOCAL_MACHINE\Software以下にキー「win32lab.com」を作成し、その下に「mp3infp」を作成する。
  14. その中で、文字列値「path」を作成し、値をmp3infp_regist.exeをコピーした場所にする
  15. ファイル名を指定して実行から「regsvr32.exe mp3infp.dll」を実行

※1 ソース修正箇所について
警告箇所など、問題ありそうなところを修正を追加しました。
詳細は実際のソースを見た方が早いでしょう。

  1. stdafx.h の afxdb.h,afxdao.h のinclude行をコメントアウト
  2. GetWindowLongをGetWindowLongPtrに変更。同時にDWL_USER→DWLP_USER
  3. SetWindowLongをSetWindowLongPtrに変更。同時にDWL_USER→DWLP_USER, DWL_MSGRESULT→DWLP_MSGRESULT
    また、SetWindowLongの引数で、ポインタをDWORDにキャストして渡している箇所があるが、ここのキャストをLONG_PTRに必ず変更すること

  4. GetFloppyType.cpp 6~7行目をコメントアウト
  5. SendMessageTimeoutの最後の引数をDWORD型からDWORD_PTR型に変更
  6. ShellExt.h 226行目のUINTをUINT_PTRに変更
  7. ShellExt_IShellPropSheetExt.cppのダイアログプロシージャ代入箇所(psp.pfnDlgProc=PageDlgProc_XXX)の右辺にキャスト(DLGPROC)を追加
  8. ShellExt_IContextMenu.cppの97行目のUINTをUINT_PTRに変更
  9. SendMessageの戻り値をlongに格納してCB_ERR(-1)と比較している箇所をlong→LRESULTに変更

今のところ、マニフェストファイルの埋め込みがうまくいっていない問題がありますが、
自分ではビジュアルスタイルにならなくとも気にならないので保留にしています。
気になるのであれば原因を調査してみてください(そして原因を教えてください^^;)

  • ダウンロード
    バイナリ mp3infp252f_x64.lzh
    ソース mp3infp252f_x64_src.lzh

  • 関連リンク
    mp3infpをx64へ移植(VC6編)
    mp3infpをx64へ移植2
    mp3infpをx64へ移植

  • mp3infpをx64へ移植(VC6編)

    試しに使ってみた、VC2005Expressの動作の重さや、
    やたらとエラー吐いて落ちまくる不安定さに、
    計画していたVisualStudio2005の購入計画も保留となってしまい、
    まだまだ我が家では現役続行のVC6を使用して、
    以前VisualStudio2005を使ってx64へ移植を行ったmp3infpを、
    x64へ移植できないかと、やってみた時のメモ。

    用意するもの

    1. Microsoft Visual C++ 6.0 Professional(以下VC)
    2. Microsoft Platform SDK for Windows Server 2003 R2(以下PSDK)
    3. mp3infpのソースコード(Ver.2.52dを使用)

    作業方法

    1. mp3infpのソースコードを適当な場所へ解凍(日本語を含まないパスの方がよい)
    2. x64用の設定でVCを起動(方法はPSDKとかAMDのページを参考にしてください)
    3. OggVorbisのヘッダとライブラリのパスを追加
    4. 全プロジェクトのリンカのmachineオプションを /machine:AMD64 に変更
    5. stdafx.h の afxdb.h,afxdao.h のinclude行をコメントアウト
    6. リンクするライブラリに bufferoverflowu.lib を追加
    7. lang_japaneseとmp3infp_registのリンクするライブラリから odbc32.lib,odbccp32.lib を削除
    8. ソースコードの修正(※1)
    9. 全ての*.manifestのprocessorArchitectureをX86からAMD64(または*)へ変更
    10. mp3infpの依存関係からlang_japaneseを外す
    11. カスタムビルドの Verupdate.exe の呼び出しを削除
    12. 全てビルド
    13. 作成されたファイルmp3infp.cpl, mp3infp.dllをC:\WINDOWS\system32へコピー
    14. mp3infp_regist.exeを適当な場所へコピー
    15. その下にフォルダlanguageを作成し、Japanese.lngをコピー
    16. レジストリエディタ(regedit.exe)を起動して、HKEY_LOCAL_MACHINE\Software以下にキー「win32lab.com」を作成し、その下に「mp3infp」を作成する。
    17. その中で、文字列値「path」を作成し、値をmp3infp_regist.exeをコピーした場所にする
    18. ファイル名を指定して実行から「regsvr32.exe mp3infp.dll」を実行

    ※1 ソース修正箇所について
    修正箇所は、前回までと同じと考えていいですが、
    エラーが出なかった部分については、未修正としたので少し減ってます。

    1. GetWindowLongをGetWindowLongPtrに変更。同時にDWL_USER→DWLP_USER
    2. SetWindowLongをSetWindowLongPtrに変更。同時にDWL_USER→DWLP_USER, DWL_MSGRESULT→DWLP_MSGRESULT
      また、SetWindowLongの引数で、ポインタをDWORDにキャストして渡している箇所があるが、ここのキャストをLONG_PTRに必ず変更すること

    3. GetFloppyType.cpp 6~7行目をコメントアウト
    4. SendMessageTimeoutの最後の引数をDWORD型からDWORD_PTR型に変更
    5. ShellExt.h 226行目のUINTをUINT_PTRに変更
    6. ShellExt_IContextMenu.cppの97行目のUINTをUINT_PTRに変更
    7. ShellExt_IShellPropSheetExt.cppのダイアログプロシージャ代入箇所(psp.pfnDlgProc=PageDlgProc_XXX)の右辺にキャスト(DLGPROC)を追加

    バイナリ・ソースは、少々お待ちください。

    mp3infpをx64へ移植2
    mp3infpをx64へ移植