From 4c2870b1dc59069bf49fed8431cbe49abae3ac26 Mon Sep 17 00:00:00 2001 From: berryzplus Date: Sun, 12 Jul 2026 13:10:01 +0900 Subject: [PATCH 1/4] =?UTF-8?q?=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB?= =?UTF-8?q?=E3=83=80=E3=82=A4=E3=82=A2=E3=83=AD=E3=82=B0=E3=81=AE=E3=83=86?= =?UTF-8?q?=E3=82=B9=E3=83=88=E3=82=92=E3=83=91=E3=83=A9=E3=83=A1=E3=83=BC?= =?UTF-8?q?=E3=82=BF=E3=83=BC=E5=8C=96=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/cpp/tests1/test-cdlgopenfile.cpp | 162 +++++++++++++++------- 1 file changed, 109 insertions(+), 53 deletions(-) diff --git a/src/test/cpp/tests1/test-cdlgopenfile.cpp b/src/test/cpp/tests1/test-cdlgopenfile.cpp index 7dfc76ef90..0ed29d6b84 100644 --- a/src/test/cpp/tests1/test-cdlgopenfile.cpp +++ b/src/test/cpp/tests1/test-cdlgopenfile.cpp @@ -9,7 +9,22 @@ #include "window/EditorTestSuite.hpp" -struct DlgOpenFileTest : public ::testing::Test, public window::EditorTestSuite, public window::UiaTestSuite { +namespace window { + +/*! + * @brief ファイルダイアログテストのパラメーター + * + * @param bVistaStyleFileDialog Vistaスタイルのファイルダイアログを使うかどうか + * + * @note 単独パラメーターなので、std::tuple でなく bool としている。 + */ +using FileDialogTestParam = bool; + +/*! + * ファイルダイアログテストのためのフィクスチャクラス + * + */ +struct FileDialogTest : public ::testing::TestWithParam, public window::EditorTestSuite, public window::UiaTestSuite { /*! * テストスイートの開始前に1回だけ呼ばれる関数 */ @@ -29,17 +44,29 @@ struct DlgOpenFileTest : public ::testing::Test, public window::EditorTestSuite, TearDownUia(); } -}; -TEST_F(DlgOpenFileTest, Construct) -{ - CDlgOpenFile cDlgOpenFile; -} + /*! + * テストが実行された直前に毎回呼ばれる関数 + */ + void SetUp() override + { + // テスト設定を反映する + GetDllShareData().m_Common.m_sEdit.m_bVistaStyleFileDialog = GetParam(); + } -TEST_F(DlgOpenFileTest, CommonItemDialogCreate) -{ - GetDllShareData().m_Common.m_sEdit.m_bVistaStyleFileDialog = true; + /*! + * テストが実行された直後に毎回呼ばれる関数 + */ + void TearDown() override + { + // 設定を元に戻す + GetDllShareData().m_Common.m_sEdit.m_bVistaStyleFileDialog = true; + } +}; +TEST_P(FileDialogTest, Create001) +{ + // 落ちたり例外にならないこと CDlgOpenFile cDlgOpenFile; cDlgOpenFile.Create( GetModuleHandle(nullptr), @@ -51,81 +78,110 @@ TEST_F(DlgOpenFileTest, CommonItemDialogCreate) ); } -TEST_F(DlgOpenFileTest, CommonFileDialogCreate) +TEST_P(FileDialogTest, Create002_LongFilter) { - GetDllShareData().m_Common.m_sEdit.m_bVistaStyleFileDialog = false; - + // 落ちたり例外にならないこと CDlgOpenFile cDlgOpenFile; cDlgOpenFile.Create( GetModuleHandle(nullptr), nullptr, - L"*.txt", + L".extension_250_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_LONG", L"C:\\Windows", std::vector(), std::vector() ); } -TEST_F(DlgOpenFileTest, CommonItemDialogDefaltFilterLong) +TEST_P(FileDialogTest, Create003_ManyFiltersy) { - GetDllShareData().m_Common.m_sEdit.m_bVistaStyleFileDialog = true; - // 落ちたり例外にならないこと CDlgOpenFile cDlgOpenFile; cDlgOpenFile.Create( GetModuleHandle(nullptr), nullptr, - L".extension_250_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_LONG", + L"*.extension_50_0_long_long_long_long_long_long_LONG;*.extension_50_1_long_long_long_long_long_long_LONG;*.extension_50_2_long_long_long_long_long_long_LONG;*.extension_50_3_long_long_long_long_long_long_LONG;*.extension_50_4_long_long_long_long_long_long_LONG;*.extension_50_5_long_long_long_long_long_long_LONG;*.extension_50_6_long_long_long_long_long_long_LONG;*.extension_50_7_long_long_long_long_long_long_LONG;*.extension_50_8_long_long_long_long_long_long_LONG;*.extension_50_9_long_long_long_long_long_long_LONG", L"C:\\Windows", std::vector(), std::vector() ); } -TEST_F(DlgOpenFileTest, CommonFileDialogDefaltFilterLong) +/*! + * ファイルを開くダイアログの表示テスト + */ +TEST_P(FileDialogTest, DoModalOpenDlg101) { - GetDllShareData().m_Common.m_sEdit.m_bVistaStyleFileDialog = false; + // 表示されたモーダルダイアログをキャンセルボタンで閉じるようにする + dialog::ModalDialogCloser closer; - // 落ちたり例外にならないこと - CDlgOpenFile cDlgOpenFile; - cDlgOpenFile.Create( - GetModuleHandle(nullptr), - nullptr, - L"*.extension_250_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_long_LONG", - L"C:\\Windows", - std::vector(), - std::vector() - ); + // コマンドコードで、無理矢理動かす + const auto hWnd = pcEditWnd->GetHwnd(); + FORWARD_WM_COMMAND(hWnd, F_FILEOPEN, nullptr, 0, pcEditWnd->DispatchEvent); } -TEST_F(DlgOpenFileTest, CommonFileDialogDefaltFilterMany) +/*! + * 名前を付けて保存ダイアログの表示テスト + */ +TEST_P(FileDialogTest, DoModalSaveDlg101) { - GetDllShareData().m_Common.m_sEdit.m_bVistaStyleFileDialog = false; + // 表示されたモーダルダイアログをキャンセルボタンで閉じるようにする + dialog::ModalDialogCloser closer; - // 落ちたり例外にならないこと - CDlgOpenFile cDlgOpenFile; - cDlgOpenFile.Create( - GetModuleHandle(nullptr), - nullptr, - L"*.extension_50_0_long_long_long_long_long_long_LONG;*.extension_50_1_long_long_long_long_long_long_LONG;*.extension_50_2_long_long_long_long_long_long_LONG;*.extension_50_3_long_long_long_long_long_long_LONG;*.extension_50_4_long_long_long_long_long_long_LONG;*.extension_50_5_long_long_long_long_long_long_LONG;*.extension_50_6_long_long_long_long_long_long_LONG;*.extension_50_7_long_long_long_long_long_long_LONG;*.extension_50_8_long_long_long_long_long_long_LONG;*.extension_50_9_long_long_long_long_long_long_LONG", - L"C:\\Windows", - std::vector(), - std::vector() - ); + // コマンドコードで、無理矢理動かす + const auto hWnd = pcEditWnd->GetHwnd(); + FORWARD_WM_COMMAND(hWnd, F_FILESAVEAS_DIALOG, nullptr, 0, pcEditWnd->DispatchEvent); } -TEST_F(DlgOpenFileTest, ommonItemDialogDefaltFilterMany) +/*! + * ファイルを開くダイアログの表示テスト + */ +TEST_P(FileDialogTest, GetOpenFileName101) { - GetDllShareData().m_Common.m_sEdit.m_bVistaStyleFileDialog = true; + // 表示されたモーダルダイアログをキャンセルボタンで閉じるようにする + dialog::ModalDialogCloser closer; - // 落ちたり例外にならないこと - CDlgOpenFile cDlgOpenFile; - cDlgOpenFile.Create( - GetModuleHandle(nullptr), - nullptr, - L"*.extension_50_0_long_long_long_long_long_long_LONG;*.extension_50_1_long_long_long_long_long_long_LONG;*.extension_50_2_long_long_long_long_long_long_LONG;*.extension_50_3_long_long_long_long_long_long_LONG;*.extension_50_4_long_long_long_long_long_long_LONG;*.extension_50_5_long_long_long_long_long_long_LONG;*.extension_50_6_long_long_long_long_long_long_LONG;*.extension_50_7_long_long_long_long_long_long_LONG;*.extension_50_8_long_long_long_long_long_long_LONG;*.extension_50_9_long_long_long_long_long_long_LONG", - L"C:\\Windows", - std::vector(), - std::vector() - ); + // コマンドコードで、無理矢理動かす + const auto hWnd = pcEditWnd->GetHwnd(); + FORWARD_WM_COMMAND(hWnd, F_LOADKEYMACRO, nullptr, 0, pcEditWnd->DispatchEvent); } + +/*! + * 名前を付けて保存ダイアログの表示テスト + */ +TEST_P(FileDialogTest, GetSaveFileName101) +{ + // 保存先のパスを作る + const auto path = GetExeFileName().replace_filename(L"test-save-file.txt"); + + // 上書き確認メッセージが出ないように、事前にパスを削除しておく + std::error_code ec; + std::filesystem::remove(path, ec); + + // キーマクロ保存が使えるようにダミーマクロを登録する + LPARAM lParams = 0L; + pcSMacroMgr->Append(STAND_KEYMACRO, F_0, &lParams, &pcEditWnd->GetView(0)); + + // 表示されたモーダルダイアログをキャンセルボタンで閉じるようにする + dialog::ModalDialogCloser closer; + + // コマンドコードで、無理矢理動かす + const auto hWnd = pcEditWnd->GetHwnd(); + FORWARD_WM_COMMAND(hWnd, F_SAVEKEYMACRO, nullptr, 0, pcEditWnd->DispatchEvent); + + // 保存したファイルを削除する + std::filesystem::remove(path, ec); +} + +/*! + * @brief パラメータテストをインスタンス化する + * Vistaスタイル有効/無効の2パターンで実体化させる + */ +INSTANTIATE_TEST_SUITE_P(FileDialog + , FileDialogTest + , ::testing::Values( + true, + false + ) +); + +} // namespace window From 27b2b43734dd0b9844ca8a3587a36bc94f6cc59c Mon Sep 17 00:00:00 2001 From: berryzplus Date: Sun, 12 Jul 2026 13:17:52 +0900 Subject: [PATCH 2/4] =?UTF-8?q?apiwrap::SetDlgItemTextW=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sakura_core/util/window.cpp | 11 +++++++++++ sakura_core/util/window.h | 2 ++ src/test/cpp/tests1/test-StdControl.cpp | 1 + 3 files changed, 14 insertions(+) diff --git a/sakura_core/util/window.cpp b/sakura_core/util/window.cpp index eff8c11ae0..bd483c1c19 100644 --- a/sakura_core/util/window.cpp +++ b/sakura_core/util/window.cpp @@ -318,6 +318,17 @@ bool IsDlgItemEnabled(HWND hWndDlg, int nIDDlgItem) return ret; } +/*! + * @brief ダイアログボックス項目のテキストを設定する + */ +bool SetDlgItemTextW(HWND hWndDlg, int nIDDlgItem, std::wstring_view text) +{ + // コントロールが存在しない場合は失敗とする + if (!::GetDlgItem(hWndDlg, nIDDlgItem)) return false; + + return ::SetDlgItemTextW(hWndDlg, nIDDlgItem, std::data(text)); +} + /*! * @brief トラックバーの現在位置を変更する */ diff --git a/sakura_core/util/window.h b/sakura_core/util/window.h index a34fd6823b..889b492038 100644 --- a/sakura_core/util/window.h +++ b/sakura_core/util/window.h @@ -145,6 +145,8 @@ void SetUpDownPos(HWND hWndDlg, int nIDDlgItem, WORD pos); SGetTextResult GetDlgItemTextW(HWND hWndDlg, int nIDDlgItem); SGetTextResult GetDlgItemTextW(HWND hWndDlg, int nIDDlgItem, std::span buffer); +bool SetDlgItemTextW(HWND hWndDlg, int nIDDlgItem, std::wstring_view text); + /*! * @brief トラックバーのデータ範囲を変更する */ diff --git a/src/test/cpp/tests1/test-StdControl.cpp b/src/test/cpp/tests1/test-StdControl.cpp index 0a5970708b..fc0a233d1f 100644 --- a/src/test/cpp/tests1/test-StdControl.cpp +++ b/src/test/cpp/tests1/test-StdControl.cpp @@ -314,6 +314,7 @@ TEST(ApiWrap, DlgItemTest001) { // アイテムにテキストを設定しておく ApiWrap::SetDlgItemTextW(hDlg, IDC_COMBO_TEXT, text); + apiwrap::SetDlgItemTextW(hDlg, IDC_COMBO_TEXT, text); // バッファサイズ指定せずに取得。正常に取得できる EXPECT_THAT(apiwrap::GetDlgItemTextW(hDlg, IDC_COMBO_TEXT), StrEq(text)); From 9244b5756c373bbe5b593a88ddeb2be0f73874c4 Mon Sep 17 00:00:00 2001 From: berryzplus Date: Sun, 12 Jul 2026 13:18:45 +0900 Subject: [PATCH 3/4] =?UTF-8?q?SelectFileTest=E3=82=92=E8=BF=BD=E5=8A=A0?= =?UTF-8?q?=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/cpp/tests1/test-cdlgopenfile.cpp | 114 ++++++++++++++++++++++ 1 file changed, 114 insertions(+) diff --git a/src/test/cpp/tests1/test-cdlgopenfile.cpp b/src/test/cpp/tests1/test-cdlgopenfile.cpp index 0ed29d6b84..58d6275e00 100644 --- a/src/test/cpp/tests1/test-cdlgopenfile.cpp +++ b/src/test/cpp/tests1/test-cdlgopenfile.cpp @@ -9,6 +9,8 @@ #include "window/EditorTestSuite.hpp" +#include + namespace window { /*! @@ -184,4 +186,116 @@ INSTANTIATE_TEST_SUITE_P(FileDialog ) ); +//! ファイル選択テストのためのフィクスチャクラス +struct SelectFileTest : public ::testing::Test, public window::EditorTestSuite, public window::UiaTestSuite { + static constexpr auto& text = L"test.ini"; + static inline auto path = GetExeFileName().replace_filename(text); + + static inline HWND hWnd = nullptr; + static inline HWND hWndDlg = nullptr; + static inline HWND hWndFolder = nullptr; + + static inline std::unique_ptr pcDlg = nullptr; + + /*! + * テストスイートの開始前に1回だけ呼ばれる関数 + */ + static void SetUpTestSuite() + { + SetUpUia(); + + SetUpEditor(); + + // ファイルが存在しない、のメッセージが出ないようにファイルを作る + std::ofstream ofs{ path }; + ofs.close(); + + constexpr HINSTANCE unusedArg1 = nullptr; + hWnd = pcEditWnd->GetHwnd(); + + // テスト用ダミーダイアログを作る + pcDlg = std::make_unique(); + hWndDlg = pcDlg->DoModeless(unusedArg1, hWnd, IDD_GREP, 0L, SW_SHOW); + EXPECT_THAT(hWndDlg, NotNull()); + + // ファイルパスを入力する項目のハンドルを取得する + hWndFolder = ::GetDlgItem(hWndDlg, IDC_COMBO_FOLDER); + EXPECT_THAT(hWndFolder, NotNull()); + + // ファイルパスの初期値に相対パスを入れる + apiwrap::SetDlgItemTextW(hWndDlg, IDC_COMBO_FOLDER, text); + } + + /*! + * テストスイートの終了後に1回だけ呼ばれる関数 + */ + static void TearDownTestSuite() + { + // テスト用ダミーダイアログを閉じる + pcDlg->CloseDialog(0); + + // 作成したファイルを削除する + std::error_code ec; + std::filesystem::remove(path, ec); + + TearDownEditor(); + + TearDownUia(); + } +}; + +/*! + * ファイル選択のテスト + */ +TEST_F(SelectFileTest, SelectFile001) +{ + constexpr bool resolvePath = true; // パス解決する場合のテスト + + std::jthread j([&] { + if (const auto hWndDlgOpenFile = WaitForDialog(L"開く")) { + EmulateSetValue(GetFocusedElement(), path.c_str()); // 絶対パスを入れる + EmulateHitEnter(); + } + }); + + EXPECT_THAT(CDlgOpenFile::SelectFile(hWndDlg, hWndFolder, L"*.ini", resolvePath, EFITER_NONE), IsTrue()); + + const auto ret = apiwrap::GetDlgItemTextW(hWndDlg, IDC_COMBO_FOLDER); + EXPECT_THAT(ret.c_str(), StrEq(text)); // 相対パスが設定される +} + + +/*! + * ファイル選択のテスト + */ +TEST_F(SelectFileTest, SelectFile002) +{ + constexpr bool resolvePath = false; // パス解決しない場合のテスト + + std::jthread j([&] { + if (const auto hWndDlgOpenFile = WaitForDialog(L"開く")) { + EmulateSetValue(GetFocusedElement(), path.c_str()); // 絶対パスを入れる + EmulateHitEnter(); + } + }); + + EXPECT_THAT(CDlgOpenFile::SelectFile(hWndDlg, hWndFolder, L"*.ini", resolvePath, EFITER_NONE), IsTrue()); + + const auto ret = apiwrap::GetDlgItemTextW(hWndDlg, IDC_COMBO_FOLDER); + EXPECT_THAT(ret.c_str(), StrEq(path.c_str())); // 絶対パスが設定される +} + +/*! + * ファイル選択のテスト + */ +TEST_F(SelectFileTest, SelectFile101) +{ + constexpr bool resolvePath = true; + + // 表示されたモーダルダイアログをキャンセルボタンで閉じるようにする + dialog::ModalDialogCloser closer; + + EXPECT_THAT(CDlgOpenFile::SelectFile(hWndDlg, hWndFolder, L"*.ini", resolvePath, EFITER_NONE), IsFalse()); +} + } // namespace window From 89c11893396beded62fea64bb264bdab1cdcbdb7 Mon Sep 17 00:00:00 2001 From: berryzplus Date: Sun, 12 Jul 2026 13:21:22 +0900 Subject: [PATCH 4/4] =?UTF-8?q?CDlgOpenFile=E3=81=AE=E5=BC=95=E6=95=B0?= =?UTF-8?q?=E3=82=92=E5=A4=89=E6=9B=B4=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 書き込みバッファーサイズを_MAX_PATH以上と仮定していた問題を潰す --- sakura_core/dlg/CDlgOpenFile.cpp | 11 +++--- sakura_core/dlg/CDlgOpenFile.h | 16 ++++---- .../dlg/CDlgOpenFile_CommonFileDialog.cpp | 37 +++++++++++++++---- .../dlg/CDlgOpenFile_CommonItemDialog.cpp | 29 ++++++++++++--- 4 files changed, 68 insertions(+), 25 deletions(-) diff --git a/sakura_core/dlg/CDlgOpenFile.cpp b/sakura_core/dlg/CDlgOpenFile.cpp index 15897ce7a4..db1f03836d 100644 --- a/sakura_core/dlg/CDlgOpenFile.cpp +++ b/sakura_core/dlg/CDlgOpenFile.cpp @@ -12,7 +12,7 @@ Copyright (C) 2004, genta Copyright (C) 2005, novice, ryoji Copyright (C) 2006, ryoji, Moca - Copyright (C) 2018-2022, Sakura Editor Organization + Copyright (C) 2018-2026, Sakura Editor Organization This source code is designed for sakura editor. Please contact the copyright holder to use this code for other purpose. @@ -20,6 +20,7 @@ #include "StdAfx.h" #include "dlg/CDlgOpenFile.h" + #include "env/DLLSHAREDATA.h" extern std::shared_ptr New_CDlgOpenFile_CommonFileDialog(); @@ -45,15 +46,15 @@ void CDlgOpenFile::Create( } inline bool CDlgOpenFile::DoModal_GetOpenFileName( - WCHAR* pszPath, + std::span szPath, EFilter eAddFileter) { - return m_pImpl->DoModal_GetOpenFileName(pszPath, eAddFileter); + return m_pImpl->DoModal_GetOpenFileName(szPath, eAddFileter); } -inline bool CDlgOpenFile::DoModal_GetSaveFileName( WCHAR* pszPath ) +inline bool CDlgOpenFile::DoModal_GetSaveFileName( std::span szPath ) { - return m_pImpl->DoModal_GetSaveFileName(pszPath); + return m_pImpl->DoModal_GetSaveFileName(szPath); } inline bool CDlgOpenFile::DoModalOpenDlg( diff --git a/sakura_core/dlg/CDlgOpenFile.h b/sakura_core/dlg/CDlgOpenFile.h index a3352fb54d..eead06242b 100644 --- a/sakura_core/dlg/CDlgOpenFile.h +++ b/sakura_core/dlg/CDlgOpenFile.h @@ -12,7 +12,7 @@ Copyright (C) 2004, genta, MIK Copyright (C) 2005, ryoji Copyright (C) 2006, Moca, ryoji - Copyright (C) 2018-2022, Sakura Editor Organization + Copyright (C) 2018-2026, Sakura Editor Organization This source code is designed for sakura editor. Please contact the copyright holder to use this code for other purpose. @@ -52,21 +52,21 @@ class IDlgOpenFile // 操作 /*! 開くダイアログ モーダルダイアログの表示 - @param[in,out] pszPath 初期ファイル名.選択されたファイル名の格納場所 + @param[in,out] szPath 初期ファイル名.選択されたファイル名の格納場所 @param[in] eAddFiler フィルタ設定 @retval true ユーザーがファイル名を選択してOKした @retval false ダイアログをユーザーがキャンセル等で閉じたかもしくは開くのに失敗したか */ virtual bool DoModal_GetOpenFileName( - WCHAR* pszPath, + std::span szPath, EFilter eAddFilter ) = 0; /*! 保存ダイアログ モーダルダイアログの表示 - @param pszPath [i/o] 初期ファイル名.選択されたファイル名の格納場所 + @param szPath [i/o] 初期ファイル名.選択されたファイル名の格納場所 */ virtual bool DoModal_GetSaveFileName( - WCHAR* pszPath + std::span szPath ) = 0; /* 開くダイアログ モーダルダイアログの表示 */ @@ -103,8 +103,8 @@ class CDlgOpenFile final : public IDlgOpenFile ) override; //操作 - bool DoModal_GetOpenFileName(WCHAR* pszPath, EFilter eAddFileter = EFITER_TEXT) override; - bool DoModal_GetSaveFileName(WCHAR* pszPath) override; + bool DoModal_GetOpenFileName(std::span szPath, EFilter eAddFileter = EFITER_TEXT) override; + bool DoModal_GetSaveFileName(std::span szPath) override; bool DoModalOpenDlg(SLoadInfo* pLoadInfo, std::vector* pFilenames, bool bOptions = true) override; @@ -115,7 +115,9 @@ class CDlgOpenFile final : public IDlgOpenFile bool resolvePath, EFilter eAddFilter = EFITER_TEXT); DISALLOW_COPY_AND_ASSIGN(CDlgOpenFile); + private: std::shared_ptr m_pImpl; }; + #endif /* SAKURA_CDLGOPENFILE_8084B9DB_6463_4168_BA59_132EB2596AE7_H_ */ diff --git a/sakura_core/dlg/CDlgOpenFile_CommonFileDialog.cpp b/sakura_core/dlg/CDlgOpenFile_CommonFileDialog.cpp index b48e4db7f7..874d27caf4 100644 --- a/sakura_core/dlg/CDlgOpenFile_CommonFileDialog.cpp +++ b/sakura_core/dlg/CDlgOpenFile_CommonFileDialog.cpp @@ -12,7 +12,7 @@ Copyright (C) 2004, genta Copyright (C) 2005, novice, ryoji Copyright (C) 2006, ryoji, Moca - Copyright (C) 2018-2022, Sakura Editor Organization + Copyright (C) 2018-2026, Sakura Editor Organization This source code is designed for sakura editor. Please contact the copyright holder to use this code for other purpose. @@ -71,8 +71,8 @@ struct CDlgOpenFile_CommonFileDialog final : public IDlgOpenFile const std::vector& vOPENFOLDER ) override; - bool DoModal_GetOpenFileName( WCHAR* pszPath, EFilter eAddFileter ) override; - bool DoModal_GetSaveFileName( WCHAR* pszPath ) override; + bool DoModal_GetOpenFileName(std::span szPath, EFilter eAddFileter) override; + bool DoModal_GetSaveFileName(std::span szPath) override; bool DoModalOpenDlg( SLoadInfo* pLoadInfo, std::vector*, bool bOptions ) override; bool DoModalSaveDlg( SSaveInfo* pSaveInfo, bool bSimpleMode ) override; @@ -699,8 +699,18 @@ void CDlgOpenFile_CommonFileDialog::Create( 拡張子フィルタの管理をCFileExtクラスで行う。 @date 2005.02.20 novice 拡張子を省略したら補完する */ -bool CDlgOpenFile_CommonFileDialog::DoModal_GetOpenFileName( WCHAR* pszPath, EFilter eAddFilter ) +bool CDlgOpenFile_CommonFileDialog::DoModal_GetOpenFileName( + std::span szPath, + EFilter eAddFilter +) { + const auto cchPath = std::size(szPath); + + assert(_MAX_PATH <= cchPath); + assert(cchPath <= UINT_MAX); + + auto pszPath = std::data(szPath); + //カレントディレクトリを保存。関数から抜けるときに自動でカレントディレクトリは復元される。 CCurrentDirectoryBackupPoint cCurDirBackup; @@ -767,7 +777,9 @@ bool CDlgOpenFile_CommonFileDialog::DoModal_GetOpenFileName( WCHAR* pszPath, EFi } pData->m_ofn.lpstrFile = pszPath; // To Here Jun. 23, 2002 genta - pData->m_ofn.nMaxFile = _MAX_PATH; + + pData->m_ofn.nMaxFile = DWORD(cchPath); + pData->m_ofn.lpstrInitialDir = m_szInitialDir; pData->m_ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; pData->m_ofn.lpstrDefExt = L""; // 2005/02/20 novice 拡張子を省略したら補完する @@ -793,8 +805,17 @@ bool CDlgOpenFile_CommonFileDialog::DoModal_GetOpenFileName( WCHAR* pszPath, EFi 拡張子フィルタの管理をCFileExtクラスで行う。 @date 2005.02.20 novice 拡張子を省略したら補完する */ -bool CDlgOpenFile_CommonFileDialog::DoModal_GetSaveFileName( WCHAR* pszPath ) +bool CDlgOpenFile_CommonFileDialog::DoModal_GetSaveFileName( + std::span szPath +) { + const auto cchPath = std::size(szPath); + + assert(_MAX_PATH <= cchPath); + assert(cchPath <= UINT_MAX); + + auto pszPath = std::data(szPath); + //カレントディレクトリを保存。関数から抜けるときに自動でカレントディレクトリは復元される。 CCurrentDirectoryBackupPoint cCurDirBackup; @@ -823,7 +844,9 @@ bool CDlgOpenFile_CommonFileDialog::DoModal_GetSaveFileName( WCHAR* pszPath ) pData->m_ofn.hInstance = CSelectLang::getLangRsrcInstance(); pData->m_ofn.lpstrFilter = cFileExt.GetExtFilter(); pData->m_ofn.lpstrFile = pszPath; // 2005/02/20 novice デフォルトのファイル名は何も設定しない - pData->m_ofn.nMaxFile = _MAX_PATH; + + pData->m_ofn.nMaxFile = DWORD(cchPath); + pData->m_ofn.lpstrInitialDir = m_szInitialDir; pData->m_ofn.Flags = OFN_CREATEPROMPT | OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT; diff --git a/sakura_core/dlg/CDlgOpenFile_CommonItemDialog.cpp b/sakura_core/dlg/CDlgOpenFile_CommonItemDialog.cpp index 8c7ea9d48e..f55327aa23 100644 --- a/sakura_core/dlg/CDlgOpenFile_CommonItemDialog.cpp +++ b/sakura_core/dlg/CDlgOpenFile_CommonItemDialog.cpp @@ -12,7 +12,7 @@ Copyright (C) 2004, genta Copyright (C) 2005, novice, ryoji Copyright (C) 2006, ryoji, Moca - Copyright (C) 2018-2022, Sakura Editor Organization + Copyright (C) 2018-2026, Sakura Editor Organization This source code is designed for sakura editor. Please contact the copyright holder to use this code for other purpose. @@ -50,8 +50,8 @@ struct CDlgOpenFile_CommonItemDialog final const std::vector& vOPENFOLDER ) override; - bool DoModal_GetOpenFileName( WCHAR* pszPath, EFilter eAddFileter ) override; - bool DoModal_GetSaveFileName( WCHAR* pszPath ) override; + bool DoModal_GetOpenFileName(std::span szPath, EFilter eAddFileter) override; + bool DoModal_GetSaveFileName(std::span szPath) override; bool DoModalOpenDlg( SLoadInfo* pLoadInfo, std::vector* pFileNames, bool bOptions ) override; @@ -426,8 +426,17 @@ void CDlgOpenFile_CommonItemDialog::Create( return; } -bool CDlgOpenFile_CommonItemDialog::DoModal_GetOpenFileName( WCHAR* pszPath, EFilter eAddFilter ) +bool CDlgOpenFile_CommonItemDialog::DoModal_GetOpenFileName( + std::span szPath, + EFilter eAddFilter +) { + const auto cchPath = std::size(szPath); + + assert(_MAX_PATH <= cchPath); + + auto pszPath = std::data(szPath); + // 2003.05.12 MIK std::vector specs; specs.reserve(7); @@ -464,7 +473,7 @@ bool CDlgOpenFile_CommonItemDialog::DoModal_GetOpenFileName( WCHAR* pszPath, EFi std::vector fileNames; bool ret = DoModalOpenDlgImpl0(false, &fileNames, L"", specs); if (ret) { - wcscpy(pszPath, fileNames[0].c_str()); + ::wcscpy_s(pszPath, cchPath, fileNames[0].c_str()); } return ret; } @@ -472,8 +481,16 @@ bool CDlgOpenFile_CommonItemDialog::DoModal_GetOpenFileName( WCHAR* pszPath, EFi /*! 保存ダイアログ モーダルダイアログの表示 @param pszPath [i/o] 初期ファイル名.選択されたファイル名の格納場所 */ -bool CDlgOpenFile_CommonItemDialog::DoModal_GetSaveFileName( WCHAR* pszPath ) +bool CDlgOpenFile_CommonItemDialog::DoModal_GetSaveFileName( + std::span szPath +) { + const auto cchPath = std::size(szPath); + + assert(_MAX_PATH <= cchPath); + + auto pszPath = std::data(szPath); + // 2010.08.28 カレントディレクトリを移動するのでパス解決する if( pszPath[0] ){ WCHAR szFullPath[_MAX_PATH];