Revision: 9796 https://osdn.net/projects/ttssh2/scm/svn/commits/9796 Author: zmatsuo Date: 2022-03-09 00:07:17 +0900 (Wed, 09 Mar 2022) Log Message: ----------- ttlib_static_dir.cpp,h を追加、フォルダに関する関数をまとめた - 他の関連プログラムで容易に利用できるようにするため - cyglaunch - TTWinExec() も移動 - cyglib.c - ttlib.h を ttlib_static_dir.h に変更 Modified Paths: -------------- trunk/cygwin/cyglib/cyglib.c trunk/teraterm/common/CMakeLists.txt trunk/teraterm/common/common_static.v16.vcxproj trunk/teraterm/common/common_static.v8.vcproj trunk/teraterm/common/ttlib.h trunk/teraterm/common/ttlib_static_cpp.cpp Added Paths: ----------- trunk/teraterm/common/ttlib_static_dir.cpp trunk/teraterm/common/ttlib_static_dir.h -------------- next part -------------- Modified: trunk/cygwin/cyglib/cyglib.c =================================================================== --- trunk/cygwin/cyglib/cyglib.c 2022-03-08 15:07:04 UTC (rev 9795) +++ trunk/cygwin/cyglib/cyglib.c 2022-03-08 15:07:17 UTC (rev 9796) @@ -33,7 +33,7 @@ #include <string.h> #include <errno.h> -#include "ttlib.h" +#include "ttlib_static_dir.h" #include "asprintf.h" #include "cyglib.h" Modified: trunk/teraterm/common/CMakeLists.txt =================================================================== --- trunk/teraterm/common/CMakeLists.txt 2022-03-08 15:07:04 UTC (rev 9795) +++ trunk/teraterm/common/CMakeLists.txt 2022-03-08 15:07:17 UTC (rev 9796) @@ -36,10 +36,12 @@ ttknownfolders.h ttknownfolders.c ttlib.h + ttlib_charset.cpp + ttlib_charset.h ttlib_static.c ttlib_static_cpp.cpp - ttlib_charset.h - ttlib_charset.cpp + ttlib_static_dir.cpp + ttlib_static_dir.h win32helper.cpp win32helper.h ) Modified: trunk/teraterm/common/common_static.v16.vcxproj =================================================================== --- trunk/teraterm/common/common_static.v16.vcxproj 2022-03-08 15:07:04 UTC (rev 9795) +++ trunk/teraterm/common/common_static.v16.vcxproj 2022-03-08 15:07:17 UTC (rev 9796) @@ -151,6 +151,7 @@ <ClCompile Include="ttlib_charset.cpp" /> <ClCompile Include="ttlib_static.c" /> <ClCompile Include="ttlib_static_cpp.cpp" /> + <ClCompile Include="ttlib_static_dir.cpp" /> <ClCompile Include="win32helper.cpp" /> </ItemGroup> <ItemGroup> @@ -169,6 +170,7 @@ <ClInclude Include="ttknownfolders.h" /> <ClInclude Include="ttlib.h" /> <ClInclude Include="ttlib_charset.h" /> + <ClInclude Include="ttlib_static_dir.h" /> <ClInclude Include="win32helper.h" /> </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> Modified: trunk/teraterm/common/common_static.v8.vcproj =================================================================== --- trunk/teraterm/common/common_static.v8.vcproj 2022-03-08 15:07:04 UTC (rev 9795) +++ trunk/teraterm/common/common_static.v8.vcproj 2022-03-08 15:07:17 UTC (rev 9796) @@ -309,6 +309,14 @@ > </File> <File + RelativePath=".\ttlib_static_dir.cpp" + > + </File> + <File + RelativePath=".\ttlib_static_dir.h" + > + </File> + <File RelativePath=".\win32helper.cpp" > </File> Modified: trunk/teraterm/common/ttlib.h =================================================================== --- trunk/teraterm/common/ttlib.h 2022-03-08 15:07:04 UTC (rev 9795) +++ trunk/teraterm/common/ttlib.h 2022-03-08 15:07:17 UTC (rev 9796) @@ -34,6 +34,7 @@ #pragma once #include "i18n.h" +#include "ttlib_static_dir.h" #ifdef __cplusplus extern "C" { @@ -92,9 +93,6 @@ int GetNthNum2(PCHAR Source, int Nth, int defval); void GetDownloadFolder(char *dest, int destlen); wchar_t *GetDownloadFolderW(void); -wchar_t *GetHomeDirW(HINSTANCE hInst); -wchar_t *GetExeDirW(HINSTANCE hInst); -wchar_t* GetLogDirW(HINSTANCE hInst); 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, @@ -199,7 +197,6 @@ wchar_t *NormalizeLineBreakCRLF(const wchar_t *src_); BOOL IsRelativePathA(const char *path); BOOL IsRelativePathW(const wchar_t *path); -DWORD TTWinExec(const wchar_t *command); DWORD TTWinExecA(const char *commandA); void CreateBakupFile(const wchar_t *fname, const wchar_t *prev_str); BOOL ConvertIniFileCharCode(const wchar_t *fname, const wchar_t *bak_str); Modified: trunk/teraterm/common/ttlib_static_cpp.cpp =================================================================== --- trunk/teraterm/common/ttlib_static_cpp.cpp 2022-03-08 15:07:04 UTC (rev 9795) +++ trunk/teraterm/common/ttlib_static_cpp.cpp 2022-03-08 15:07:17 UTC (rev 9796) @@ -880,123 +880,6 @@ } /* - * Get Exe(exe,dll) directory - * ttermpro.exe, \x83v\x83\x89\x83O\x83C\x83\x93\x82\xAA\x82\xA0\x82\xE9\x83t\x83H\x83\x8B\x83_ - * ttypes.ExeDirW \x82Ɠ\xAF\x88\xEA - * \x82\xE0\x82Ƃ\xCD GetHomeDirW() \x82\xBE\x82\xC1\x82\xBD - * - * @param[in] hInst WinMain()\x82\xCC HINSTANCE \x82܂\xBD\x82\xCD NULL - * @return ExeDir \x95s\x97v\x82ɂȂ\xC1\x82\xBD\x82\xE7 free() \x82\xB7\x82邱\x82\xC6 - * \x95\xB6\x8E\x9A\x97\xF1\x82̍Ō\xE3\x82Ƀp\x83X\x8B\xE6\x90\xE8('\')\x82͂\xA2\x82Ă\xA2\x82Ȃ\xA2 - */ -wchar_t *GetExeDirW(HINSTANCE hInst) -{ - wchar_t *TempW; - wchar_t *dir; - DWORD error = hGetModuleFileNameW(hInst, &TempW); - if (error != NO_ERROR) { - // \x83p\x83X\x82̎擾\x82Ɏ\xB8\x94s\x82\xB5\x82\xBD\x81B\x92v\x96\xBD\x93I\x81Aabort() \x82\xB7\x82\xE9\x81B - abort(); - } - dir = ExtractDirNameW(TempW); - free(TempW); - return dir; -} - -#define PORTABLE_FILENAME L"portable.ini" - -/** - * \x83|\x81[\x83^\x83u\x83\x8B\x94łƂ\xB5\x82ē\xAE\x8D삷\x82邩 - * - * @retval TRUE \x83|\x81[\x83^\x83u\x83\x8B\x94\xC5 - * @retval FALSE \x92ʏ\xED\x83C\x83\x93\x83X\x83g\x81[\x83\x8B\x94\xC5 - */ -BOOL IsPortableMode(void) -{ - static BOOL called = FALSE; - static BOOL ret_val = FALSE; - if (called == FALSE) { - called = TRUE; - wchar_t *exe_dir = GetExeDirW(NULL); - wchar_t *portable_ini = NULL; - awcscats(&portable_ini, exe_dir, L"\\", PORTABLE_FILENAME, NULL); - free(exe_dir); - DWORD r = GetFileAttributesW(portable_ini); - free(portable_ini); - if (r == INVALID_FILE_ATTRIBUTES) { - //\x83t\x83@\x83C\x83\x8B\x82\xAA\x91\xB6\x8D݂\xB5\x82Ȃ\xA2 - ret_val = FALSE; - } - else { - ret_val = TRUE; - } - } - return ret_val; -} - -/* - * Get home directory - * \x8Cl\x97p\x90ݒ\xE8\x83t\x83@\x83C\x83\x8B\x83t\x83H\x83\x8B\x83_\x8E擾 - * ttypes.HomeDirW \x82Ɠ\xAF\x88\xEA - * TERATERM.INI \x82Ȃǂ\xAA\x82\xA8\x82\xA2\x82Ă\xA0\x82\xE9\x83t\x83H\x83\x8B\x83_ - * ttermpro.exe \x82\xAA\x82\xA0\x82\xE9\x83t\x83H\x83\x8B\x83_\x82\xCD GetHomeDirW() \x82ł͂Ȃ\xAD GetExeDirW() \x82Ŏ擾\x82ł\xAB\x82\xE9 - * ExeDirW \x82\xC9 portable.ini \x82\xAA\x82\xA0\x82\xE9\x8Fꍇ - * ExeDirW - * ExeDirW \x82\xC9 portable.ini \x82\xAA\x82Ȃ\xA2\x8Fꍇ - * %APPDATA%\teraterm5 (%USERPROFILE%\AppData\Roaming\teraterm5) - * - * @param[in] hInst WinMain()\x82\xCC HINSTANCE \x82܂\xBD\x82\xCD NULL - * @return HomeDir \x95s\x97v\x82ɂȂ\xC1\x82\xBD\x82\xE7 free() \x82\xB7\x82邱\x82\xC6 - * \x95\xB6\x8E\x9A\x97\xF1\x82̍Ō\xE3\x82Ƀp\x83X\x8B\xE6\x90\xE8('\')\x82͂\xA2\x82Ă\xA2\x82Ȃ\xA2 - */ -wchar_t *GetHomeDirW(HINSTANCE hInst) -{ - if (IsPortableMode()) { - return GetExeDirW(hInst); - } - else { - wchar_t *path; - wchar_t *ret = NULL; - _SHGetKnownFolderPath(FOLDERID_RoamingAppData, KF_FLAG_CREATE, NULL, &path); - awcscats(&ret, path, L"\\teraterm5", NULL); - free(path); - CreateDirectoryW(ret, NULL); - return ret; - } -} - -/* - * Get log directory - * \x83\x8D\x83O\x95ۑ\xB6\x83t\x83H\x83\x8B\x83_\x8E擾 - * ttypes.LogDirW \x82Ɠ\xAF\x88\xEA - * ExeDirW \x82\xC9 portable.ini \x82\xAA\x82\xA0\x82\xE9\x8Fꍇ - * ExeDirW\log - * ExeDirW \x82\xC9 portable.ini \x82\xAA\x82Ȃ\xA2\x8Fꍇ - * %LOCALAPPDATA%\teraterm5 (%USERPROFILE%\AppData\Local\teraterm5) - * - * @param[in] hInst WinMain()\x82\xCC HINSTANCE \x82܂\xBD\x82\xCD NULL - * @return LogDir \x95s\x97v\x82ɂȂ\xC1\x82\xBD\x82\xE7 free() \x82\xB7\x82邱\x82\xC6 - * \x95\xB6\x8E\x9A\x97\xF1\x82̍Ō\xE3\x82Ƀp\x83X\x8B\xE6\x90\xE8('\')\x82͂\xA2\x82Ă\xA2\x82Ȃ\xA2 - */ -wchar_t* GetLogDirW(HINSTANCE hInst) -{ - wchar_t *ret = NULL; - if (IsPortableMode()) { - wchar_t *ExeDirW = GetExeDirW(hInst); - awcscats(&ret, ExeDirW, L"\\log", NULL); - free(ExeDirW); - } - else { - wchar_t *path; - _SHGetKnownFolderPath(FOLDERID_LocalAppData, KF_FLAG_CREATE, NULL, &path); - awcscats(&ret, path, L"\\teraterm5", NULL); - free(path); - } - CreateDirectoryW(ret, NULL); - return ret; -} - -/* * 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_ GetExeDir()\x82Ŏ擾\x82ł\xAB\x82\xE9 @@ -1415,37 +1298,6 @@ return dest_top; } -/** - * \x83v\x83\x8D\x83O\x83\x89\x83\x80\x82\xF0\x8E\xC0\x8Ds\x82\xB7\x82\xE9 - * - * @param[in] command \x8E\xC0\x8Ds\x82\xB7\x82\xE9\x83R\x83}\x83\x93\x83h\x83\x89\x83C\x83\x93 - * CreateProcess() \x82ɂ\xBB\x82̂܂ܓn\x82\xB3\x82\xEA\x82\xE9 - * @retval NO_ERROR \x83G\x83\x89\x81[\x82Ȃ\xB5 - * @retval \x83G\x83\x89\x81[\x83R\x81[\x83h (NO_ERROR\x88ȊO) - * - * \x83V\x83\x93\x83v\x83\x8B\x82Ƀv\x83\x8D\x83O\x83\x89\x83\x80\x82\xF0\x8BN\x93\xAE\x82\xB7\x82邾\x82\xAF\x82̊\x94 - * CreateProcess() \x82\xCD CloseHandle() \x82\xF0\x96Y\x82\xEA\x82ăn\x83\x93\x83h\x83\x8B\x83\x8A\x81[\x83N\x82\xF0\x8BN\x82\xB1\x82\xB5\x82₷\x82\xA2 - * \x92P\x8F\x83\x82ȃv\x83\x8D\x83O\x83\x89\x83\x80\x8E\xC0\x8Ds\x82ł͂\xB1\x82̊\x94\x82\xF0\x8Eg\x97p\x82\xB7\x82\xE9\x82ƈ\xC0\x91S - */ -DWORD TTWinExec(const wchar_t *command) -{ - STARTUPINFOW si = {}; - PROCESS_INFORMATION pi = {}; - - GetStartupInfoW(&si); - - BOOL r = CreateProcessW(NULL, (LPWSTR)command, NULL, NULL, FALSE, 0, - NULL, NULL, &si, &pi); - if (r == 0) { - // error - return GetLastError(); - } - - CloseHandle(pi.hThread); - CloseHandle(pi.hProcess); - return NO_ERROR; -} - DWORD TTWinExecA(const char *commandA) { wchar_t *commandW = ToWcharA(commandA); Added: trunk/teraterm/common/ttlib_static_dir.cpp =================================================================== --- trunk/teraterm/common/ttlib_static_dir.cpp (rev 0) +++ trunk/teraterm/common/ttlib_static_dir.cpp 2022-03-08 15:07:17 UTC (rev 9796) @@ -0,0 +1,248 @@ +/* + * Copyright (C) 2020- TeraTerm Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* ttlib_static_cpp \x82\xA9\x82番\x97\xA3 */ +/* \x83t\x83H\x83\x8B\x83_\x82Ɋւ\xB7\x82\xE9\x8A\x94\x81A*/ +/* cyglaunch\x82Ŏg\x82\xA4 TTWinExec() */ + +#include <windows.h> +#include <stdio.h> +#include <string.h> +#if !defined(_CRTDBG_MAP_ALLOC) +#define _CRTDBG_MAP_ALLOC +#endif +#include <stdlib.h> +#include <crtdbg.h> +#include <assert.h> +#include <wchar.h> +#include <shlobj.h> + +// compat_win \x82𗘗p\x82\xB7\x82\xE9 +// cyglaunch \x82̒P\x93ƃr\x83\x8B\x83h\x82̂Ƃ\xAB\x81Acompatwin \x82\xF0\x8Eg\x97p\x82\xB9\x82\xB8\x83r\x83\x8B\x83h\x82\xB7\x82\xE9 +#if !defined(ENABLE_COMAPT_WIN) +#define ENABLE_COMAPT_WIN 1 +#endif + +#include "asprintf.h" +#include "win32helper.h" // for hGetModuleFileNameW() +#include "ttknownfolders.h" + +#if ENABLE_COMAPT_WIN +#include "compat_win.h" +#endif + +#include "ttlib_static_dir.h" + +// \x83|\x81[\x83^\x83u\x83\x8B\x94łƂ\xB5\x82ē\xAE\x8D삷\x82邩\x82\xF0\x8C\x88\x82߂\xE9\x83t\x83@\x83C\x83\x8B +#define PORTABLE_FILENAME L"portable.ini" + +/** + * AppData\x83t\x83H\x83\x8B\x83_\x82̎擾 + * \x8A\xAB\x95ϐ\x94 APPDATA \x82̃t\x83H\x83\x8B\x83_ + * + * @retval AppData\x83t\x83H\x83\x8B\x83_ + */ +#if ENABLE_COMAPT_WIN +static wchar_t *GetAppdataDir(void) +{ + wchar_t *path; + _SHGetKnownFolderPath(FOLDERID_RoamingAppData, KF_FLAG_CREATE, NULL, &path); + return path; +} +#else +static wchar_t *GetAppdataDir(void) +{ +#if _WIN32_WINNT > 0x0600 + wchar_t *appdata; + SHGetKnownFolderPath(FOLDERID_RoamingAppData, KF_FLAG_CREATE, NULL, &appdata); + wchar_t *retval = _wcsdup(appdata); + CoTaskMemFree(appdata); + return retval; +#else + LPITEMIDLIST pidl; + HRESULT r = SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &pidl); + if (r == NOERROR) { + wchar_t appdata[MAX_PATH]; + SHGetPathFromIDListW(pidl, appdata); + wchar_t *retval = wcsdup(appdata); + CoTaskMemFree(pidl); + return retval; + } + char *env = getenv("APPDATA"); + if (env == NULL) { + // \x82\xE0\x82\xC1\x82ƌÂ\xA2 windows ? + abort(); + } + wchar_t *appdata = ToWcharA(env); + return appdata; +#endif +} +#endif + +/* + * Get Exe(exe,dll) directory + * ttermpro.exe, \x83v\x83\x89\x83O\x83C\x83\x93\x82\xAA\x82\xA0\x82\xE9\x83t\x83H\x83\x8B\x83_ + * ttypes.ExeDirW \x82Ɠ\xAF\x88\xEA + * \x82\xE0\x82Ƃ\xCD GetHomeDirW() \x82\xBE\x82\xC1\x82\xBD + * + * @param[in] hInst WinMain()\x82\xCC HINSTANCE \x82܂\xBD\x82\xCD NULL + * @return ExeDir \x95s\x97v\x82ɂȂ\xC1\x82\xBD\x82\xE7 free() \x82\xB7\x82邱\x82\xC6 + * \x95\xB6\x8E\x9A\x97\xF1\x82̍Ō\xE3\x82Ƀp\x83X\x8B\xE6\x90\xE8('\')\x82͂\xA2\x82Ă\xA2\x82Ȃ\xA2 + */ +wchar_t *GetExeDirW(HINSTANCE hInst) +{ + wchar_t *dir; + DWORD error = hGetModuleFileNameW(hInst, &dir); + if (error != NO_ERROR) { + // \x83p\x83X\x82̎擾\x82Ɏ\xB8\x94s\x82\xB5\x82\xBD\x81B\x92v\x96\xBD\x93I\x81Aabort() \x82\xB7\x82\xE9\x81B + abort(); + } + wchar_t *sep = wcsrchr(dir, L'\\'); + *sep = 0; + return dir; +} + +/** + * \x83|\x81[\x83^\x83u\x83\x8B\x94łƂ\xB5\x82ē\xAE\x8D삷\x82邩 + * + * @retval TRUE \x83|\x81[\x83^\x83u\x83\x8B\x94\xC5 + * @retval FALSE \x92ʏ\xED\x83C\x83\x93\x83X\x83g\x81[\x83\x8B\x94\xC5 + */ +BOOL IsPortableMode(void) +{ + static BOOL called = FALSE; + static BOOL ret_val = FALSE; + if (called == FALSE) { + called = TRUE; + wchar_t *exe_dir = GetExeDirW(NULL); + wchar_t *portable_ini = NULL; + awcscats(&portable_ini, exe_dir, L"\\", PORTABLE_FILENAME, NULL); + free(exe_dir); + DWORD r = GetFileAttributesW(portable_ini); + free(portable_ini); + if (r == INVALID_FILE_ATTRIBUTES) { + //\x83t\x83@\x83C\x83\x8B\x82\xAA\x91\xB6\x8D݂\xB5\x82Ȃ\xA2 + ret_val = FALSE; + } + else { + ret_val = TRUE; + } + } + return ret_val; +} + +/* + * Get home directory + * \x8Cl\x97p\x90ݒ\xE8\x83t\x83@\x83C\x83\x8B\x83t\x83H\x83\x8B\x83_\x8E擾 + * ttypes.HomeDirW \x82Ɠ\xAF\x88\xEA + * TERATERM.INI \x82Ȃǂ\xAA\x82\xA8\x82\xA2\x82Ă\xA0\x82\xE9\x83t\x83H\x83\x8B\x83_ + * ttermpro.exe \x82\xAA\x82\xA0\x82\xE9\x83t\x83H\x83\x8B\x83_\x82\xCD GetHomeDirW() \x82ł͂Ȃ\xAD GetExeDirW() \x82Ŏ擾\x82ł\xAB\x82\xE9 + * ExeDirW \x82\xC9 portable.ini \x82\xAA\x82\xA0\x82\xE9\x8Fꍇ + * ExeDirW + * ExeDirW \x82\xC9 portable.ini \x82\xAA\x82Ȃ\xA2\x8Fꍇ + * %APPDATA%\teraterm5 (%USERPROFILE%\AppData\Roaming\teraterm5) + * + * @param[in] hInst WinMain()\x82\xCC HINSTANCE \x82܂\xBD\x82\xCD NULL + * @return HomeDir \x95s\x97v\x82ɂȂ\xC1\x82\xBD\x82\xE7 free() \x82\xB7\x82邱\x82\xC6 + * \x95\xB6\x8E\x9A\x97\xF1\x82̍Ō\xE3\x82Ƀp\x83X\x8B\xE6\x90\xE8('\')\x82͂\xA2\x82Ă\xA2\x82Ȃ\xA2 + */ +wchar_t *GetHomeDirW(HINSTANCE hInst) +{ + if (IsPortableMode()) { + return GetExeDirW(hInst); + } + else { + wchar_t *path = GetAppdataDir(); + wchar_t *ret = NULL; + awcscats(&ret, path, L"\\teraterm5", NULL); + free(path); + CreateDirectoryW(ret, NULL); + return ret; + } +} + +/* + * Get log directory + * \x83\x8D\x83O\x95ۑ\xB6\x83t\x83H\x83\x8B\x83_\x8E擾 + * ttypes.LogDirW \x82Ɠ\xAF\x88\xEA + * ExeDirW \x82\xC9 portable.ini \x82\xAA\x82\xA0\x82\xE9\x8Fꍇ + * ExeDirW\log + * ExeDirW \x82\xC9 portable.ini \x82\xAA\x82Ȃ\xA2\x8Fꍇ + * %LOCALAPPDATA%\teraterm5 (%USERPROFILE%\AppData\Local\teraterm5) + * + * @param[in] hInst WinMain()\x82\xCC HINSTANCE \x82܂\xBD\x82\xCD NULL + * @return LogDir \x95s\x97v\x82ɂȂ\xC1\x82\xBD\x82\xE7 free() \x82\xB7\x82邱\x82\xC6 + * \x95\xB6\x8E\x9A\x97\xF1\x82̍Ō\xE3\x82Ƀp\x83X\x8B\xE6\x90\xE8('\')\x82͂\xA2\x82Ă\xA2\x82Ȃ\xA2 + */ +wchar_t* GetLogDirW(HINSTANCE hInst) +{ + wchar_t *ret = NULL; + if (IsPortableMode()) { + wchar_t *ExeDirW = GetExeDirW(hInst); + awcscats(&ret, ExeDirW, L"\\log", NULL); + free(ExeDirW); + } + else { + wchar_t *path = GetAppdataDir(); + awcscats(&ret, path, L"\\teraterm5", NULL); + free(path); + } + CreateDirectoryW(ret, NULL); + return ret; +} + +/** + * \x83v\x83\x8D\x83O\x83\x89\x83\x80\x82\xF0\x8E\xC0\x8Ds\x82\xB7\x82\xE9 + * + * @param[in] command \x8E\xC0\x8Ds\x82\xB7\x82\xE9\x83R\x83}\x83\x93\x83h\x83\x89\x83C\x83\x93 + * CreateProcess() \x82ɂ\xBB\x82̂܂ܓn\x82\xB3\x82\xEA\x82\xE9 + * @retval NO_ERROR \x83G\x83\x89\x81[\x82Ȃ\xB5 + * @retval \x83G\x83\x89\x81[\x83R\x81[\x83h (NO_ERROR\x88ȊO) + * + * \x83V\x83\x93\x83v\x83\x8B\x82Ƀv\x83\x8D\x83O\x83\x89\x83\x80\x82\xF0\x8BN\x93\xAE\x82\xB7\x82邾\x82\xAF\x82̊\x94 + * CreateProcess() \x82\xCD CloseHandle() \x82\xF0\x96Y\x82\xEA\x82ăn\x83\x93\x83h\x83\x8B\x83\x8A\x81[\x83N\x82\xF0\x8BN\x82\xB1\x82\xB5\x82₷\x82\xA2 + * \x92P\x8F\x83\x82ȃv\x83\x8D\x83O\x83\x89\x83\x80\x8E\xC0\x8Ds\x82ł͂\xB1\x82̊\x94\x82\xF0\x8Eg\x97p\x82\xB7\x82\xE9\x82ƈ\xC0\x91S + */ +DWORD TTWinExec(const wchar_t *command) +{ + STARTUPINFOW si = {}; + PROCESS_INFORMATION pi = {}; + + GetStartupInfoW(&si); + + BOOL r = CreateProcessW(NULL, (LPWSTR)command, NULL, NULL, FALSE, 0, + NULL, NULL, &si, &pi); + if (r == 0) { + // error + return GetLastError(); + } + + CloseHandle(pi.hThread); + CloseHandle(pi.hProcess); + return NO_ERROR; +} Added: trunk/teraterm/common/ttlib_static_dir.h =================================================================== --- trunk/teraterm/common/ttlib_static_dir.h (rev 0) +++ trunk/teraterm/common/ttlib_static_dir.h 2022-03-08 15:07:17 UTC (rev 9796) @@ -0,0 +1,44 @@ +/* + * Copyright (C) 1994-1998 T. Teranishi + * (C) 2006- TeraTerm Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +wchar_t *GetExeDirW(HINSTANCE hInst); +BOOL IsPortableMode(void); +wchar_t *GetHomeDirW(HINSTANCE hInst); +wchar_t* GetLogDirW(HINSTANCE hInst); +DWORD TTWinExec(const wchar_t *command); + +#ifdef __cplusplus +} +#endif