OSDN Ticket Archive


Ticket #45898

Win版 MIDIファイル読み込み処理のUnicode対応

登録: 2022-10-17 21:39 最終更新: 2022-10-20 22:06

報告者:
yknk
担当者:
yknk
チケットの種類:
サポートリクエスト
状況:
完了
コンポーネント:
MIDITrail Ver.1.4.x for Windows
マイルストーン:
Version 1.4.0 for Windows (完了済み)
優先度:
5 - 中
重要度:
5 - 中
解決法:
修正済み
ファイル:
なし

詳細

MIDIファイル読み込み処理をUnicode対応させる。

現状、日本語環境においてMIDITrailでMIDIファイルを開くとき、ファイル名やファイルパスに、 Shift-JISに変換できない文字(例えばウムラウト文字や絵文字)が含まれていると、 次のエラーが発生して読み込むことができない。これはMIDITrailがマルチバイト対応の アプリケーションとして実装されており、Unicode対応していないためである。

ERROR
File open error.
FUNC: SMIDILib::SMFileReader::Load
LINE: 101
INFO: 00000002 00000000

チケットの履歴

2022-10-17 21:39 更新者: yknk
  • 新しいチケット "Win版 MIDIファイル読み込み処理のUnicode対応" が作成されました
2022-10-17 22:07 更新者: yknk
コメント

対応方針

ユーザが選択するファイル(MIDIファイル、画像ファイル)の読み込み処理のみをUnicode対応する。 またこれに付随する、以下の処理をUnicode対応する。

  • MIDIファイル名を画面に表示する処理
  • MIDIファイル解析結果をファイル出力する処理
  • RCPCVを用いてRCPファイルをSMFファイルに変換して読み込む処理
  • 先行プロセスにMIDIファイルパスをポストする処理
  • コマンドラインからファイル名や引数を解析する処理
  • グラフィック設定ダイアログで背景画像ファイルを表示・選択する処理
  • 背景画像ファイルを読み込む処理

プロジェクト全体のUnicode対応は、投入する工数に対するメリットが小さいため、今回は見送る。 これにより、MIDITrailのEXEファイルが配置されるパスに、マルチバイト(Shift-JIS)に変換できない文字が含まれていると、 アプリが正常に動作しないという制限がこれまで通り残ったままとなる。 テクスチャ画像ファイルやINIファイルの読み込みができないため。

2022-10-17 22:08 更新者: yknk
コメント

対策1:YNBaseLibライブラリのファイル操作ユーティリティをUNICODE対応

YNPathUtil::IsFileExtMatch

  • 引数をワイド文字列に変更。

YNPathUtil::GetTempFilePath

  • 引数をワイド文字列に変更。

対策2:YNBaseLibライブラリのINIファイル操作ユーティリティをUNICODE対応

YNConfFile::SetWStr

  • ワイド文字列の値を登録するメソッドを追加。
  • ワイド文字列版のAPI(WritePrivateProfileStringW)を利用しても、INIファイルにはマルチバイト文字列で保存されるため、16進数文字列に変換して保存する。

YNConfFile::GetWStr

  • ワイド文字列の値を取得するメソッドを追加。
  • 16進数文字列をワイド文字列に変換して値を返却する。
2022-10-17 22:08 更新者: yknk
コメント

対策3:SMIDILibライブラリ

SMFileReader::SetLogPath

  • 引数をワイド文字列に変更。

SMFileReader::Load

  • 引数をワイド文字列に変更。
  • MIDIファイルを開くときに指定するパスをワイド文字列に変更。

SMFileReader::_OpenLogFile

  • ログファイルを開くときに指定するパスをワイド文字列に変更。

SMRcpConv

  • メンバに関数ポインタを追加。

SMRcpConv::Initialize

  • 関数ポインタ取得処理を追加。

SMRcpConv::Convert

  • RCPCVに対して、RCPファイルの読み込みとSMFファイルの出力を任せていたが、ファイル入出力をアプリ側で実施するように変更。 RCPCVのAPIインターフェースがワイド文字列に対応していないため。

SMRcpConv::IsSupportFileExt

  • 引数をワイド文字列に変更。

SMRcpConv::GetOpenFileNameFilter

  • 戻り値をワイド文字列に変更。

SMSeqData

  • メンバの一部をstringからwstringに変更。(m_CopyRight, m_Title, m_FileName)

SMSeqData::Clear

  • メンバの初期化処理でワイド文字列を設定するように変更。

SMSeqData::GetCopyRight

  • 戻り値をワイド文字列に変更。

SMSeqData::GetTitle

  • 戻り値をワイド文字列に変更。

SMSeqData::_SearchText

  • MIDIファイルから読み込んだマルチバイト文字列をワイド文字列に変換する処理を追加。

SMSeqData::SetFileName

  • 引数をワイド文字列に変更。

SMSeqData::GetFileName

  • 戻り値をワイド文字列に変更。

