Revision: 9361 https://osdn.net/projects/ttssh2/scm/svn/commits/9361 Author: zmatsuo Date: 2021-08-14 12:26:50 +0900 (Sat, 14 Aug 2021) Log Message: ----------- vtwin.cpp のファイル選択ダイアログのUnicode化 - ログの再生ファイル選択、Tera Term実行部分をUnicode化 - パス長上限制限 - hGetCurrentDirectoryW() 追加 win32helper.h Modified Paths: -------------- trunk/teraterm/common/win32helper.cpp trunk/teraterm/common/win32helper.h trunk/teraterm/teraterm/vtwin.cpp -------------- next part -------------- Modified: trunk/teraterm/common/win32helper.cpp =================================================================== --- trunk/teraterm/common/win32helper.cpp 2021-08-14 03:26:41 UTC (rev 9360) +++ trunk/teraterm/common/win32helper.cpp 2021-08-14 03:26:50 UTC (rev 9361) @@ -160,3 +160,27 @@ *fullpath = path; return NO_ERROR; } + +/** + * GetCurrentDirectoryW() \x82̓\xAE\x93I\x83o\x83b\x83t\x83@\x94\xC5 + * + * @param[out] dir \x83t\x83H\x83\x8B\x83_ + * \x95s\x97v\x82ɂȂ\xC1\x82\xBD\x82\xE7free()\x82\xB7\x82\xE9 + * @return \x83G\x83\x89\x81[\x83R\x81[\x83h,0(=NO_ERROR)\x82̂Ƃ\xAB\x83G\x83\x89\x81[\x82Ȃ\xB5 + */ +DWORD hGetCurrentDirectoryW(wchar_t **dir) +{ + DWORD len = GetCurrentDirectoryW(0, NULL); + if (len == 0) { + *dir = NULL; + return GetLastError(); + } + wchar_t *d = (wchar_t *)malloc(sizeof(wchar_t) * len); + DWORD r = GetCurrentDirectoryW(len, d); + if (len == 0) { + *dir = NULL; + return GetLastError(); + } + *dir = d; + return 0; +} Modified: trunk/teraterm/common/win32helper.h =================================================================== --- trunk/teraterm/common/win32helper.h 2021-08-14 03:26:41 UTC (rev 9360) +++ trunk/teraterm/common/win32helper.h 2021-08-14 03:26:50 UTC (rev 9361) @@ -37,6 +37,7 @@ DWORD hGetModuleFileNameW(HMODULE hModule, wchar_t **buf); DWORD hGetPrivateProfileStringW(const wchar_t *section, const wchar_t *key, const wchar_t *def, const wchar_t *ini, wchar_t **str); DWORD hGetFullPathNameW(const wchar_t *lpFileName, wchar_t **fullpath, wchar_t **filepart); +DWORD hGetCurrentDirectoryW(wchar_t **dir); #ifdef __cplusplus } Modified: trunk/teraterm/teraterm/vtwin.cpp =================================================================== --- trunk/teraterm/teraterm/vtwin.cpp 2021-08-14 03:26:41 UTC (rev 9360) +++ trunk/teraterm/teraterm/vtwin.cpp 2021-08-14 03:26:50 UTC (rev 9361) @@ -108,6 +108,7 @@ //#include "Usbiodef.h" DEFINE_GUID(GUID_DEVINTERFACE_USB_DEVICE, 0xA5DCBF10L, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, \ 0xC0, 0x4F, 0xB9, 0x51, 0xED); +#include "win32helper.h" #define VTClassName L"VTWin32" @@ -3942,46 +3943,53 @@ FLogClose(); } +static wchar_t *_get_lang_msg(const char *key, const wchar_t *def, const wchar_t *iniFile) +{ + wchar_t *uimsg; + GetI18nStrWW("Tera Term", key, def, iniFile, &uimsg); + return uimsg; +} + // \x83\x8D\x83O\x82̍Đ\xB6 (2006.12.13 yutaka) void CVTWindow::OnReplayLog() { - OPENFILENAME ofn; - char szFile[MAX_PATH]; - char Command[MAX_PATH] = "notepad.exe"; - const char *exec = "ttermpro"; - STARTUPINFO si; - PROCESS_INFORMATION pi; - char uimsg[MAX_UIMSG]; + OPENFILENAMEW ofn; + wchar_t szFile[MAX_PATH]; + const wchar_t *exec = L"ttermpro"; + wchar_t *filter; + wchar_t *title; + filter = _get_lang_msg("FILEDLG_OPEN_LOGFILE_FILTER", L"all(*.*)\\0*.*\\0\\0", ts.UILanguageFileW ); + title = _get_lang_msg("FILEDLG_OPEN_LOGFILE_TITLE", L"Select replay log file with binary mode", ts.UILanguageFileW); + // \x83o\x83C\x83i\x83\x8A\x83\x82\x81[\x83h\x82ō̎悵\x82\xBD\x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x82\xF0\x91I\x91\xF0\x82\xB7\x82\xE9 memset(&ofn, 0, sizeof(OPENFILENAME)); - memset(szFile, 0, sizeof(szFile)); - ofn.lStructSize = get_OPENFILENAME_SIZE(); + memset(szFile, 0, _countof(szFile)); + ofn.lStructSize = get_OPENFILENAME_SIZEW(); ofn.hwndOwner = HVTWin; - get_lang_msg("FILEDLG_OPEN_LOGFILE_FILTER", ts.UIMsg, sizeof(ts.UIMsg), - "all(*.*)\\0*.*\\0\\0", ts.UILanguageFile); - ofn.lpstrFilter = ts.UIMsg; + ofn.lpstrFilter = filter; ofn.lpstrFile = szFile; - ofn.nMaxFile = sizeof(szFile); + ofn.nMaxFile = _countof(szFile); ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; - ofn.lpstrDefExt = "log"; - get_lang_msg("FILEDLG_OPEN_LOGFILE_TITLE", uimsg, sizeof(uimsg), - "Select replay log file with binary mode", ts.UILanguageFile); - ofn.lpstrTitle = uimsg; - if(GetOpenFileName(&ofn) == 0) + ofn.lpstrDefExt = L"log"; + ofn.lpstrTitle = title; + BOOL r = GetOpenFileNameW(&ofn); + free(filter); + free(title); + if (r == FALSE) return; - // "/R"\x83I\x83v\x83V\x83\x87\x83\x93\x95t\x82\xAB\x82\xC5Tera Term\x82\xF0\x8BN\x93\xAE\x82\xB7\x82\xE9\x81i\x83\x8D\x83O\x82\xAA\x8DĐ\xB6\x82\xB3\x82\xEA\x82\xE9\x81j - _snprintf_s(Command, sizeof(Command), _TRUNCATE, - "%s /R=\"%s\"", exec, szFile); + wchar_t *Command; + aswprintf(&Command, L"%s /R=\"%s\"", exec, szFile); - memset(&si, 0, sizeof(si)); - GetStartupInfo(&si); - memset(&pi, 0, sizeof(pi)); + STARTUPINFOW si = {}; + PROCESS_INFORMATION pi = {}; + GetStartupInfoW(&si); - if (CreateProcess(NULL, Command, NULL, NULL, FALSE, 0, - NULL, NULL, &si, &pi) == 0) { + r = CreateProcessW(NULL, Command, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); + free(Command); + if (r == FALSE) { static const TTMessageBoxInfoW info = { "Tera Term", "MSG_ERROR", L"ERROR", @@ -4530,11 +4538,6 @@ FreeTTDLG(); } -static wchar_t *_get_lang_msg(const char *key, const wchar_t *def, const char *iniFile) -{ - return TTGetLangStrW("Tera Term", key, def, iniFile); -} - /* GetSetupFname function id */ typedef enum { GSF_SAVE, // Save setup @@ -4545,20 +4548,20 @@ static BOOL _GetSetupFname(HWND HWin, GetSetupFnameFuncId FuncId, PTTSet ts) { wchar_t *FNameFilter; - wchar_t TempDir[MAX_PATH]; - wchar_t DirW[MAX_PATH]; + wchar_t *TempDir; + wchar_t *DirW = NULL; wchar_t NameW[MAX_PATH]; - const char *UILanguageFile = ts->UILanguageFile; + const wchar_t *UILanguageFileW = ts->UILanguageFileW; /* save current dir */ - GetCurrentDirectoryW(_countof(TempDir), TempDir); + hGetCurrentDirectoryW(&TempDir); /* File name filter */ if (FuncId==GSF_LOADKEY) { - FNameFilter = _get_lang_msg("FILEDLG_KEYBOARD_FILTER", L"keyboard setup files (*.cnf)\\0*.cnf\\0\\0", UILanguageFile); + FNameFilter = _get_lang_msg("FILEDLG_KEYBOARD_FILTER", L"keyboard setup files (*.cnf)\\0*.cnf\\0\\0", UILanguageFileW); } else { - FNameFilter = _get_lang_msg("FILEDLG_SETUP_FILTER", L"setup files (*.ini)\\0*.ini\\0\\0", UILanguageFile); + FNameFilter = _get_lang_msg("FILEDLG_SETUP_FILTER", L"setup files (*.ini)\\0*.ini\\0\\0", UILanguageFileW); } if (FuncId==GSF_LOADKEY) { @@ -4566,8 +4569,7 @@ wchar_t *KeyCnfFNW = ts->KeyCnfFNW; GetFileNamePosW(KeyCnfFNW,&i,&j); wcsncpy_s(NameW, _countof(NameW),&KeyCnfFNW[j], _TRUNCATE); - memcpy(DirW, KeyCnfFNW, sizeof(wchar_t) * i); - DirW[i] = 0; + DirW = ExtractDirNameW(KeyCnfFNW); if ((wcslen(NameW) == 0) || (_wcsicmp(NameW, L"KEYBOARD.CNF") == 0)) { wcsncpy_s(NameW, _countof(NameW),L"KEYBOARD.CNF", _TRUNCATE); @@ -4578,8 +4580,7 @@ wchar_t *SetupFNameW = ts->SetupFNameW; GetFileNamePosW(SetupFNameW,&i,&j); wcsncpy_s(NameW, _countof(NameW),&SetupFNameW[j], _TRUNCATE); - memcpy(DirW, SetupFNameW, sizeof(wchar_t) * i); - DirW[i] = 0; + DirW = ExtractDirNameW(SetupFNameW); if ((wcslen(NameW) == 0) || (_wcsicmp(NameW, L"TERATERM.INI") == 0)) { wcsncpy_s(NameW, _countof(NameW), L"TERATERM.INI", _TRUNCATE); @@ -4586,10 +4587,8 @@ } } - if (wcslen(DirW) == 0) { - wchar_t *HomeDirW = ToWcharA(ts->HomeDir); - wcsncpy_s(DirW, _countof(DirW), HomeDirW, _TRUNCATE); - free(HomeDirW); + if (DirW == NULL) { + DirW = _wcsdup(ts->HomeDirW); } SetCurrentDirectoryW(DirW); @@ -4596,7 +4595,7 @@ /* OPENFILENAME record */ OPENFILENAMEW ofn = {}; - ofn.lStructSize = get_OPENFILENAME_SIZE(); + ofn.lStructSize = get_OPENFILENAME_SIZEW(); ofn.hwndOwner = HWin; ofn.lpstrFile = NameW; ofn.nMaxFile = sizeof(NameW); @@ -4617,7 +4616,7 @@ // ofn.lpstrInitialDir = __argv[0]; // ofn.lpstrInitialDir = ts->SetupFName; ofn.lpstrInitialDir = DirW; - ofn.lpstrTitle = _get_lang_msg("FILEDLG_SAVE_SETUP_TITLE", L"Tera Term: Save setup", UILanguageFile); + ofn.lpstrTitle = _get_lang_msg("FILEDLG_SAVE_SETUP_TITLE", L"Tera Term: Save setup", UILanguageFileW); Ok = GetSaveFileNameW(&ofn); if (Ok) { free(ts->SetupFNameW); @@ -4630,7 +4629,7 @@ case GSF_RESTORE: ofn.lpstrDefExt = L"ini"; ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_SHOWHELP; - ofn.lpstrTitle = _get_lang_msg("FILEDLG_RESTORE_SETUP_TITLE", L"Tera Term: Restore setup", UILanguageFile); + ofn.lpstrTitle = _get_lang_msg("FILEDLG_RESTORE_SETUP_TITLE", L"Tera Term: Restore setup", UILanguageFileW); Ok = GetOpenFileNameW(&ofn); if (Ok) { free(ts->SetupFNameW); @@ -4643,7 +4642,7 @@ case GSF_LOADKEY: ofn.lpstrDefExt = L"cnf"; ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_SHOWHELP; - ofn.lpstrTitle = _get_lang_msg("FILEDLG_LOAD_KEYMAP_TITLE", L"Tera Term: Load key map", UILanguageFile); + ofn.lpstrTitle = _get_lang_msg("FILEDLG_LOAD_KEYMAP_TITLE", L"Tera Term: Load key map", UILanguageFileW); Ok = GetOpenFileNameW(&ofn); if (Ok) { free(ts->KeyCnfFNW); @@ -4672,6 +4671,8 @@ /* restore dir */ SetCurrentDirectoryW(TempDir); + free(TempDir); + free(DirW); return Ok; }