Revision: 9306 https://osdn.net/projects/ttssh2/scm/svn/commits/9306 Author: zmatsuo Date: 2021-06-13 00:29:32 +0900 (Sun, 13 Jun 2021) Log Message: ----------- TTTSet構造体のファイルを保持するメンバをUnicode化,動的バッファ化した - common/tttypes.h - 次のメンバを追加 - wchar_t *HomeDirW; - wchar_t *SetupFNameW; - wchar_t *KeyCnfFNW; - wchar_t *LogFNW; - wchar_t *MacroFNW; - wchar_t *UILanguageFileW; - wchar_t *UILanguageFileW_ini; - 主要なメンバのみ - 従来の(ANSI文字列版)メンバーも利用可能 - Unicode版から変換 - 従来通りのフォルダ名に従来通りのファイル名で使用すれば問題は起きないはず - Tera Term内部はほとんど従来通り(ANSI文字版)を使用 Modified Paths: -------------- trunk/teraterm/common/codeconv.cpp trunk/teraterm/common/codeconv.h trunk/teraterm/common/ttlib.c trunk/teraterm/common/ttlib.h trunk/teraterm/common/ttlib_static_cpp.cpp trunk/teraterm/common/tttypes.h trunk/teraterm/teraterm/vtwin.cpp trunk/teraterm/ttpcmn/ttcmn.c trunk/teraterm/ttpdlg/ttdlg.c trunk/teraterm/ttpmacro/ttmacro.cpp trunk/teraterm/ttpmacro/ttmdlg.cpp trunk/teraterm/ttpmacro/ttmdlg.h trunk/teraterm/ttpset/ttset.c trunk/ttpmenu/ttpmenu.cpp -------------- next part -------------- Modified: trunk/teraterm/common/codeconv.cpp =================================================================== --- trunk/teraterm/common/codeconv.cpp 2021-06-12 15:29:23 UTC (rev 9305) +++ trunk/teraterm/common/codeconv.cpp 2021-06-12 15:29:32 UTC (rev 9306) @@ -1026,6 +1026,36 @@ return wstr_ptr; } +/** + * WideCharToMultiByte() \x82\xCC TRUNCATE + CP_ACP \x94\xC5 + * wchar_t \x82̃p\x83X,\x83t\x83@\x83C\x83\x8B\x96\xBC\x82\xF0 char \x82ɕϊ\xB7\x82\xB7\x82\xE9\x82Ƃ\xAB\x82Ɏg\x97p + * + * @param[in] wstr_ptr wchar_t \x82̕\xB6\x8E\x9A\x97\xF1 + * @param[in,out] mb_ptr char \x95\xB6\x8E\x9A\x97\xF1\x8Fo\x97͐\xE6ptr + * @param[in] mb_len char \x95\xB6\x8E\x9A\x97\xF1\x8Fo\x97͐\xE6\x83T\x83C\x83Y + */ +void WideCharToACP_t(const wchar_t *wstr_ptr, char *mb_ptr, size_t mb_len) +{ + const DWORD flags = 0; + size_t out_len = WideCharToMultiByte(CP_ACP, flags, wstr_ptr, -1, mb_ptr, mb_len, NULL, NULL); + if (out_len == 0) { + // \x95ϊ\xB7\x8E\xB8\x94s + DWORD err = GetLastError(); + if (err == ERROR_INSUFFICIENT_BUFFER) { + // wstr_ptr \x82̒\xB7\x82\xB3\x82\xF0 -1 \x82Ŏw\x92肵\x82āAmb_len \x82\xAA\x95s\x91\xAB\x82\xB5\x82Ă\xA2\x82\xE9\x82Ƃ\xAB + // \x83o\x83b\x83t\x83@\x82\xA2\x82\xC1\x82ς\xA2\x82ɕϊ\xB7\x82͍s\x82\xED\x82\xEA\x82Ă\xA2\x82\xE9 + mb_ptr[mb_len - 1] = 0; + } + else { + mb_ptr[0] = 0; + } + } + else if (out_len == mb_len) { + // TRUNCATE + mb_ptr[mb_len - 1] = 0; + } +} + char *ToCharW(const wchar_t *strW) { if (strW == NULL) return NULL; Modified: trunk/teraterm/common/codeconv.h =================================================================== --- trunk/teraterm/common/codeconv.h 2021-06-12 15:29:23 UTC (rev 9305) +++ trunk/teraterm/common/codeconv.h 2021-06-12 15:29:32 UTC (rev 9306) @@ -57,6 +57,7 @@ void WideCharToUTF32(const wchar_t *wstr_ptr, size_t *wstr_len_, char32_t *u32_ptr, size_t *u32_len_); int UTF8ToWideChar(const char *u8_ptr, int u8_len, wchar_t *wstr_ptr, int wstr_len); +void WideCharToACP_t(const wchar_t *wstr_ptr, char *mb_ptr, size_t mb_len); // API wrappers char *_WideCharToMultiByte(const wchar_t *wstr_ptr, size_t wstr_len, int code_page, size_t *mb_len_); Modified: trunk/teraterm/common/ttlib.c =================================================================== --- trunk/teraterm/common/ttlib.c 2021-06-12 15:29:23 UTC (rev 9305) +++ trunk/teraterm/common/ttlib.c 2021-06-12 15:29:32 UTC (rev 9306) @@ -42,6 +42,7 @@ #include "teraterm.h" #include "tttypes.h" #include "compat_win.h" +#include "codeconv.h" #include "../teraterm/unicode_test.h" @@ -982,32 +983,6 @@ } /* - * Get home(exe,dll) directory - * @param[in] hInst WinMain()\x82\xCC HINSTANCE \x82܂\xBD\x82\xCD NULL - * @param[in,out] HomeDir - * @param[out] HomeDirLen - */ -void GetHomeDir(HINSTANCE hInst, char *HomeDir, size_t HomeDirLen) -{ - char Temp[MAX_PATH]; - DWORD result = GetModuleFileName(NULL,Temp,sizeof(Temp)); - if (result == 0 || result == _countof(Temp)) { - // \x83p\x83X\x82̎擾\x82Ɏ\xB8\x94s\x82\xB5\x82\xBD\x81B\x92v\x96\xBD\x93I\x81Aabort() \x82\xB7\x82\xE9\x81B - abort(); - // \x82\xB1\x82\xB1\x82\xC5return\x82\xB5\x82Ă\xE0\x83v\x83\x89\x83O\x83C\x83\x93(ttpset.dll)\x82̃\x8D\x81[\x83h\x82Ɏ\xB8\x94s\x82\xB5\x82\xC4abort()\x82\xB7\x82\xE9 - } - ExtractDirName(Temp, Temp); - strncpy_s(HomeDir, HomeDirLen, Temp, _TRUNCATE); -} - -// \x83f\x83t\x83H\x83\x8B\x83g\x82\xCC TERATERM.INI \x82̃t\x83\x8B\x83p\x83X\x82\xF0 ttpmacro \x82\xA9\x82\xE7\x82\xE0 -// \x8E擾\x82\xB7\x82邽\x82߂ɒlj\xC1\x82\xB5\x82\xBD\x81B(2007.2.18 maya) -void GetDefaultSetupFName(const char *home, char *dest, int destlen) -{ - GetDefaultFName(home, "TERATERM.INI", dest, destlen); -} - -/* * UILanguageFile\x82̃t\x83\x8B\x83p\x83X\x82\xF0\x8E擾\x82\xB7\x82\xE9 * * @param[in] HomeDir exe,dll\x82̑\xB6\x8D݂\xB7\x82\xE9\x83t\x83H\x83\x8B\x83_ GetHomeDir()\x82Ŏ擾\x82ł\xAB\x82\xE9 @@ -1027,43 +1002,30 @@ SetCurrentDirectory(CurDir); } -void GetUILanguageFile(char *buf, int buflen) -{ - char HomeDir[MAX_PATH]; - char Temp[MAX_PATH]; - char SetupFName[MAX_PATH]; - - /* Get home directory */ - GetHomeDir(NULL, HomeDir, sizeof(HomeDir)); - - /* Get SetupFName */ - GetDefaultSetupFName(HomeDir, SetupFName, sizeof(SetupFName)); - - /* Get LanguageFile name */ - GetPrivateProfileString("Tera Term", "UILanguageFile", "lang\\Default.lng", - Temp, sizeof(Temp), SetupFName); - - GetUILanguageFileFull(HomeDir, Temp, buf, buflen); -} - // \x8Ew\x92肵\x82\xBD\x83G\x83\x93\x83g\x83\x8A\x82\xF0 teraterm.ini \x82\xA9\x82\xE7\x93ǂݎ\xE6\x82\xE9 (2009.3.23 yutaka) void GetOnOffEntryInifile(char *entry, char *buf, int buflen) { - char HomeDir[MAX_PATH]; - char Temp[MAX_PATH]; - char SetupFName[MAX_PATH]; + wchar_t *HomeDirW; + wchar_t Temp[MAX_PATH]; + wchar_t *SetupFName; + wchar_t *entryW = ToWcharA(entry); + char * TempA; /* Get home directory */ - GetHomeDir(NULL, HomeDir, sizeof(HomeDir)); + HomeDirW = GetHomeDirW(NULL); /* Get SetupFName */ - GetDefaultSetupFName(HomeDir, SetupFName, sizeof(SetupFName)); + SetupFName = GetDefaultSetupFNameW(HomeDirW); /* Get LanguageFile name */ - GetPrivateProfileString("Tera Term", entry, "off", - Temp, sizeof(Temp), SetupFName); + GetPrivateProfileStringW(L"Tera Term", entryW, L"off", + Temp, _countof(Temp), SetupFName); - strncpy_s(buf, buflen, Temp, _TRUNCATE); + TempA = ToCharW(Temp); + strncpy_s(buf, buflen, TempA, _TRUNCATE); + free(HomeDirW); + free(SetupFName); + free(TempA); } void get_lang_msgW(const char *key, wchar_t *buf, int buf_len, const wchar_t *def, const char *iniFile) Modified: trunk/teraterm/common/ttlib.h =================================================================== --- trunk/teraterm/common/ttlib.h 2021-06-12 15:29:23 UTC (rev 9305) +++ trunk/teraterm/common/ttlib.h 2021-06-12 15:29:32 UTC (rev 9306) @@ -46,6 +46,7 @@ BOOL GetFileNamePosW(const wchar_t *PathName, size_t *DirLen, size_t *FNPos); DllExport BOOL ExtractFileName(PCHAR PathName, PCHAR FileName, int destlen); DllExport BOOL ExtractDirName(PCHAR PathName, PCHAR DirName); +wchar_t *ExtractDirNameW(const wchar_t *PathName); void FitFileName(PCHAR FileName, int destlen, const char *DefExt); void AppendSlash(PCHAR Path, int destlen); void AppendSlashW(wchar_t *Path, size_t destlen); @@ -79,12 +80,13 @@ void GetNthNum(PCHAR Source, int Nth, int far *Num); int GetNthNum2(PCHAR Source, int Nth, int defval); void GetDownloadFolder(char *dest, int destlen); -void GetHomeDir(HINSTANCE hInst, char *HomeDir, size_t HomeDirLen); +wchar_t *GetHomeDirW(HINSTANCE hInst); void GetDefaultFName(const char *home, const char *file, char *dest, int destlen); -void GetDefaultSetupFName(const char *home, char *dest, int destlen); -void GetUILanguageFile(char *buf, int buflen); +wchar_t *GetDefaultFNameW(const wchar_t *home, const wchar_t *file); +wchar_t *GetDefaultSetupFNameW(const wchar_t *home); void GetUILanguageFileFull(const char *HomeDir, const char *UILanguageFileRel, char *UILanguageFileFull, size_t UILanguageFileFullLen); +wchar_t *GetUILanguageFileFullW(const wchar_t *HomeDir, const wchar_t *UILanguageFileRel); void GetOnOffEntryInifile(char *entry, char *buf, int buflen); void get_lang_msg(const char *key, PCHAR buf, int buf_len, const char *def, const char *iniFile); void get_lang_msgW(const char *key, wchar_t *buf, int buf_len, const wchar_t *def, const char *iniFile); Modified: trunk/teraterm/common/ttlib_static_cpp.cpp =================================================================== --- trunk/teraterm/common/ttlib_static_cpp.cpp 2021-06-12 15:29:23 UTC (rev 9305) +++ trunk/teraterm/common/ttlib_static_cpp.cpp 2021-06-12 15:29:32 UTC (rev 9306) @@ -35,10 +35,13 @@ #include <stdlib.h> #include <crtdbg.h> #include <assert.h> +#include <wchar.h> #include "i18n.h" #include "layer_for_unicode.h" #include "asprintf.h" +#include "win32helper.h" +#include "codeconv.h" #include "ttlib.h" @@ -794,3 +797,116 @@ return (int)j; } + +/** + * ExtractDirName() \x82\xCC wchar_t \x94\xC5 + */ +wchar_t *ExtractDirNameW(const wchar_t *PathName) +{ + size_t i; + wchar_t *DirName = _wcsdup(PathName); + if (!GetFileNamePosW(DirName, &i, NULL)) + return NULL; + DirName[i] = 0; + return DirName; +} + +/* + * Get home(exe,dll) directory + * + * @param[in] hInst WinMain()\x82\xCC HINSTANCE \x82܂\xBD\x82\xCD NULL + * @return HomeDir + */ +wchar_t *GetHomeDirW(HINSTANCE hInst) +{ + wchar_t *TempW; + wchar_t *dir; + DWORD error = hGetModuleFileNameW(NULL, &TempW); + if (error != 0) { + // \x83p\x83X\x82̎擾\x82Ɏ\xB8\x94s\x82\xB5\x82\xBD\x81B\x92v\x96\xBD\x93I\x81Aabort() \x82\xB7\x82\xE9\x81B + abort(); + // \x82\xB1\x82\xB1\x82\xC5return\x82\xB5\x82Ă\xE0\x83v\x83\x89\x83O\x83C\x83\x93(ttpset.dll)\x82̃\x8D\x81[\x83h\x82Ɏ\xB8\x94s\x82\xB5\x82\xC4abort()\x82\xB7\x82\xE9 + } + dir = ExtractDirNameW(TempW); + free(TempW); + return dir; +} + +/* + * UILanguageFile\x82̃t\x83\x8B\x83p\x83X\x82\xF0\x8E擾\x82\xB7\x82\xE9 + * + * @param[in] HomeDir exe,dll\x82̑\xB6\x8D݂\xB7\x82\xE9\x83t\x83H\x83\x8B\x83_ GetHomeDir()\x82Ŏ擾\x82ł\xAB\x82\xE9 + * @param[in] UILanguageFileRel lng\x83t\x83@\x83C\x83\x8B\x81AHomeDir\x82\xA9\x82\xE7\x82̑\x8A\x91p\x83X + * @param[in,out] UILanguageFileFull lng\x83t\x83@\x83C\x83\x8Bptr\x81A\x83t\x83\x8B\x83p\x83X + * @param[in] UILanguageFileFullLen lng\x83t\x83@\x83C\x83\x8Blen\x81A\x83t\x83\x8B\x83p\x83X + */ +wchar_t *GetUILanguageFileFullW(const wchar_t *HomeDir, const wchar_t *UILanguageFileRel) +{ + wchar_t *fullpath; + size_t size = wcslen(HomeDir) + 1 + wcslen(UILanguageFileRel) + 1; + wchar_t *rel = (wchar_t *)malloc(sizeof(wchar_t) * size); + wcscpy(rel, HomeDir); + wcscat(rel, L"\\"); + wcscat(rel, UILanguageFileRel); + hGetFullPathNameW(rel, &fullpath, NULL); + free(rel); + return fullpath; +} + +/** + * \x90ݒ\xE8\x83t\x83@\x83C\x83\x8B\x82̃t\x83\x8B\x83p\x83X\x82\xF0\x8E擾\x82\xB7\x82\xE9 + * GetDefaultFName() \x82\xCC wchar_t\x94\xC5 + * + * @param[in] home ttermpro.exe \x93\x99\x82̎\xC0\x8Ds\x83t\x83@\x83C\x83\x8B\x82̂\xA0\x82\xE9\x83t\x83H\x83\x8B\x83_ + * My Documents \x82Ƀt\x83@\x83C\x83\x8B\x82\xAA\x82\xA0\x82\xC1\x82\xBD\x8Fꍇ\x82͎g\x97p\x82\xB3\x82\xEA\x82Ȃ\xA2 + * @param[in] file \x90ݒ\xE8\x83t\x83@\x83C\x83\x8B\x96\xBC + * @return \x83t\x83\x8B\x83p\x83X + */ +wchar_t *GetDefaultFNameW(const wchar_t *home, const wchar_t *file) +{ + // My Documents \x82\xC9 file \x82\xAA\x82\xA0\x82\xE9\x8Fꍇ\x81A + // \x82\xBB\x82\xEA\x82\xF0\x93ǂݍ\x9E\x82ނ悤\x82ɂ\xB5\x82\xBD\x81B(2007.2.18 maya) + wchar_t MyDoc[MAX_PATH]; + LPITEMIDLIST pidl; + + IMalloc *pmalloc; + SHGetMalloc(&pmalloc); + if (SHGetSpecialFolderLocation(NULL, CSIDL_PERSONAL, &pidl) == S_OK) { + SHGetPathFromIDListW(pidl, MyDoc); + pmalloc->Free(pidl); + pmalloc->Release(); + } + else { + pmalloc->Release(); + MyDoc[0] = 0; + } + + if (MyDoc[0] != 0) { + // My Documents \x82\xC9 file \x82\xAA\x82\xA0\x82邩? + size_t destlen = (wcslen(MyDoc) + wcslen(file) + 1 + 1) * sizeof(wchar_t); + wchar_t *dest = (wchar_t *)malloc(sizeof(wchar_t) * destlen); + wcscpy(dest, MyDoc); + AppendSlashW(dest,destlen); + wcsncat_s(dest, destlen, file, _TRUNCATE); + if (GetFileAttributesW(dest) != INVALID_FILE_ATTRIBUTES) { + // My Documents \x82̐ݒ\xE8\x83t\x83@\x83C\x83\x8B + return dest; + } + free(dest); + } + + size_t destlen = (wcslen(home) + wcslen(file) + 1 + 1) * sizeof(wchar_t); + wchar_t *dest = (wchar_t *)malloc(sizeof(wchar_t) * destlen); + wcscpy(dest, home); + AppendSlashW(dest,destlen); + wcsncat_s(dest, destlen, file, _TRUNCATE); + return dest; +} + +// \x83f\x83t\x83H\x83\x8B\x83g\x82\xCC TERATERM.INI \x82̃t\x83\x8B\x83p\x83X\x82\xF0\x8E擾 +wchar_t *GetDefaultSetupFNameW(const wchar_t *home) +{ + const wchar_t *ini = L"TERATERM.INI"; + wchar_t *buf = GetDefaultFNameW(home, ini); + return buf; +} Modified: trunk/teraterm/common/tttypes.h =================================================================== --- trunk/teraterm/common/tttypes.h 2021-06-12 15:29:23 UTC (rev 9305) +++ trunk/teraterm/common/tttypes.h 2021-06-12 15:29:32 UTC (rev 9306) @@ -362,7 +362,7 @@ struct tttset { /*------ VTSet --------*/ /* Tera Term home directory */ - char HomeDir[MAXPATHLEN]; + char HomeDir[MAXPATHLEN]; // ttermpro.exe \x82̂\xA0\x82\xE9\x83t\x83H\x83\x8B\x83_ /* Setup file name */ char SetupFName[MAX_PATH]; @@ -526,7 +526,7 @@ #ifdef USE_NORMAL_BGCOLOR WORD UseNormalBGColor; #endif - char UILanguageFile[MAX_PATH]; + char UILanguageFile[MAX_PATH]; // \x90\xE2\x91p\x83X char UIMsg[MAX_UIMSG]; WORD BroadcastCommandHistory; WORD AcceptBroadcast; // 337: 2007/03/20 @@ -539,7 +539,7 @@ WORD DisableAppCursor; WORD ClearComBuffOnOpen; WORD Send8BitCtrl; - char UILanguageFile_ini[MAX_PATH]; + char UILanguageFile_ini[MAX_PATH]; // \x91\x8A\x91p\x83X,ini\x83t\x83@\x83C\x83\x8B\x82̒\x86\x90g WORD SelectOnlyByLButton; WORD TelAutoDetect; char XModemRcvCommand[MAX_PATH]; @@ -647,6 +647,13 @@ BYTE UnicodeAmbiguousWidth; BYTE UnicodeEmojiOverride; BYTE UnicodeEmojiWidth; + wchar_t *HomeDirW; // ttermpro.exe \x82̂\xA0\x82\xE9\x83t\x83H\x83\x8B\x83_ + wchar_t *SetupFNameW; + wchar_t *KeyCnfFNW; + wchar_t *LogFNW; + wchar_t *MacroFNW; + wchar_t *UILanguageFileW; // \x90\xE2\x91p\x83X + wchar_t *UILanguageFileW_ini; // \x91\x8A\x91p\x83X,ini\x83t\x83@\x83C\x83\x8B\x82̒\x86\x90g }; typedef struct tttset TTTSet, *PTTSet; Modified: trunk/teraterm/teraterm/vtwin.cpp =================================================================== --- trunk/teraterm/teraterm/vtwin.cpp 2021-06-12 15:29:23 UTC (rev 9305) +++ trunk/teraterm/teraterm/vtwin.cpp 2021-06-12 15:29:32 UTC (rev 9306) @@ -3364,17 +3364,12 @@ /* Auto start logging or /L= option */ if (ts.LogAutoStart || ts.LogFN[0] != 0) { - if (ts.LogFN[0] == 0) { - wchar_t *filenameW = FLogGetLogFilename(NULL); - char *filenameA = ToCharW(filenameW); - strncpy_s(ts.LogFN, sizeof(ts.LogFN), filenameA, _TRUNCATE); - free(filenameA); - free(filenameW); + if (ts.LogFN == NULL || ts.LogFN[0] == 0) { + ts.LogFNW = FLogGetLogFilename(NULL); + WideCharToACP_t(ts.LogFNW, ts.LogFN, sizeof(ts.LogFN)); } if (ts.LogFN[0]!=0) { - wchar_t *fnW = ToWcharA(ts.LogFN); - FLogOpen(fnW, LOG_UTF8, FALSE); - free(fnW); + FLogOpen(ts.LogFNW, LOG_UTF8, FALSE); } } Modified: trunk/teraterm/ttpcmn/ttcmn.c =================================================================== --- trunk/teraterm/ttpcmn/ttcmn.c 2021-06-12 15:29:23 UTC (rev 9305) +++ trunk/teraterm/ttpcmn/ttcmn.c 2021-06-12 15:29:32 UTC (rev 9306) @@ -110,7 +110,6 @@ memcpy(&pm->ts, ts, sizeof(TTTSet)); } - BOOL WINAPI StartTeraTerm(PTTSet ts) { if (FirstInstance) { @@ -129,15 +128,17 @@ // if (FirstInstance) { \x82̕\x94\x95\xAA\x82\xA9\x82\xE7\x88ړ\xAE (2008.3.13 maya) // \x8BN\x93\xAE\x8E\x9E\x82ɂ́A\x8B\xA4\x97L\x83\x81\x83\x82\x83\x8A\x82\xCC HomeDir \x82\xC6 SetupFName \x82͋\xF3\x82ɂȂ\xE9 - /* Get home directory */ - GetHomeDir(hInst, ts->HomeDir, sizeof(ts->HomeDir)); - _chdir(ts->HomeDir); - GetDefaultSetupFName(ts->HomeDir, ts->SetupFName, sizeof(ts->SetupFName)); + /* Get home directory (ttermpro.exe\x82̃t\x83H\x83\x8B\x83_) */ + ts->HomeDirW = GetHomeDirW(hInst); + WideCharToACP_t(ts->HomeDirW, ts->HomeDir, _countof(ts->HomeDir)); + SetCurrentDirectoryW(ts->HomeDirW); - strncpy_s(ts->KeyCnfFN, sizeof(ts->KeyCnfFN), ts->HomeDir, _TRUNCATE); - AppendSlash(ts->KeyCnfFN, sizeof(ts->KeyCnfFN)); - strncat_s(ts->KeyCnfFN, sizeof(ts->KeyCnfFN), "KEYBOARD.CNF", _TRUNCATE); + ts->SetupFNameW = GetDefaultSetupFNameW(ts->HomeDirW); + WideCharToACP_t(ts->SetupFNameW, ts->SetupFName, _countof(ts->SetupFName)); + ts->KeyCnfFNW = GetDefaultFNameW(ts->HomeDirW, L"KEYBOARD.CNF"); + WideCharToACP_t(ts->KeyCnfFNW, ts->KeyCnfFN, _countof(ts->KeyCnfFN)); + if (FirstInstance) { FirstInstance = FALSE; return TRUE; Modified: trunk/teraterm/ttpdlg/ttdlg.c =================================================================== --- trunk/teraterm/ttpdlg/ttdlg.c 2021-06-12 15:29:23 UTC (rev 9305) +++ trunk/teraterm/ttpdlg/ttdlg.c 2021-06-12 15:29:32 UTC (rev 9306) @@ -53,6 +53,7 @@ #include "codeconv.h" #include "helpid.h" #include "layer_for_unicode.h" +#include "asprintf.h" // Oniguruma: Regular expression library #define ONIG_EXTERN extern @@ -3015,11 +3016,11 @@ // \x8C\xBE\x8C\xEA\x83t\x83@\x83C\x83\x8B\x82\xAA\x95ύX\x82\xB3\x82\xEA\x82Ă\xA2\x82\xBD\x8Fꍇ w = (WORD)GetCurSel(Dialog, IDC_GENLANG_UI); if (1 <= w && w <= uilist_count && w != langui_sel) { - _snprintf_s(ts->UILanguageFile_ini, sizeof(ts->UILanguageFile_ini), _TRUNCATE, - "%s\\%s", get_lang_folder(), LangUIList[w - 1]); + aswprintf(&ts->UILanguageFileW_ini, L"%hs\\%hs", get_lang_folder(), LangUIList[w - 1]); + WideCharToACP_t(ts->UILanguageFileW_ini, ts->UILanguageFile_ini, sizeof(ts->UILanguageFile_ini)); - GetUILanguageFileFull(ts->HomeDir, ts->UILanguageFile_ini, - ts->UILanguageFile, sizeof(ts->UILanguageFile)); + ts->UILanguageFileW = GetUILanguageFileFullW(ts->HomeDirW, ts->UILanguageFileW_ini); + WideCharToACP_t(ts->UILanguageFileW, ts->UILanguageFile, sizeof(ts->UILanguageFileW)); // \x83^\x83C\x83g\x83\x8B\x82̍X\x90V\x82\xF0\x8Ds\x82\xA4\x81B(2014.2.23 yutaka) PostMessage(GetParent(Dialog),WM_USER_CHANGETITLE,0,0); Modified: trunk/teraterm/ttpmacro/ttmacro.cpp =================================================================== --- trunk/teraterm/ttpmacro/ttmacro.cpp 2021-06-12 15:29:23 UTC (rev 9305) +++ trunk/teraterm/ttpmacro/ttmacro.cpp 2021-06-12 15:29:32 UTC (rev 9306) @@ -40,6 +40,7 @@ #include "tmfc.h" #include "dlglib.h" #include "dllutil.h" +#include "codeconv.h" #include "ttm_res.h" #include "ttmmain.h" @@ -53,7 +54,8 @@ #endif char UILanguageFile[MAX_PATH]; -static char SetupFName[MAX_PATH]; +static wchar_t *SetupFNameW; +static char *SetupFName; static HWND CtrlWnd; static HINSTANCE hInst; @@ -75,8 +77,12 @@ char UILanguageFileRel[MAX_PATH]; LOGFONTA logfont; - GetHomeDir(hInst, HomeDir, sizeof(HomeDir)); - GetDefaultFName(HomeDir, "TERATERM.INI", SetupFName, sizeof(SetupFName)); + HomeDirW = GetHomeDirW(hInst); + char *HomeDirA = ToCharW(HomeDirW); + strcpy_s(HomeDir, sizeof(HomeDir), HomeDirA); + free(HomeDirA); + SetupFNameW = GetDefaultFNameW(HomeDirW, L"TERATERM.INI"); + SetupFName = ToCharW(SetupFNameW); GetPrivateProfileString("Tera Term", "UILanguageFile", "lang\\Default.lng", UILanguageFileRel, sizeof(UILanguageFileRel), SetupFName); GetUILanguageFileFull(HomeDir, UILanguageFileRel, Modified: trunk/teraterm/ttpmacro/ttmdlg.cpp =================================================================== --- trunk/teraterm/ttpmacro/ttmdlg.cpp 2021-06-12 15:29:23 UTC (rev 9305) +++ trunk/teraterm/ttpmacro/ttmdlg.cpp 2021-06-12 15:29:32 UTC (rev 9306) @@ -56,6 +56,7 @@ #include "ttmdlg.h" char HomeDir[MAX_PATH]; +wchar_t *HomeDirW; char FileName[MAX_PATH]; char TopicName[11]; char ShortName[MAX_PATH]; @@ -293,4 +294,3 @@ } return r == IDCANCEL ? -1 : -2; } - Modified: trunk/teraterm/ttpmacro/ttmdlg.h =================================================================== --- trunk/teraterm/ttpmacro/ttmdlg.h 2021-06-12 15:29:23 UTC (rev 9305) +++ trunk/teraterm/ttpmacro/ttmdlg.h 2021-06-12 15:29:32 UTC (rev 9306) @@ -51,6 +51,7 @@ int OpenListDlg(const wchar_t *Text, const wchar_t *Caption, wchar_t **Lists, int Selected); extern char HomeDir[MAX_PATH]; +extern wchar_t *HomeDirW; extern char FileName[MAX_PATH]; extern char TopicName[11]; extern char ShortName[MAX_PATH]; Modified: trunk/teraterm/ttpset/ttset.c =================================================================== --- trunk/teraterm/ttpset/ttset.c 2021-06-12 15:29:23 UTC (rev 9305) +++ trunk/teraterm/ttpset/ttset.c 2021-06-12 15:29:32 UTC (rev 9306) @@ -46,6 +46,7 @@ #include "tt_res.h" #include "servicenames.h" #include "codeconv.h" +#include "win32helper.h" #define DllExport __declspec(dllexport) #include "ttset.h" @@ -56,6 +57,7 @@ #define INI_FILE_IS_UNICODE 1 #define Section "Tera Term" +#define SectionW L"Tera Term" #define MaxStrLen (LONG)512 @@ -1698,8 +1700,8 @@ GetPrivateProfileInt(Section, "SendBreakTime", 1000, FName); /* Startup macro -- special option */ - GetPrivateProfileString(Section, "StartupMacro", "", - ts->MacroFN, sizeof(ts->MacroFN), FName); + hGetPrivateProfileStringW(SectionW, L"StartupMacro", L"", FName, &ts->MacroFNW); + WideCharToACP_t(ts->MacroFNW, ts->MacroFN, sizeof(ts->MacroFN)); /* TEK GIN Mouse keycode -- special option */ ts->GINMouseCode = @@ -1901,13 +1903,17 @@ strncpy_s(ts->Locale, sizeof(ts->Locale), Temp, _TRUNCATE); // UI language message file (\x91\x8A\x91p\x83X) - GetPrivateProfileString(Section, "UILanguageFile", "lang\\Default.lng", - ts->UILanguageFile_ini, sizeof(ts->UILanguageFile_ini), FName); + hGetPrivateProfileStringW(SectionW, L"UILanguageFile", NULL, FName, &ts->UILanguageFileW_ini); + if (ts->UILanguageFileW_ini == NULL) { + ts->UILanguageFileW_ini = wcsdup(L"lang\\Default.lng"); + } + WideCharToACP_t(ts->UILanguageFileW_ini, ts->UILanguageFile_ini, sizeof(ts->UILanguageFile_ini)); // UI language message file (full path) - GetUILanguageFileFull(ts->HomeDir, ts->UILanguageFile_ini, - ts->UILanguageFile, sizeof(ts->UILanguageFile)); + ts->UILanguageFileW = GetUILanguageFileFullW(ts->HomeDirW, ts->UILanguageFileW_ini); + WideCharToACP_t(ts->UILanguageFileW, ts->UILanguageFile, sizeof(ts->UILanguageFile)); + // Broadcast Command History (2007.3.3 maya) ts->BroadcastCommandHistory = GetOnOff(Section, "BroadcastCommandHistory", FName, FALSE); Modified: trunk/ttpmenu/ttpmenu.cpp =================================================================== --- trunk/ttpmenu/ttpmenu.cpp 2021-06-12 15:29:23 UTC (rev 9305) +++ trunk/ttpmenu/ttpmenu.cpp 2021-06-12 15:29:32 UTC (rev 9306) @@ -38,7 +38,10 @@ #include "resource.h" #include "ttlib.h" +#include "codeconv.h" +#include "win32helper.h" + // UTF-8 TeraTerm\x82ł́A\x83f\x83t\x83H\x83\x8B\x83g\x83C\x83\x93\x83X\x83g\x81[\x83\x8B\x90\xE6\x82\xF0\x89\xBA\x8BL\x82ɕύX\x82\xB5\x82\xBD\x81B(2004.12.2 yutaka) // \x82\xB3\x82\xE7\x82ɁA\x83f\x83t\x83H\x83\x8B\x83g\x83C\x83\x93\x83X\x83g\x81[\x83\x8B\x90\xE6\x82̓J\x83\x8C\x83\x93\x83g\x83f\x83B\x83\x8C\x83N\x83g\x83\x8A\x82ɕύX\x81B(2004.12.14 yutaka) #define DEFAULT_PATH "." @@ -2638,6 +2641,37 @@ return ::DefWindowProc(hWnd, uMsg, wParam, lParam); } +static void GetUILanguageFile(char *buf, int buflen) +{ + wchar_t *HomeDirW; + wchar_t *Temp; + wchar_t *SetupFName; + wchar_t *fullpath; + char *fullpathA; + + /* Get home directory */ + HomeDirW = GetHomeDirW(NULL); + + /* Get SetupFName */ + SetupFName = GetDefaultSetupFNameW(HomeDirW); + + /* Get LanguageFile name */ + hGetPrivateProfileStringW(L"Tera Term", L"UILanguageFile", NULL, SetupFName, &Temp); + if (Temp == NULL) { + Temp = _wcsdup(L"lang\\Default.lng"); + } + + fullpath = GetUILanguageFileFullW(HomeDirW, Temp); + fullpathA = ToCharW(fullpath); + free(HomeDirW); + free(SetupFName); + free(Temp); + free(fullpath); + + strcpy_s(buf, buflen, fullpathA); + free(fullpathA); +} + /* ========================================================================== Function Name : (int WINAPI) WinMain() Outline : \x83\x81\x83C\x83\x93\x8A\x94