SMSeqData::_StringToWstring

  • マルチバイト文字列からワイド文字列に変化するメソッドを追加。
2022-10-17 22:08 更新者: yknk
コメント

対策4:MIDITrailAppクラス

MIDITrailApp

  • ウィンドウタイトルの文字列定義をワイド文字に変更。
  • メンバのウィンドウタイトルm_Titleとウィンドウクラス名m_WndClassNameをワイド文字列に変更。
  • メンバの次回オープン対象ファイルパスm_NextFilePathをワイド文字列に変更。

MIDITrailApp::MIDITrailApp

  • メンバの初期化処理で設定する値をワイド文字列に変更。

MIDITrailApp::Initialize

  • 初期化処理で作成する文字列をワイド文字列に変更。
  • 二重起動抑止処理の引数変更に対応。
  • ウィンドウタイトル更新処理を追加。
  • コマンドライン解析処理の引数変更に対応。

MIDITrailApp::_RegisterClass

  • ウィンドウクラス登録処理で設定する値をワイド文字列に変更。

MIDITrailApp::_CreateWindow

  • ウィンドウ生成処理で設定する値をワイド文字列に変更。

MIDITrailApp::_WndProcImpl

  • WM_SETTEXTメッセージ受信時の処理を追加。ウィンドウタイトルのワイド文字列描画に対応するため。

MIDITrailApp::_OnMenuOpenFile

  • ファイルパスをワイド文字列に変更。

MIDITrailApp::_OnMenuOpenFolder

  • フォルダパスをワイド文字列に変更。

MIDITrailApp::_OnMenuPreviousFile

  • ファイルパスをワイド文字列に変更。

MIDITrailApp::_OnMenuNextFile

  • ファイルパスをワイド文字列に変更。

MIDITrailApp::_OnDropFiles

  • ファイル/フォルダドロップ時に受け取るパスをワイド文字列に変更。

MIDITrailApp::_SelectMIDIFile

  • ファイル選択ダイアログから受け取るパスをワイド文字列に変更。

MIDITrailApp::_SelectFolder

  • フォルダ選択ダイアログから受け取るパスはもともとワイド文字列のため、マルチバイト文字列への変換処理を削除。

MIDITrailApp::_LoadMIDIFile

  • MIDIファイル読み込み処理で扱うパスをワイド文字列に変更。
  • 拡張子が.midでなければ常にRCPファイルとみなしていた処理を、RCPCVがサポートする拡張子であることを確認してからRCPファイルとみなすように変更。

MIDITrailApp::_UpdateWindowTitle

  • ウィンドウタイトルに設定する値をワイド文字列に変更。

MIDITrailApp::_UpdateFPS

  • ウィンドウタイトルに設定する値をワイド文字列に変更。

MIDITrailApp::_ParseCmdLine

  • ファイルパスをワイド文字列に変更。
  • コマンドライン解析処理の引数変更に対応。

MIDITrailApp::_PostFilePathToFirstMIDITrail

  • 先行プロセスのMIDITrailへポストするファイルパスをワイド文字列に変更。

MIDITrailApp::_OnFilePathPosted

  • 後続プロセスからファイルパスをポストされたとき、ファイルパスをワイド文字列として扱うように変更

MIDITrailApp::_StopPlaybackAndOpenFile

  • ファイルパスをワイド文字列に変更。

MIDITrailApp::_StopPlaybackAndOpenFolder

  • ファイルパスをワイド文字列に変更。

MIDITrailApp::_FileOpenProc

  • ファイルパスをワイド文字列に変更。

MIDITrailApp::_MakeFileListWithFolder

  • フォルダパスをワイド文字列に変更。
2022-10-17 22:08 更新者: yknk
コメント

対策5:ユーティリティクラス

MTCmdLineParser

  • メンバのファイルパスm_pFilePathをワイド文字列に変更。

MTCmdLineParser::MTCmdLineParser

  • メンバの初期化処理で設定する値をワイド文字列に変更。

MTCmdLineParser::_AnalyzeCmdLine

  • コマンドラインをワイド文字列で取得して解析するように変更。l

MTCmdLineParser::GetFilePath

  • 戻り値をワイド文字列に変更。

MTFileList

  • メンバのディレクトリパスm_TargetDirPathとファイルパスm_CurFilePathをワイド文字列に変更。
  • メンバのファイル名リストm_FileNameListの要素をstringからwstringに変更。

MTFileList::MTFileList

  • メンバの初期設定値をワイド文字列に変更。

MTFileList::Clear

  • メンバの初期設定値をワイド文字列に変更。

MTFileList::MakeFileListWithDirectory

  • ファイル名リストをワイド文字列で作成するように変更。

MTFileList::GetFilePath

  • 戻り値をワイド文字列に変更。

MTFileList::GetFileName

  • 戻り値をワイド文字列に変更。

MTFileList::SetSelectedFileName

  • 引数をワイド文字列に変更。
2022-10-17 22:08 更新者: yknk
コメント

対策6:シーンライブラリ

MTDynamicCaption

  • メンバの文字リストm_Charsをワイド文字列に変更。

MTDynamicCaption::MTDynamicCaption

  • メンバの初期設定値をワイド文字列に変更。

MTDynamicCaption::Create

  • 引数をワイド文字列に変更。

MTDynamicCaption::SetString

  • 引数をワイド文字列に変更。

MTDynamicCaption::_CreateTexture

  • 引数をワイド文字列に変更。

MTDynamicCaption::_GetTextureUV

  • 引数をワイド文字列に変更。

MTFont2Bmp

  • メンバのフォント名m_FontNameをワイド文字列に変更。

MTFont2Bmp::SetFont

  • 引数をワイド文字列に変更。

MTFont2Bmp::CreateBmp

  • 引数をワイド文字列に変更。

MTFont2Bmp::_CreateLogFont

  • 論理フォント情報生成時にワイド文字列を使用するように変更。

MTFont2Bmp::_CreateGlyphBmp

  • ワイド文字からグリフBMPを作成する処理に変更。
  • サロゲートペアに対応。

MTFont2Bmp::_CreateGlyphBmpList

  • 引数をワイド文字列に変更。
  • サロゲートペアに対応。

MTFontTexture::SetFont

  • 引数をワイド文字列に変更。

MTFontTexture::CreateTexture

  • 引数をワイド文字列に変更。

MTStaticCaption::Create

  • 引数をワイド文字列に変更。

MTStaticCaption::_CreateTexture

  • 引数をワイド文字列に変更。
2022-10-17 22:09 更新者: yknk
コメント

対策7:シーンオブジェクト

MTDashboard

  • パラメータ定義をワイド文字列に変更。

MTDashboard::Create

  • タイトルとファイル名をワイド文字列に変更。

MTDashboard::Draw

  • カウンタをワイド文字列に変更。

MTDashboard::_GetCounterPos

  • パラメータ定義のワイド文字列変更に対応。

MTDashboard::_GetCounterStr

  • カウンタをワイド文字列に変更。

MTDashboardLive

  • パラメータ定義をワイド文字列に変更。

MTDashboardLive::Create

  • カウンタをワイド文字列に変更。

MTDashboardLive::Draw

  • カウンタをワイド文字列に変更。

MTDashboardLive::_GetCounterPos

  • パラメータ定義のワイド文字列変更に対応。

MTDashboardLive::_GetCounterStr

  • カウンタをワイド文字列に変更。

MTDashboardLive::SetMIDIINDeviceName

  • MIDI INデバイス名をワイド文字列に変換する処理を追加。

MTDashboardLive::_StringToWstring

  • マルチバイト文字列からワイド文字列に変化するメソッドを追加。
  • パラメータ定義をワイド文字列に変更。

MTLogo::_CreateTexture

  • フォント名をワイド文字列に変更。
2022-10-17 22:09 更新者: yknk
コメント

対策8:グラフィック設定ダイアログ

MTGraphicCfgDlg

  • メンバの背景画像ファイルパスm_ImageFilePathをワイド文字列に変更。

MTGraphicCfgDlg::MTGraphicCfgDlg

  • メンバの初期設定値をワイド文字列に変更。

MTGraphicCfgDlg::Show

  • ダイアログ表示APIをワイド文字列版(DialogBoxW)に変更。ファイルパスのエディットボックスでUNICODE文字を表示可能とするため。

MTGraphicCfgDlg::_LoadConf

  • 設定ファイルからワイド文字列画像ファイルパスを取得するように変更。
  • ワイド文字列画像ファイルパスが未設定の場合は、マルチバイト文字列画像ファイルパスを取得する。

MTGraphicCfgDlg::_InitBackgroundImageFilePath

  • エディットボックスにワイド文字列のファイルパスを設定するように修正。

MTGraphicCfgDlg::_Save

  • 設定ファイルにワイド文字列のファイルパスを保存するように修正。

MTGraphicCfgDlg::_OnBtnBrowse

  • エディットボックスにワイド文字列のファイルパスを設定するように修正。

MTGraphicCfgDlg::_SelectImageFile

  • 画像ファイル選択ダイアログ表示APIをワイド文字列版に変更。
2022-10-17 22:09 更新者: yknk
コメント

対策9:背景画像描画クラス

MTBackgroundImage::_LoadTexture

  • 設定ファイルからワイド文字列画像ファイルパスを取得するように変更。
  • ワイド文字列画像ファイルパスが未設定の場合は、マルチバイト文字列画像ファイルパスを取得する。

リファクタリング

MTGraphicCfgDlg::_WndProcImpl

  • 戻り値を修正。
2022-10-20 22:06 更新者: yknk
  • 状況オープン から 完了 に更新されました
  • 解決法なし から 修正済み に更新されました

添付ファイルリスト

添付ファイルはありません