diff --git a/AppInstallerReset.sln b/AppInstallerReset.sln index 9454f7b..cf6e849 100644 --- a/AppInstallerReset.sln +++ b/AppInstallerReset.sln @@ -34,6 +34,11 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "settings", "settings\settin EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "reslib", "reslib\reslib.vcxproj", "{3AE2A022-ED83-41F1-948A-12A7593CBD00}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shortcut", "shortcut\shortcut.vcxproj", "{18E0189B-F3F1-4CB2-A3AF-5606ADD5E279}" + ProjectSection(ProjectDependencies) = postProject + {798ED492-EECE-457D-8FD8-129DA93CE126} = {798ED492-EECE-457D-8FD8-129DA93CE126} + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -132,6 +137,16 @@ Global {3AE2A022-ED83-41F1-948A-12A7593CBD00}.Release|x64.Build.0 = Release|x64 {3AE2A022-ED83-41F1-948A-12A7593CBD00}.Release|x86.ActiveCfg = Release|Win32 {3AE2A022-ED83-41F1-948A-12A7593CBD00}.Release|x86.Build.0 = Release|Win32 + {18E0189B-F3F1-4CB2-A3AF-5606ADD5E279}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {18E0189B-F3F1-4CB2-A3AF-5606ADD5E279}.Debug|x64.ActiveCfg = Debug|x64 + {18E0189B-F3F1-4CB2-A3AF-5606ADD5E279}.Debug|x64.Build.0 = Debug|x64 + {18E0189B-F3F1-4CB2-A3AF-5606ADD5E279}.Debug|x86.ActiveCfg = Debug|Win32 + {18E0189B-F3F1-4CB2-A3AF-5606ADD5E279}.Debug|x86.Build.0 = Debug|Win32 + {18E0189B-F3F1-4CB2-A3AF-5606ADD5E279}.Release|Any CPU.ActiveCfg = Release|Win32 + {18E0189B-F3F1-4CB2-A3AF-5606ADD5E279}.Release|x64.ActiveCfg = Release|x64 + {18E0189B-F3F1-4CB2-A3AF-5606ADD5E279}.Release|x64.Build.0 = Release|x64 + {18E0189B-F3F1-4CB2-A3AF-5606ADD5E279}.Release|x86.ActiveCfg = Release|Win32 + {18E0189B-F3F1-4CB2-A3AF-5606ADD5E279}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Generated/InstallerSetup.exe b/Generated/InstallerSetup.exe index daf7151..ae1915e 100644 Binary files a/Generated/InstallerSetup.exe and b/Generated/InstallerSetup.exe differ diff --git a/appinstaller/bridge.h b/appinstaller/bridge.h index 999c2d8..6173d5e 100644 --- a/appinstaller/bridge.h +++ b/appinstaller/bridge.h @@ -4,13 +4,6 @@ #include "nstring.h" #include "filepath.h" #include -#include -#include -#include -#include -#include -#include "mpstr.h" -#include "strcode.h" using namespace System; using namespace System::Runtime::InteropServices; @@ -94,297 +87,3 @@ public ref class _I_String return Format (pih, newargs); } }; -String ^StringArrayToJson (array ^strs) -{ - using namespace rapidjson; - Document doc; - doc.SetArray (); - Document::AllocatorType &allocator = doc.GetAllocator (); - for each (String ^s in strs) - { - std::wstring ws = MPStringToStdW (s); // String^ → std::wstring - std::string utf8 = WStringToString (ws, CP_UTF8); // 简易宽转 UTF-8,如需更严谨可用 WideCharToMultiByte - doc.PushBack (Value (utf8.c_str (), allocator), allocator); - } - StringBuffer buffer; - Writer writer (buffer); - doc.Accept (writer); - std::string json = buffer.GetString (); - std::wstring wjson = StringToWString (json, CP_UTF8); - return CStringToMPString (wjson); -} -std::wstring StringArrayToJson (const std::vector& arr) -{ - using namespace rapidjson; - Document doc; - doc.SetArray (); - auto &allocator = doc.GetAllocator (); - for (const auto &ws : arr) - { - std::string utf8 = WStringToUtf8 (ws); - doc.PushBack (Value (utf8.c_str (), allocator), allocator); - } - StringBuffer buffer; - Writer writer (buffer); - doc.Accept (writer); - return Utf8ToWString (buffer.GetString ()); -} -[ComVisible (true)] -public ref class _I_Path -{ - public: - property String ^Current - { - String ^get () { return CStringToMPString (GetCurrentDirectoryW ()); } - void set (String ^dir) { SetCurrentDirectoryW (MPStringToStdW (dir).c_str ()); } - } - property String ^Program { String ^get () { return CStringToMPString (GetCurrentProgramPathW ()); } } - property String ^Root { String ^get () { return CStringToMPString (GetFileDirectoryW (GetCurrentProgramPathW ())); }} - String ^Combine (String ^l, String ^r) { return CStringToMPString (CombinePath (MPStringToStdW (l), MPStringToStdW (r))); } - String ^GetName (String ^path) - { - std::wstring cpath = MPStringToStdW (path); - LPWSTR lp = PathFindFileNameW (cpath.c_str ()); - return lp ? CStringToMPString (lp) : String::Empty; - } - String ^GetDirectory (String ^path) { return CStringToMPString (GetFileDirectoryW (MPStringToStdW (path))); } - String ^GetDir (String ^path) { return GetDirectory (path); } - bool Exist (String ^path) { return IsPathExists (MPStringToStdW (path)); } - bool FileExist (String ^filepath) { return IsFileExists (MPStringToStdW (filepath)); } - bool DirectoryExist (String ^dirpath) { return IsDirectoryExists (MPStringToStdW (dirpath)); } - bool DirExist (String ^dirpath) { return DirectoryExist (dirpath); } - String ^GetEnvironmentString (String ^str) { return CStringToMPString (ProcessEnvVars (MPStringToStdW (str))); } - bool ValidName (String ^filename) { return IsValidWindowsName (MPStringToStdW (filename)); } - // 过滤器用"\"分隔每个类型 - String ^EnumFilesToJson (String ^dir, String ^filter, bool withpath, bool sort, bool includesub) - { - std::vector res; - ::EnumFiles (MPStringToStdW (dir), MPStringToStdW (filter), res, withpath, sort, includesub); - return CStringToMPString (StringArrayToJson (res)); - } - String ^EnumDirsToJson (String ^dir, bool withpath, bool sort, bool includesub) - { - std::vector res; - EnumDirectory (MPStringToStdW (dir), res, withpath, sort, includesub); - return CStringToMPString (StringArrayToJson (res)); - } - String ^EnumSubDirsToJson (String ^dir, bool withpath) - { - std::vector res = EnumSubdirectories (MPStringToStdW (dir), withpath); - return CStringToMPString (StringArrayToJson (res)); - } - array ^EnumFiles (String ^dir, String ^filter, bool withpath, bool sort, bool includesub) - { - std::vector res; - ::EnumFiles (MPStringToStdW (dir), MPStringToStdW (filter), res, withpath, sort, includesub); - auto retarr = gcnew array (res.size ()); - for (size_t i = 0; i < res.size (); i ++) - { - retarr [i] = CStringToMPString (res [i]); - } - return retarr; - } - array ^EnumDirs (String ^dir, bool withpath, bool sort, bool includesub) - { - std::vector res; - EnumDirectory (MPStringToStdW (dir), res, withpath, sort, includesub); - auto retarr = gcnew array (res.size ()); - for (size_t i = 0; i < res.size (); i ++) - { - retarr [i] = CStringToMPString (res [i]); - } - return retarr; - } - array ^EnumSubDirs (String ^dir, bool withpath) - { - std::vector res = EnumSubdirectories (MPStringToStdW (dir), withpath); - auto retarr = gcnew array (res.size ()); - for (size_t i = 0; i < res.size (); i ++) - { - retarr [i] = CStringToMPString (res [i]); - } - return retarr; - } - String ^CommonPrefix (String ^path1, String ^path2) { return CStringToMPString (PathCommonPrefix (MPStringToStdW (path1), MPStringToStdW (path2))); } - String ^EnsureDirSlash (String ^dir) { return CStringToMPString (EnsureTrailingSlash (MPStringToStdW (dir))); } - String ^Normalize (String ^path) { return CStringToMPString (NormalizePath (MPStringToStdW (path))); } - String ^FullPathName (String ^path) { return CStringToMPString (GetFullPathName (MPStringToStdW (path))); } - String ^FullPath (String ^path) { return FullPathName (path); } - String ^Expand (String ^path) { return CStringToMPString (ProcessEnvVars (MPStringToStdW (path))); } - bool PEquals (String ^l, String ^r) { return PathEquals (MPStringToStdW (l), MPStringToStdW (r)); } -}; -[ComVisible (true)] -public ref class _I_Entry -{ - protected: - String ^path; - public: - _I_Entry (String ^path): path (path) {} - _I_Entry (): path (String::Empty) {} - property String ^Path { String ^get () { return path; } void set (String ^file) { path = file; } } - property String ^Name - { - String ^get () - { - std::wstring file = MPStringToStdW (path); - LPWSTR lpstr = PathFindFileNameW (file.c_str ()); - return lpstr ? CStringToMPString (lpstr) : String::Empty; - } - } - property String ^Directory { String ^get () { return CStringToMPString (GetFileDirectoryW (MPStringToStdW (path))); }} - property String ^Root { String ^get () { return Directory; }} - property bool Exist { virtual bool get () { return IsPathExists (MPStringToStdW (path)); }} - property String ^Uri - { - String ^get () - { - using namespace System; - try - { - auto uri = gcnew System::Uri (System::IO::Path::GetFullPath (path)); - auto uriText = uri->AbsoluteUri; - return uriText; - } - catch (...) { return String::Empty; } - } - } - property String ^FullPath { String ^get () { return System::IO::Path::GetFullPath (path); }} -}; -[ComVisible (true)] -public ref class _I_File: public _I_Entry -{ - protected: - System::Text::Encoding ^lastEncoding; - public: - _I_File (String ^filepath): _I_Entry (filepath) {} - _I_File (): _I_Entry (String::Empty) {} - String ^Get () - { - using namespace System::IO; - if (String::IsNullOrEmpty (path)) return String::Empty; - FileStream ^fs = nullptr; - StreamReader ^sr = nullptr; - try - { - fs = gcnew FileStream ( - path, - FileMode::OpenOrCreate, - FileAccess::ReadWrite, - FileShare::ReadWrite - ); - sr = gcnew StreamReader (fs, Encoding::UTF8, true); - String ^text = sr->ReadToEnd (); - auto lastEncoding = sr->CurrentEncoding; - return text; - } - finally - { - if (sr) delete sr; - if (fs) delete fs; - } - } - void Set (String ^content) - { - using namespace System::IO; - if (String::IsNullOrEmpty (path)) return; - Encoding ^enc = lastEncoding ? lastEncoding : Encoding::UTF8; - FileStream ^fs = nullptr; - StreamWriter ^sw = nullptr; - try - { - fs = gcnew FileStream ( - path, - FileMode::Create, - FileAccess::ReadWrite, - FileShare::ReadWrite - ); - sw = gcnew StreamWriter (fs, enc); - sw->Write (content); - sw->Flush (); - } - finally - { - if (sw) delete sw; - if (fs) delete fs; - } - } - property String ^Content - { - String ^get () { return Get (); } - void set (String ^value) { Set (value); } - } - property bool Exist { bool get () override { return IsFileExists (MPStringToStdW (path)); }} - property String ^FilePath { String ^get () { return this->Path; } void set (String ^value) { this->Path = value; }} -}; -[ComVisible (true)] -public ref class _I_Directory: public _I_Entry -{ - public: - _I_Directory (String ^dirpath): _I_Entry (dirpath) {} - _I_Directory (_I_Entry ^file): _I_Entry (file->Directory) {} - _I_Directory (): _I_Entry (String::Empty) {} - property String ^DirectoryPath { String ^get () { return this->Path; } void set (String ^value) { this->Path = value; } } - property String ^DirPath { String ^get () { return this->DirectoryPath; } void set (String ^value) { this->DirectoryPath = value; } } - property bool Exist { bool get () override { return IsDirectoryExists (MPStringToStdW (path)); }} - String ^EnumFilesToJson (String ^filter, bool withpath, bool sort, bool includesub) - { - std::vector res; - ::EnumFiles (MPStringToStdW (DirPath), MPStringToStdW (filter), res, withpath, sort, includesub); - return CStringToMPString (StringArrayToJson (res)); - } - String ^EnumDirsToJson (bool withpath, bool sort, bool includesub) - { - std::vector res; - EnumDirectory (MPStringToStdW (DirPath), res, withpath, sort, includesub); - return CStringToMPString (StringArrayToJson (res)); - } - String ^EnumSubDirsToJson (bool withpath) - { - std::vector res = EnumSubdirectories (MPStringToStdW (DirPath), withpath); - return CStringToMPString (StringArrayToJson (res)); - } - array ^EnumFiles (String ^filter, bool withpath, bool sort, bool includesub) - { - std::vector res; - ::EnumFiles (MPStringToStdW (DirPath), MPStringToStdW (filter), res, withpath, sort, includesub); - auto retarr = gcnew array (res.size ()); - for (size_t i = 0; i < res.size (); i ++) - { - retarr [i] = CStringToMPString (res [i]); - } - return retarr; - } - array ^EnumDirs (bool withpath, bool sort, bool includesub) - { - std::vector res; - EnumDirectory (MPStringToStdW (DirPath), res, withpath, sort, includesub); - auto retarr = gcnew array (res.size ()); - for (size_t i = 0; i < res.size (); i ++) - { - retarr [i] = CStringToMPString (res [i]); - } - return retarr; - } - array ^EnumSubDirs (bool withpath) - { - std::vector res = EnumSubdirectories (MPStringToStdW (DirPath), withpath); - auto retarr = gcnew array (res.size ()); - for (size_t i = 0; i < res.size (); i ++) - { - retarr [i] = CStringToMPString (res [i]); - } - return retarr; - } -}; -[ComVisible (true)] -public ref class _I_Storage -{ - protected: - _I_Path ^path = gcnew _I_Path (); - public: - property _I_Path ^Path { _I_Path ^get () { return path; }} - _I_File ^GetFile (String ^path) { return gcnew _I_File (path); } - _I_Directory ^GetDirectory (String ^path) { return gcnew _I_Directory (path); } - _I_Directory ^GetDir (String ^path) { return GetDirectory (path); } -}; - diff --git a/appinstaller/filepath.h b/appinstaller/filepath.h index c4b7645..9b3ab51 100644 --- a/appinstaller/filepath.h +++ b/appinstaller/filepath.h @@ -869,3 +869,333 @@ bool PathEquals (const std::wstring &path1, const std::wstring &path2) PathCanonicalizeW (buf2.data (), path2.c_str ()); return IsNormalizeStringEquals (buf1.data (), buf2.data ()); } +#ifdef __cplusplus_cli +#include +#include +#include +#include +#include +#include +#include +#include "mpstr.h" +#include "strcode.h" +using namespace System; +using namespace System::Runtime::InteropServices; +String ^StringArrayToJson (array ^strs) +{ + using namespace rapidjson; + Document doc; + doc.SetArray (); + Document::AllocatorType &allocator = doc.GetAllocator (); + for each (String ^s in strs) + { + std::wstring ws = MPStringToStdW (s); // String^ → std::wstring + std::string utf8 = WStringToString (ws, CP_UTF8); // 简易宽转 UTF-8,如需更严谨可用 WideCharToMultiByte + doc.PushBack (Value (utf8.c_str (), allocator), allocator); + } + StringBuffer buffer; + Writer writer (buffer); + doc.Accept (writer); + std::string json = buffer.GetString (); + std::wstring wjson = StringToWString (json, CP_UTF8); + return CStringToMPString (wjson); +} +std::wstring StringArrayToJson (const std::vector& arr) +{ + using namespace rapidjson; + Document doc; + doc.SetArray (); + auto &allocator = doc.GetAllocator (); + for (const auto &ws : arr) + { + std::string utf8 = WStringToUtf8 (ws); + doc.PushBack (Value (utf8.c_str (), allocator), allocator); + } + StringBuffer buffer; + Writer writer (buffer); + doc.Accept (writer); + return Utf8ToWString (buffer.GetString ()); +} +[ComVisible (true)] +public ref class _I_Path +{ + public: + property String ^Current + { + String ^get () { return CStringToMPString (GetCurrentDirectoryW ()); } + void set (String ^dir) { SetCurrentDirectoryW (MPStringToStdW (dir).c_str ()); } + } + property String ^Program { String ^get () { return CStringToMPString (GetCurrentProgramPathW ()); } } + property String ^Root { String ^get () { return CStringToMPString (GetFileDirectoryW (GetCurrentProgramPathW ())); }} + String ^Combine (String ^l, String ^r) { return CStringToMPString (CombinePath (MPStringToStdW (l), MPStringToStdW (r))); } + String ^GetName (String ^path) + { + std::wstring cpath = MPStringToStdW (path); + LPWSTR lp = PathFindFileNameW (cpath.c_str ()); + return lp ? CStringToMPString (lp) : String::Empty; + } + String ^GetDirectory (String ^path) { return CStringToMPString (GetFileDirectoryW (MPStringToStdW (path))); } + String ^GetDir (String ^path) { return GetDirectory (path); } + bool Exist (String ^path) { return IsPathExists (MPStringToStdW (path)); } + bool FileExist (String ^filepath) { return IsFileExists (MPStringToStdW (filepath)); } + bool DirectoryExist (String ^dirpath) { return IsDirectoryExists (MPStringToStdW (dirpath)); } + bool DirExist (String ^dirpath) { return DirectoryExist (dirpath); } + String ^GetEnvironmentString (String ^str) { return CStringToMPString (ProcessEnvVars (MPStringToStdW (str))); } + bool ValidName (String ^filename) { return IsValidWindowsName (MPStringToStdW (filename)); } + // 过滤器用"\"分隔每个类型 + String ^EnumFilesToJson (String ^dir, String ^filter, bool withpath, bool sort, bool includesub) + { + std::vector res; + ::EnumFiles (MPStringToStdW (dir), MPStringToStdW (filter), res, withpath, sort, includesub); + return CStringToMPString (StringArrayToJson (res)); + } + String ^EnumDirsToJson (String ^dir, bool withpath, bool sort, bool includesub) + { + std::vector res; + EnumDirectory (MPStringToStdW (dir), res, withpath, sort, includesub); + return CStringToMPString (StringArrayToJson (res)); + } + String ^EnumSubDirsToJson (String ^dir, bool withpath) + { + std::vector res = EnumSubdirectories (MPStringToStdW (dir), withpath); + return CStringToMPString (StringArrayToJson (res)); + } + array ^EnumFiles (String ^dir, String ^filter, bool withpath, bool sort, bool includesub) + { + std::vector res; + ::EnumFiles (MPStringToStdW (dir), MPStringToStdW (filter), res, withpath, sort, includesub); + auto retarr = gcnew array (res.size ()); + for (size_t i = 0; i < res.size (); i ++) + { + retarr [i] = CStringToMPString (res [i]); + } + return retarr; + } + array ^EnumDirs (String ^dir, bool withpath, bool sort, bool includesub) + { + std::vector res; + EnumDirectory (MPStringToStdW (dir), res, withpath, sort, includesub); + auto retarr = gcnew array (res.size ()); + for (size_t i = 0; i < res.size (); i ++) + { + retarr [i] = CStringToMPString (res [i]); + } + return retarr; + } + array ^EnumSubDirs (String ^dir, bool withpath) + { + std::vector res = EnumSubdirectories (MPStringToStdW (dir), withpath); + auto retarr = gcnew array (res.size ()); + for (size_t i = 0; i < res.size (); i ++) + { + retarr [i] = CStringToMPString (res [i]); + } + return retarr; + } + String ^CommonPrefix (String ^path1, String ^path2) { return CStringToMPString (PathCommonPrefix (MPStringToStdW (path1), MPStringToStdW (path2))); } + String ^EnsureDirSlash (String ^dir) { return CStringToMPString (EnsureTrailingSlash (MPStringToStdW (dir))); } + String ^Normalize (String ^path) { return CStringToMPString (NormalizePath (MPStringToStdW (path))); } + String ^FullPathName (String ^path) { return CStringToMPString (GetFullPathName (MPStringToStdW (path))); } + String ^FullPath (String ^path) { return FullPathName (path); } + String ^Expand (String ^path) { return CStringToMPString (ProcessEnvVars (MPStringToStdW (path))); } + String ^GetFolder (int csidl) + { + WCHAR buf [1024] = {0}; + HRESULT hr = SHGetFolderPathW (NULL, csidl, NULL, 0, buf); + if (SUCCEEDED (hr)) return CStringToMPString (buf); + else return String::Empty; + } + String ^KnownFolder (String ^guidString) + { + if (String::IsNullOrWhiteSpace (guidString)) return String::Empty; + std::wstring wguid = MPStringToStdW (guidString); + KNOWNFOLDERID kfid; + HRESULT hr = CLSIDFromString (wguid.c_str (), &kfid); + if (FAILED (hr)) return String::Empty; + PWSTR path = nullptr; + hr = SHGetKnownFolderPath (kfid, 0, NULL, &path); + if (FAILED (hr) || path == nullptr) return L""; + std::wstring result (path ? path : L""); + if (path) CoTaskMemFree (path); + return CStringToMPString (result); + } + + bool PEquals (String ^l, String ^r) { return PathEquals (MPStringToStdW (l), MPStringToStdW (r)); } +}; +[ComVisible (true)] +public ref class _I_Entry +{ + protected: + String ^path; + public: + _I_Entry (String ^path): path (path) {} + _I_Entry (): path (String::Empty) {} + property String ^Path { String ^get () { return path; } void set (String ^file) { path = file; } } + property String ^Name + { + String ^get () + { + std::wstring file = MPStringToStdW (path); + LPWSTR lpstr = PathFindFileNameW (file.c_str ()); + return lpstr ? CStringToMPString (lpstr) : String::Empty; + } + } + property String ^Directory { String ^get () { return CStringToMPString (GetFileDirectoryW (MPStringToStdW (path))); }} + property String ^Root { String ^get () { return Directory; }} + property bool Exist { virtual bool get () { return IsPathExists (MPStringToStdW (path)); }} + property String ^Uri + { + String ^get () + { + using namespace System; + try + { + auto uri = gcnew System::Uri (System::IO::Path::GetFullPath (path)); + auto uriText = uri->AbsoluteUri; + return uriText; + } + catch (...) { return String::Empty; } + } + } + property String ^FullPath { String ^get () { return System::IO::Path::GetFullPath (path); }} +}; +[ComVisible (true)] +public ref class _I_File: public _I_Entry +{ + protected: + System::Text::Encoding ^lastEncoding; + public: + _I_File (String ^filepath): _I_Entry (filepath) {} + _I_File (): _I_Entry (String::Empty) {} + String ^Get () + { + using namespace System::IO; + if (String::IsNullOrEmpty (path)) return String::Empty; + FileStream ^fs = nullptr; + StreamReader ^sr = nullptr; + try + { + fs = gcnew FileStream ( + path, + FileMode::OpenOrCreate, + FileAccess::ReadWrite, + FileShare::ReadWrite + ); + sr = gcnew StreamReader (fs, Encoding::UTF8, true); + String ^text = sr->ReadToEnd (); + auto lastEncoding = sr->CurrentEncoding; + return text; + } + finally + { + if (sr) delete sr; + if (fs) delete fs; + } + } + void Set (String ^content) + { + using namespace System::IO; + if (String::IsNullOrEmpty (path)) return; + Encoding ^enc = lastEncoding ? lastEncoding : Encoding::UTF8; + FileStream ^fs = nullptr; + StreamWriter ^sw = nullptr; + try + { + fs = gcnew FileStream ( + path, + FileMode::Create, + FileAccess::ReadWrite, + FileShare::ReadWrite + ); + sw = gcnew StreamWriter (fs, enc); + sw->Write (content); + sw->Flush (); + } + finally + { + if (sw) delete sw; + if (fs) delete fs; + } + } + property String ^Content + { + String ^get () { return Get (); } + void set (String ^value) { Set (value); } + } + property bool Exist { bool get () override { return IsFileExists (MPStringToStdW (path)); }} + property String ^FilePath { String ^get () { return this->Path; } void set (String ^value) { this->Path = value; }} +}; +[ComVisible (true)] +public ref class _I_Directory: public _I_Entry +{ + public: + _I_Directory (String ^dirpath): _I_Entry (dirpath) {} + _I_Directory (_I_Entry ^file): _I_Entry (file->Directory) {} + _I_Directory (): _I_Entry (String::Empty) {} + property String ^DirectoryPath { String ^get () { return this->Path; } void set (String ^value) { this->Path = value; } } + property String ^DirPath { String ^get () { return this->DirectoryPath; } void set (String ^value) { this->DirectoryPath = value; } } + property bool Exist { bool get () override { return IsDirectoryExists (MPStringToStdW (path)); }} + String ^EnumFilesToJson (String ^filter, bool withpath, bool sort, bool includesub) + { + std::vector res; + ::EnumFiles (MPStringToStdW (DirPath), MPStringToStdW (filter), res, withpath, sort, includesub); + return CStringToMPString (StringArrayToJson (res)); + } + String ^EnumDirsToJson (bool withpath, bool sort, bool includesub) + { + std::vector res; + EnumDirectory (MPStringToStdW (DirPath), res, withpath, sort, includesub); + return CStringToMPString (StringArrayToJson (res)); + } + String ^EnumSubDirsToJson (bool withpath) + { + std::vector res = EnumSubdirectories (MPStringToStdW (DirPath), withpath); + return CStringToMPString (StringArrayToJson (res)); + } + array ^EnumFiles (String ^filter, bool withpath, bool sort, bool includesub) + { + std::vector res; + ::EnumFiles (MPStringToStdW (DirPath), MPStringToStdW (filter), res, withpath, sort, includesub); + auto retarr = gcnew array (res.size ()); + for (size_t i = 0; i < res.size (); i ++) + { + retarr [i] = CStringToMPString (res [i]); + } + return retarr; + } + array ^EnumDirs (bool withpath, bool sort, bool includesub) + { + std::vector res; + EnumDirectory (MPStringToStdW (DirPath), res, withpath, sort, includesub); + auto retarr = gcnew array (res.size ()); + for (size_t i = 0; i < res.size (); i ++) + { + retarr [i] = CStringToMPString (res [i]); + } + return retarr; + } + array ^EnumSubDirs (bool withpath) + { + std::vector res = EnumSubdirectories (MPStringToStdW (DirPath), withpath); + auto retarr = gcnew array (res.size ()); + for (size_t i = 0; i < res.size (); i ++) + { + retarr [i] = CStringToMPString (res [i]); + } + return retarr; + } +}; +[ComVisible (true)] +public ref class _I_Storage +{ + protected: + _I_Path ^path = gcnew _I_Path (); + public: + property _I_Path ^Path { _I_Path ^get () { return path; }} + _I_File ^GetFile (String ^path) { return gcnew _I_File (path); } + _I_Directory ^GetDirectory (String ^path) { return gcnew _I_Directory (path); } + _I_Directory ^GetDir (String ^path) { return GetDirectory (path); } +}; + + +#endif \ No newline at end of file diff --git a/appinstaller/main.cpp b/appinstaller/main.cpp index dae9f7e..4f0e24e 100644 --- a/appinstaller/main.cpp +++ b/appinstaller/main.cpp @@ -2,6 +2,9 @@ #include #include #include +#include // KNOWNFOLDERID, SHGetKnownFolderPath +#include // OPENFILENAME +#include // _com_error #include #include #include diff --git a/others/Autosave/autosave_2025-11-30_22-53-35.suf b/others/Autosave/autosave_2025-11-30_22-53-35.suf deleted file mode 100644 index 58c05dd..0000000 --- a/others/Autosave/autosave_2025-11-30_22-53-35.suf +++ /dev/null @@ -1,4577 +0,0 @@ - - -{AFB904C4-C255-4540-B97E-A75A34F1FFB0} -9.5.3.0 - - - -1 - -*.* -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\shared -* -档案 - -1 -0 -%AppFolder% -1 -0 -0 -1000 -0 -0 -0 -0 -0 -0 -0 -0 - - - - - -0 - -0 -0 -0 -1 - -1 -1 -0 -1 -1 -0 -0 -0 -0 - -32768 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 - - - -All - -None - - -0 -0 -0 - - -0 -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\appinstaller.exe -appinstaller.exe -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release -exe -档案 - -1 -0 -%AppFolder% -1 -0 -0 -1000 -0 -0 -1 -0 -0 -0 -0 -0 - -App Installer - - - -0 - -0 -0 -0 -0 - -0 -0 -0 -1 -1 -0 -0 -0 -0 - -32768 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 - - - -All - -None - - -0 -0 -0 - - -0 -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\certmgr.dll -certmgr.dll -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release -dll -档案 - -1 -0 -%AppFolder% -1 -0 -0 -1000 -0 -0 -0 -0 -0 -0 -0 -0 - - - - - -0 - -0 -0 -0 -0 - -0 -0 -0 -1 -1 -0 -0 -0 -0 - -32768 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 - - - -All - -None - - -0 -0 -0 - - -0 -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\notice.dll -notice.dll -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release -dll -档案 - -1 -0 -%AppFolder% -1 -0 -0 -1000 -0 -0 -0 -0 -0 -0 -0 -0 - - - - - -0 - -0 -0 -0 -0 - -0 -0 -0 -1 -1 -0 -0 -0 -0 - -32768 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 - - - -All - -None - - -0 -0 -0 - - -0 -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\pkgmgr.dll -pkgmgr.dll -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release -dll -档案 - -1 -0 -%AppFolder% -1 -0 -0 -1000 -0 -0 -0 -0 -0 -0 -0 -0 - - - - - -0 - -0 -0 -0 -0 - -0 -0 -0 -1 -1 -0 -0 -0 -0 - -32768 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 - - - -All - -None - - -0 -0 -0 - - -0 -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\pkgread.dll -pkgread.dll -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release -dll -档案 - -1 -0 -%AppFolder% -1 -0 -0 -1000 -0 -0 -0 -0 -0 -0 -0 -0 - - - - - -0 - -0 -0 -0 -0 - -0 -0 -0 -1 -1 -0 -0 -0 -0 - -32768 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 - - - -All - -None - - -0 -0 -0 - - -0 -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\PriFileFormat.dll -PriFileFormat.dll -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release -dll -档案 - -1 -0 -%AppFolder% -1 -0 -0 -1000 -0 -0 -0 -0 -0 -0 -0 -0 - - - - - -0 - -0 -0 -0 -0 - -0 -0 -0 -1 -1 -0 -0 -0 -0 - -32768 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 - - - -All - -None - - -0 -0 -0 - - -0 -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\priformatcli.dll -priformatcli.dll -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release -dll -档案 - -1 -0 -%AppFolder% -1 -0 -0 -1000 -0 -0 -0 -0 -0 -0 -0 -0 - - - - - -0 - -0 -0 -0 -0 - -0 -0 -0 -1 -1 -0 -0 -0 -0 - -32768 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 - - - -All - -None - - -0 -0 -0 - - -0 -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\reslib.dll -reslib.dll -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release -dll -档案 - -1 -0 -%AppFolder% -1 -0 -0 -1000 -0 -0 -0 -0 -0 -0 -0 -0 - - - - - -0 - -0 -0 -0 -0 - -0 -0 -0 -1 -1 -0 -0 -0 -0 - -32768 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 - - - -All - -None - - -0 -0 -0 - - -0 -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\settings.exe -settings.exe -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release -exe -档案 - -1 -0 -%AppFolder% -1 -0 -0 -1000 -0 -0 -1 -0 -0 -0 -0 -0 - -Settings - - - -0 - -0 -0 -0 -0 - -0 -0 -0 -1 -1 -0 -0 -0 -0 - -32768 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 - - - -All - -None - - -0 -0 -0 - - -0 -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\others\uninstall_icon.ico -uninstall_icon.ico -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\others -ico -档案 - -1 -0 -%AppFolder% -1 -0 -0 -1000 -0 -0 -0 -0 -0 -0 -0 -0 - - - - - -0 - -0 -0 -0 -0 - -0 -0 -0 -1 -1 -0 -0 -0 -0 - -32768 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 - - - -All - -None - - -0 -0 -0 - - - - - -100 -Welcome to Setup -1 -Welcome to Setup -0 - -0 -ffffff -ece9d8 -ece9d8 -000000 -000000 -ffffff -ece9d8 -ece9d8 -ffffff -aca899 -000000 -000000 -aca899 -316ac5 -716f64 -Developer_top.jpg -Developer_side.jpg -Developer_body.jpg -0 -0 -1 -0 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --24 -700 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - - -0 -15 -15 -15 -15 - - -1 -15 -15 -15 -15 - - -2 -15 -15 -15 -15 - -10 -10 -497 -362 - - - -On Preload - - - - - - -On Back - - - - - - -On Next - - - - - - -On Cancel - - - - - - -On Help - - - - - - -On Ctrl Message -number e_CtrlID, number e_MsgID, table e_Details - - - - - - - -1 -103 -0 -0 -75 -1 - - -1 -101 -1 -0 -76 -1 - - -1 -100 -1 -1 -77 -1 - - -1 -102 -1 -1 -78 -1 - - -2 -200 -1 -1 -1 -0 - - -2 -300 -1 -1 -0 -1 - - - - - -English -1 -9 - -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 - - - -%ProductName% Setup -Welcome -Welcome to the installer for %ProductName% %ProductVer% -&Next > -< &Back -&Cancel -&Help -Welcome to the installer for %ProductName% %ProductVer%. - -It is strongly recommended that you exit all Windows programs before continuing with this installation. - -If you have any other programs running, please click Cancel, close the programs, and run this setup again. - -Otherwise, click Next to continue. - -Welcome - - - - -Chinese (Simplified) -0 -4 - -2 -3 -4 -5 - - - -%ProductName% 安装程序 -欢迎 -欢迎使用 %ProductName% %ProductVer% 安装程序 -下一步(&N) > -< 返回(&B) -取消(&C) -帮助(&H) -欢迎使用 %ProductName% %ProductVer% 安装程序。 - -强烈建议您在继续该安装之前,退出所有 Windows 程序。 - -如果您有任何其他程序正在运行,请单击“取消”,关闭程序,然后再次运行该安装程序。 - -否则,请单击“下一步”继续。 - -欢迎 - - - - - -125 -License Agreement -2 -License Agreement -0 - -0 -ffffff -ece9d8 -ece9d8 -000000 -000000 -ffffff -ece9d8 -ece9d8 -ffffff -aca899 -000000 -000000 -aca899 -316ac5 -716f64 -Developer_top.jpg -Developer_side.jpg -Developer_body.jpg -0 -0 -1 -0 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --24 -700 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - - -0 -15 -15 -15 -15 - - -1 -15 -15 -15 -15 - - -2 -15 -15 -15 -15 - -10 -10 -497 -362 - -1 - - -On Preload - - - - - - -On Back - - - - - - -On Next - - - - - - -On Cancel - - - - - - -On Help - - - - - - -On Ctrl Message -number e_CtrlID, number e_MsgID, table e_Details - - - - - - - -1 -103 -0 -0 -75 -1 - - -1 -101 -1 -1 -76 -1 - - -1 -100 -1 -1 --10 -1 - - -1 -102 -1 -1 --9 -1 - - -3 -400 -1 -1 -0 -0 -0 -1 -0 -0 - -1 -1 - - - -5 -602 -1 -1 -35 -1 -602 -603 - - -5 -603 -1 -1 -40 -0 -602 -603 - - - - - -English -1 -9 - -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 - - - -%ProductName% Setup -License Agreement -Please read the following license agreement carefully. -&Next > -< &Back -&Cancel -&Help -Insert your license agreement text here... -I agree to the terms of this license agreement -I do not agree to the terms of this license agreement - - - - - -Chinese (Simplified) -0 -4 - -2 -3 -4 -5 - - - -%ProductName% 安装程序 -许可协议 -请仔细阅读以下许可协议。 -下一步(&N) > -< 返回(&B) -取消(&C) -帮助(&H) -在此插入您的许可协议文本... -我同意该许可协议的条款 -我不同意该许可协议的条款 - - - - - - -110 -Select Install Folder -2 -Select Install Folder -0 - -0 -ffffff -ece9d8 -ece9d8 -000000 -000000 -ffffff -ece9d8 -ece9d8 -ffffff -aca899 -000000 -000000 -aca899 -316ac5 -716f64 -Developer_top.jpg -Developer_side.jpg -Developer_body.jpg -0 -0 -1 -0 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --24 -700 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - - -0 -15 -15 -15 -15 - - -1 -15 -15 -15 -15 - - -2 -15 -15 -15 -15 - -10 -10 -497 -362 - -%AppFolder% - - -On Preload - - - - - - -On Back - - - - - - -On Next - - - - - - -On Cancel - - - - - - -On Help - - - - - - -On Ctrl Message -number e_CtrlID, number e_MsgID, table e_Details - - - - - - - -1 -103 -0 -0 -75 -1 - - -1 -101 -1 -1 -76 -1 - - -1 -100 -1 -1 --10 -1 - - -1 -102 -1 -1 --9 -1 - - -2 -203 -1 -1 -1 -0 - - -2 -211 -1 -1 -2 -0 - - -6 -801 -1 -1 -3 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%AppFolder% - - -1 -110 -1 -1 -4 -0 - - -2 -208 -1 -1 -5 -0 - - -2 -207 -1 -1 -6 -0 - - - - - -English -1 -9 - -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 - - - -%ProductName% Setup -Installation Folder -Where would you like %ProductName% to be installed? -&Next > -< &Back -&Cancel -&Help -C&hange... -%AppFolder% -The software will be installed in the folder listed below. To select a different location, either type in a new path, or click Change to browse for an existing folder. -Install %ProductName% to: -Space required: %SpaceRequired% -Space available on selected drive: %SpaceAvailable% - - - - -Chinese (Simplified) -0 -4 - -2 -3 -4 -5 - - - -%ProductName% 安装程序 -安装文件夹 -您想将 %ProductName% 安装到何处? -下一步(&N) > -< 返回(&B) -取消(&C) -帮助(&H) -更改(&H)... -%AppFolder% -软件将被安装到以下列出的文件夹中。要选择不同的位置,键入新的路径,或单击“更改”浏览现有的文件夹。 -将 %ProductName% 安装到: -所需空间: %SpaceRequired% -选定驱动器的可用空间: %SpaceAvailable% - - - - - -115 -Select Shortcut Folder -2 -Select Shortcut Folder -0 - -0 -ffffff -ece9d8 -ece9d8 -000000 -000000 -ffffff -ece9d8 -ece9d8 -ffffff -aca899 -000000 -000000 -aca899 -316ac5 -716f64 -Developer_top.jpg -Developer_side.jpg -Developer_body.jpg -0 -0 -1 -0 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --24 -700 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - - -0 -15 -15 -15 -15 - - -1 -15 -15 -15 -15 - - -2 -15 -15 -15 -15 - -10 -10 -497 -362 - -%AppShortcutFolderName% - - -On Preload - - - - - - -On Back - - - - - - -On Next - - - - - - -On Cancel - - - - - - -On Help - - - - - - -On Ctrl Message -number e_CtrlID, number e_MsgID, table e_Details - - - - - - - -1 -103 -0 -0 -75 -1 - - -1 -101 -1 -1 -76 -1 - - -1 -100 -1 -1 --10 -1 - - -1 -102 -1 -1 --9 -1 - - -2 -203 -1 -1 -0 -0 - - -2 -211 -1 -1 -1 -0 - - -4 -501 -1 -1 -2 -0 -1 -1 - -4 -1 - - -5 -600 -1 -1 -35 -1 -600 -601 - - -5 -601 -1 -1 -40 -0 -600 -601 - - - - - -English -1 -9 - -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 - - - -%ProductName% Setup -Shortcut Folder -Where would you like the shortcuts to be installed? -&Next > -< &Back -&Cancel -&Help -The shortcut icons will be created in the folder indicated below. If you don't want to use the default folder, you can either type a new name, or select an existing folder from the list. -Shortcut Folder: -Install shortcuts for current user only -Make shortcuts available to all users -%AppShortcutFolderName% - - - - -Chinese (Simplified) -0 -4 - -2 -3 -4 -5 - - - -%ProductName% 安装程序 -快捷方式文件夹 -您想将快捷方式安装到何处? -下一步(&N) > -< 返回(&B) -取消(&C) -帮助(&H) -快捷方式图标将在下面指出的文件夹中创建。如果您不想使用默认文件夹,您可以键入新的名称,或从列表中选择现有的文件夹。 -快捷方式文件夹: -只对当前用户安装快捷方式 -使快捷方式对所有用户都可用 -%AppShortcutFolderName% - - - - - -100 -Ready to Install -2 -Ready to Install -0 - -0 -ffffff -ece9d8 -ece9d8 -000000 -000000 -ffffff -ece9d8 -ece9d8 -ffffff -aca899 -000000 -000000 -aca899 -316ac5 -716f64 -Developer_top.jpg -Developer_side.jpg -Developer_body.jpg -0 -0 -1 -0 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --24 -700 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - - -0 -15 -15 -15 -15 - - -1 -15 -15 -15 -15 - - -2 -15 -15 -15 -15 - -10 -10 -497 -362 - - - -On Preload - - - - - - -On Back - - - - - - -On Next - - - - - - -On Cancel - - - - - - -On Help - - - - - - -On Ctrl Message -number e_CtrlID, number e_MsgID, table e_Details - - - - - - - -1 -103 -0 -0 -75 -1 - - -1 -101 -1 -1 -76 -1 - - -1 -100 -1 -1 --10 -1 - - -1 -102 -1 -1 --9 -1 - - -2 -200 -1 -1 -0 -0 - - -2 -300 -0 -1 -1 -1 - - - - - -English -1 -9 - -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 - - - -%ProductName% Setup -Ready to Install -You are now ready to install %ProductName% %ProductVer% -&Next > -< &Back -&Cancel -&Help -The installer now has enough information to install %ProductName% on your computer. - - -The following settings will be used: - -Install folder: %AppFolder% - -Shortcut folder: %AppShortcutFolderName% - - -Please click Next to proceed with the installation. -Title - - - - -Chinese (Simplified) -0 -4 - -2 -3 -4 -5 - - - -%ProductName% 安装程序 -准备安装 -现在您正准备安装 %ProductName% %ProductVer% -下一步(&N) > -< 返回(&B) -取消(&C) -帮助(&H) -现在安装程序已有足够的信息将 %ProductName% 安装到您的计算机中。 - - -将使用以下设置: - -安装文件夹: %AppFolder% - -快捷方式文件夹: %AppShortcutFolderName% - - -请单击“下一步”继续安装。 -标题 - - - - - - -1 - - -130 -One Progress Bar (While Installing) -2 -One Progress Bar (While Installing) -0 - -0 -ffffff -ece9d8 -ece9d8 -000000 -000000 -ffffff -ece9d8 -ece9d8 -ffffff -aca899 -000000 -000000 -aca899 -316ac5 -716f64 -Developer_top.jpg -Developer_side.jpg -Developer_body.jpg -0 -0 -1 -0 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --24 -700 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - - -0 -15 -15 -15 -15 - - -1 -15 -15 -15 -15 - - -2 -15 -15 -15 -15 - -10 -10 -497 -362 - -1 - - -On Preload - - - - - - -On Progress -number e_Stage, string e_CurrentItemText, number e_CurrentItemPct, number e_StagePct - - - - - -On Cancel - - - - - - - - -1 -102 -1 -1 -78 -1 - - -2 -203 -1 -1 -1 -0 - - -2 -211 -1 -1 -2 -0 - - -2 -212 -1 -1 -3 -0 - - -7 -900 -1 -1 -4 - -0 -100 -1 - - -2 -213 -0 -1 -2 -0 - - -2 -214 -0 -1 -3 -0 - - -7 -901 -0 -1 -4 - -0 -100 -0 - - - - - -English -1 -9 - -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 - - - -%ProductName% Setup -Installing %ProductName% -Please wait... -&Cancel - - - - -Progress Two -Performing Actions... - - - - - -Chinese (Simplified) -0 -4 - -2 -3 -4 -5 - - - -%ProductName% 安装程序 -正在安装 %ProductName% -请稍候... -取消(&C) - - - - -进程二 -正在执行动作... - - - - - - - - - -100 -Finished Install -1 -Finished Install -0 - -0 -ffffff -ece9d8 -ece9d8 -000000 -000000 -ffffff -ece9d8 -ece9d8 -ffffff -aca899 -000000 -000000 -aca899 -316ac5 -716f64 -Developer_top.jpg -Developer_side.jpg -Developer_body.jpg -0 -0 -1 -0 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --24 -700 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - - -0 -15 -15 -15 -15 - - -1 -15 -15 -15 -15 - - -2 -15 -15 -15 -15 - -10 -10 -497 -362 - - - -On Preload - - - - - - -On Back - - - - - - -On Next - - - - - - -On Cancel - - - - - - -On Help - - - - - - -On Ctrl Message -number e_CtrlID, number e_MsgID, table e_Details - - - - - - - -1 -103 -0 -0 -75 -1 - - -1 -101 -1 -0 -76 -1 - - -1 -100 -1 -1 --10 -1 - - -1 -102 -1 -0 --9 -1 - - -2 -200 -1 -1 -0 -0 - - -2 -300 -1 -1 -1 -1 - - - - - -English -1 -9 - -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 - - - -%ProductName% Setup -Installation Finished -The installation has completed successfully. -&Finish -< &Back -&Cancel -&Help -The %ProductName% %ProductVer% installation is complete. - -Thank you for choosing %ProductName%! - -Please click Finish to exit this installer. - -Installation Successful - - - - -Chinese (Simplified) -0 -4 - -2 -3 -4 -5 - - - -%ProductName% 安装程序 -安装已完成 -安装已成功完成。 -完成(&F) -< 返回(&B) -取消(&C) -帮助(&H) -%ProductName% %ProductVer% 安装已完成。 - -感谢您选择 %ProductName%! - -请单击“完成”退出该安装程序。 - -安装成功 - - - - - - - - -List 1 - -All - - - - - -1 -uninstall.xml -%AppFolder%\Uninstall -%AppFolder%\uninstall.exe -1 -0 -0 - -0 -0 -1 -008080 -b4c2e3 -5971b6 - -0 - -0 -0 -%ProductName% Uninstall - - -Arial -0 --37 -700 -1 -0 -0 -1 - - -ffffff -000000 -0 -1 -v%ProductVer% - - -Arial -0 --18 -700 -1 -0 -0 -1 - - -ffffff -000000 -0 -1 -
%Copyright% %CompanyName%. All rights reserved. %CompanyURL%
- - -Arial -0 --16 -400 -0 -0 -0 -1 - - -ffffff -000000 -0 -1 -
-1 -1 -1 -1 -Microsoft.DesktopAppInstaller -%ProductName% -1 -%AppFolder%\appinstaller.exe -1 -%CompanyName% -%CompanyURL% -%CompanyName% Support Department -%CompanyURL% -%ProductVer% - - - - - -%AppFolder% - - -1 -Uninstall -Removes %ProductName% from your computer. -1 -%AppFolder%\uninstall_icon.ico -0 -1 -%TempFolder%\%ProductName% Uninstall Log.txt -0 -0 -1 - - -100 -Welcome to Uninstall -1 -Welcome to Uninstall -0 - -0 -ffffff -ece9d8 -ece9d8 -000000 -000000 -ffffff -ece9d8 -ece9d8 -ffffff -aca899 -000000 -000000 -aca899 -316ac5 -716f64 -Developer_top.jpg -Developer_side.jpg -Developer_body.jpg -0 -0 -1 -0 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --24 -700 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - - -0 -15 -15 -15 -15 - - -1 -15 -15 -15 -15 - - -2 -15 -15 -15 -15 - -10 -10 -497 -362 - - - -On Preload - - - - - - -On Back - - - - - - -On Next - - - - - - -On Cancel - - - - - - -On Help - - - - - - -On Ctrl Message -number e_CtrlID, number e_MsgID, table e_Details - - - - - - - -1 -103 -0 -0 -75 -1 - - -1 -101 -1 -0 -76 -1 - - -1 -100 -1 -1 --10 -1 - - -1 -102 -1 -1 --9 -1 - - -2 -200 -1 -1 -1 -0 - - -2 -300 -1 -1 -0 -1 - - - - - -English -1 -9 - -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 - - - -%ProductName% Uninstaller -Welcome -Welcome to the uninstaller for %ProductName% %ProductVer% -&Next > -< &Back -&Cancel -&Help -This program will uninstall %ProductName% %ProductVer%. - -If %ProductName% is currently running, please close it before proceeding with the uninstallation. - -Otherwise, click Next to continue. - -Uninstall %ProductName% - - - - -Chinese (Simplified) -0 -4 - -2 -3 -4 -5 - - - -%ProductName% 卸载程序 -欢迎 -欢迎使用 %ProductName% %ProductVer% 卸载程序 -下一步(&N) > -< 返回(&B) -取消(&C) -帮助(&H) -该程序将卸载 %ProductName% %ProductVer%。 - -如果 %ProductName% 当前正在运行,继续卸载之前请将其关闭。 - -否则,请单击“下一步”继续。 - -卸载 %ProductName% - - - - - - -1 - - -130 -One Progress Bar (While Uninstalling) -2 -One Progress Bar (While Uninstalling) -0 - -0 -ffffff -ece9d8 -ece9d8 -000000 -000000 -ffffff -ece9d8 -ece9d8 -ffffff -aca899 -000000 -000000 -aca899 -316ac5 -716f64 -Developer_top.jpg -Developer_side.jpg -Developer_body.jpg -0 -0 -1 -0 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --24 -700 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - - -0 -15 -15 -15 -15 - - -1 -15 -15 -15 -15 - - -2 -15 -15 -15 -15 - -10 -10 -497 -362 - -1 - - -On Preload - - - - - - -On Progress -number e_Stage, string e_CurrentItemText, number e_CurrentItemPct, number e_StagePct - - - - - -On Cancel - - - - - - - - -1 -102 -1 -1 -78 -1 - - -2 -203 -1 -1 -1 -0 - - -2 -211 -1 -1 -2 -0 - - -2 -212 -1 -1 -3 -0 - - -7 -900 -1 -1 -4 - -0 -100 -1 - - -2 -213 -0 -1 -2 -0 - - -2 -214 -0 -1 -3 -0 - - -7 -901 -0 -1 -4 - -0 -100 -0 - - - - - -English -1 -9 - -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 - - - -%ProductName% Uninstaller -Removing %ProductName% -Please wait... -&Cancel - - - - -Progress Two -Performing Actions... - - - - - -Chinese (Simplified) -0 -4 - -2 -3 -4 -5 - - - -%ProductName% 卸载程序 -正在移除 %ProductName% -请稍候... -取消(&C) - - - - -进程二 -正在执行动作... - - - - - - - - - -100 -Finished Uninstall -1 -Finished Uninstall -0 - -0 -ffffff -ece9d8 -ece9d8 -000000 -000000 -ffffff -ece9d8 -ece9d8 -ffffff -aca899 -000000 -000000 -aca899 -316ac5 -716f64 -Developer_top.jpg -Developer_side.jpg -Developer_body.jpg -0 -0 -1 -0 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --24 -700 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - - -0 -15 -15 -15 -15 - - -1 -15 -15 -15 -15 - - -2 -15 -15 -15 -15 - -10 -10 -497 -362 - - - -On Preload - - - - - - -On Back - - - - - - -On Next - - - - - - -On Cancel - - - - - - -On Help - - - - - - -On Ctrl Message -number e_CtrlID, number e_MsgID, table e_Details - - - - - - - -1 -103 -0 -0 -75 -1 - - -1 -101 -1 -0 -76 -1 - - -1 -100 -1 -1 --10 -1 - - -1 -102 -1 -0 --9 -1 - - -2 -200 -1 -1 -0 -0 - - -2 -300 -1 -1 -1 -1 - - - - - -English -1 -9 - -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 - - - -%ProductName% Uninstaller -Uninstallation Finished -The uninstallation has completed successfully. -&Finish -< &Back -&Cancel -&Help -%ProductName% %ProductVer% has been uninstalled. - -Please click Finish to exit. - -Uninstallation Successful - - - - -Chinese (Simplified) -0 -4 - -2 -3 -4 -5 - - - -%ProductName% 卸载程序 -卸载已完成 -卸载已成功完成。 -完成(&F) -< 返回(&B) -取消(&C) -帮助(&H) -%ProductName% %ProductVer% 已被卸载。 - -请单击“完成”退出。 - -卸载成功 - - - - - - - -在启动时 - - - - - - -On Post Uninstall - - - - - - -
- - -1 -%TempFolder%\%ProductName% Setup Log.txt -0 -1 - -0 -0 -0 -1 -2 - -0 -0 -1 -008080 -b4c2e3 -5971b6 - -1 -%TempLaunchFolder%\main.ico -0 -0 -%ProductName% - - -Arial -0 --37 -700 -1 -0 -0 -1 - - -ffffff -000000 -0 -1 -v%ProductVer% - - -Arial -0 --18 -700 -1 -0 -0 -1 - - -ffffff -000000 -0 -1 -
%Copyright%. All rights reserved. %CompanyURL%
- - -Arial -0 --16 -400 -0 -0 -0 -1 - - -ffffff -000000 -0 -1 -
- -0 -0 -30 -30 -1 -1767105338 -0 -0 -1 -1 -2 -1 -0 -03F9811E-4657-4757-A24D-570C64F8ABB6 -0 -%CompanyName% -%CompanyURL% - - - - - -32768 -65535 -65535 -65535 -0 -0 -0 -0 -0 -0 -65535 -65535 -65535 -65535 -65535 -65535 - -0 -0 -0 -0 -1 -0 - - -Developer -New Project - - - -Copyright 2025 - - -9.5.3.0 -9.5.3.0 -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\shared - -0 - - - - - - -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\appinstaller\res\icons\main.ico -1 -0 - -All - - - - - -全局函数 - - - - - - -在安装后 - - - - - - -
- - -English -1 -9 - -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 - - - -Chinese (Simplified) -0 -4 - -2 -3 -4 -5 - - - - - -%ProductName% -Desktop App Installer -1 - - -%CompanyName% -Windows Modern -1 - - -%ProductVer% -0.1.0.0 -1 - - -%Copyright% -Copyright (C)2025 %CompanyName% -1 - - -%CompanyURL% - -1 - - -%WindowTitle% -%ProductName% Setup (Develop Mode) -1 - - -%WindowTitleUninstall% -%ProductName% Uninstaller (Develop Mode) -1 - - -%AppFolder% -%ProgramFilesFolder%\%ProductName% -2 - - -%AppShortcutFolderName% -%ProductName% -2 - - - - -Default - - -0 - - -0 -setup.exe -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Generated -0 -0 -0 -0 -0 -0 - -1 - - - - - -1 - - -0 - - - - - -1 -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\appinstaller\res\icons\main.ico -9.5.3.0 -9.5.3.0 -Indigo Rose Corporation -Setup Factory Runtime -Created with Setup Factory -sf_rt -Setup Application -Setup Engine Copyright ?1992-2019 Indigo Rose Corporation -Setup Factory is a trademark of Indigo Rose Corporation - - -0 - - - - - - -#SUFDIR#\Includes\Scripts\_SUF70_Global_Functions.lua -1 - -All - - - -
\ No newline at end of file diff --git a/others/Autosave/autosave_2025-11-30_23-23-01.suf b/others/Autosave/autosave_2025-11-30_23-23-01.suf deleted file mode 100644 index ab0cd7e..0000000 --- a/others/Autosave/autosave_2025-11-30_23-23-01.suf +++ /dev/null @@ -1,4857 +0,0 @@ - - -{AFB904C4-C255-4540-B97E-A75A34F1FFB0} -9.5.3.0 - - - -1 - -*.* -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\shared -* -档案 - -1 -0 -%AppFolder% -1 -0 -0 -1000 -0 -0 -0 -0 -0 -0 -0 -0 - - - - - -0 - -0 -0 -0 -1 - -1 -1 -0 -1 -1 -0 -0 -0 -0 - -32768 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 - - - -All - -None - - -0 -0 -0 - - -0 -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\appinstaller.exe -appinstaller.exe -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release -exe -档案 - -1 -0 -%AppFolder% -1 -0 -0 -1000 -0 -0 -1 -0 -0 -0 -0 -0 - -App Installer - - - -0 - -0 -0 -0 -0 - -0 -0 -0 -1 -1 -0 -0 -0 -0 - -32768 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 - - - -All - -None - - -0 -0 -0 - - -0 -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\certmgr.dll -certmgr.dll -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release -dll -档案 - -1 -0 -%AppFolder% -1 -0 -0 -1000 -0 -0 -0 -0 -0 -0 -0 -0 - - - - - -0 - -0 -0 -0 -0 - -0 -0 -0 -1 -1 -0 -0 -0 -0 - -32768 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 - - - -All - -None - - -0 -0 -0 - - -0 -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\notice.dll -notice.dll -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release -dll -档案 - -1 -0 -%AppFolder% -1 -0 -0 -1000 -0 -0 -0 -0 -0 -0 -0 -0 - - - - - -0 - -0 -0 -0 -0 - -0 -0 -0 -1 -1 -0 -0 -0 -0 - -32768 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 - - - -All - -None - - -0 -0 -0 - - -0 -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\pkgmgr.dll -pkgmgr.dll -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release -dll -档案 - -1 -0 -%AppFolder% -1 -0 -0 -1000 -0 -0 -0 -0 -0 -0 -0 -0 - - - - - -0 - -0 -0 -0 -0 - -0 -0 -0 -1 -1 -0 -0 -0 -0 - -32768 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 - - - -All - -None - - -0 -0 -0 - - -0 -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\pkgread.dll -pkgread.dll -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release -dll -档案 - -1 -0 -%AppFolder% -1 -0 -0 -1000 -0 -0 -0 -0 -0 -0 -0 -0 - - - - - -0 - -0 -0 -0 -0 - -0 -0 -0 -1 -1 -0 -0 -0 -0 - -32768 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 - - - -All - -None - - -0 -0 -0 - - -0 -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\PriFileFormat.dll -PriFileFormat.dll -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release -dll -档案 - -1 -0 -%AppFolder% -1 -0 -0 -1000 -0 -0 -0 -0 -0 -0 -0 -0 - - - - - -0 - -0 -0 -0 -0 - -0 -0 -0 -1 -1 -0 -0 -0 -0 - -32768 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 - - - -All - -None - - -0 -0 -0 - - -0 -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\priformatcli.dll -priformatcli.dll -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release -dll -档案 - -1 -0 -%AppFolder% -1 -0 -0 -1000 -0 -0 -0 -0 -0 -0 -0 -0 - - - - - -0 - -0 -0 -0 -0 - -0 -0 -0 -1 -1 -0 -0 -0 -0 - -32768 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 - - - -All - -None - - -0 -0 -0 - - -0 -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\reslib.dll -reslib.dll -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release -dll -档案 - -1 -0 -%AppFolder% -1 -0 -0 -1000 -0 -0 -0 -0 -0 -0 -0 -0 - - - - - -0 - -0 -0 -0 -0 - -0 -0 -0 -1 -1 -0 -0 -0 -0 - -32768 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 - - - -All - -None - - -0 -0 -0 - - -0 -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\settings.exe -settings.exe -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release -exe -档案 - -1 -0 -%AppFolder% -1 -0 -0 -1000 -0 -0 -1 -0 -0 -0 -0 -0 - -Settings - - - -0 - -0 -0 -0 -0 - -0 -0 -0 -1 -1 -0 -0 -0 -0 - -32768 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 - - - -All - -None - - -0 -0 -0 - - -0 -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\others\uninstall_icon.ico -uninstall_icon.ico -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\others -ico -档案 - -1 -0 -%AppFolder% -1 -0 -0 -1000 -0 -0 -0 -0 -0 -0 -0 -0 - - - - - -0 - -0 -0 -0 -0 - -0 -0 -0 -1 -1 -0 -0 -0 -0 - -32768 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 -65535 - - - -All - -None - - -0 -0 -0 - - - - - -100 -Welcome to Setup -1 -Welcome to Setup -0 - -0 -ffffff -ece9d8 -ece9d8 -000000 -000000 -ffffff -ece9d8 -ece9d8 -ffffff -aca899 -000000 -000000 -aca899 -316ac5 -716f64 -Developer_top.jpg -Developer_side.jpg -Developer_body.jpg -0 -0 -1 -0 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --24 -700 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - - -0 -15 -15 -15 -15 - - -1 -15 -15 -15 -15 - - -2 -15 -15 -15 -15 - -10 -10 -497 -362 - - - -On Preload - - - - - - -On Back - - - - - - -On Next - - - - - - -On Cancel - - - - - - -On Help - - - - - - -On Ctrl Message -number e_CtrlID, number e_MsgID, table e_Details - - - - - - - -1 -103 -0 -0 -75 -1 - - -1 -101 -1 -0 -76 -1 - - -1 -100 -1 -1 -77 -1 - - -1 -102 -1 -1 -78 -1 - - -2 -200 -1 -1 -1 -0 - - -2 -300 -1 -1 -0 -1 - - - - - -English -1 -9 - -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 - - - -%ProductName% Setup -Welcome -Welcome to the installer for %ProductName% %ProductVer% -&Next > -< &Back -&Cancel -&Help -Welcome to the installer for %ProductName% %ProductVer%. - -It is strongly recommended that you exit all Windows programs before continuing with this installation. - -If you have any other programs running, please click Cancel, close the programs, and run this setup again. - -Otherwise, click Next to continue. - -Welcome - - - - -Chinese (Simplified) -0 -4 - -2 -3 -4 -5 - - - -%ProductName% 安装程序 -欢迎 -欢迎使用 %ProductName% %ProductVer% 安装程序 -下一步(&N) > -< 返回(&B) -取消(&C) -帮助(&H) -欢迎使用 %ProductName% %ProductVer% 安装程序。 - -强烈建议您在继续该安装之前,退出所有 Windows 程序。 - -如果您有任何其他程序正在运行,请单击“取消”,关闭程序,然后再次运行该安装程序。 - -否则,请单击“下一步”继续。 - -欢迎 - - - - - -125 -License Agreement -2 -License Agreement -0 - -0 -ffffff -ece9d8 -ece9d8 -000000 -000000 -ffffff -ece9d8 -ece9d8 -ffffff -aca899 -000000 -000000 -aca899 -316ac5 -716f64 -Developer_top.jpg -Developer_side.jpg -Developer_body.jpg -0 -0 -1 -0 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --24 -700 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - - -0 -15 -15 -15 -15 - - -1 -15 -15 -15 -15 - - -2 -15 -15 -15 -15 - -10 -10 -497 -362 - -1 - - -On Preload - - - - - - -On Back - - - - - - -On Next - - - - - - -On Cancel - - - - - - -On Help - - - - - - -On Ctrl Message -number e_CtrlID, number e_MsgID, table e_Details - - - - - - - -1 -103 -0 -0 -75 -1 - - -1 -101 -1 -1 -76 -1 - - -1 -100 -1 -1 --10 -1 - - -1 -102 -1 -1 --9 -1 - - -3 -400 -1 -1 -0 -0 -0 -1 -0 -0 - -1 -1 - - - -5 -602 -1 -1 -35 -1 -602 -603 - - -5 -603 -1 -1 -40 -0 -602 -603 - - - - - -English -1 -9 - -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 - - - -%ProductName% Setup -License Agreement -Please read the following license agreement carefully. -&Next > -< &Back -&Cancel -&Help -Insert your license agreement text here... -I agree to the terms of this license agreement -I do not agree to the terms of this license agreement - - - - - -Chinese (Simplified) -0 -4 - -2 -3 -4 -5 - - - -%ProductName% 安装程序 -许可协议 -请仔细阅读以下许可协议。 -下一步(&N) > -< 返回(&B) -取消(&C) -帮助(&H) -在此插入您的许可协议文本... -我同意该许可协议的条款 -我不同意该许可协议的条款 - - - - - - -105 -Scrolling Text -2 -Scrolling Text -0 - -0 -ffffff -ece9d8 -ece9d8 -000000 -000000 -ffffff -ece9d8 -ece9d8 -ffffff -aca899 -000000 -000000 -aca899 -316ac5 -716f64 -Developer_top.jpg -Developer_side.jpg -Developer_body.jpg -0 -0 -1 -0 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --24 -700 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - - -0 -15 -15 -15 -15 - - -1 -15 -15 -15 -15 - - -2 -15 -15 -15 -15 - -10 -10 -497 -362 - - - -On Preload - - - - - - -On Back - - - - - - -On Next - - - - - - -On Cancel - - - - - - -On Help - - - - - - -On Ctrl Message -number e_CtrlID, number e_MsgID, table e_Details - - - - - - - -1 -103 -0 -0 -75 -1 - - -1 -101 -1 -1 -76 -1 - - -1 -100 -1 -1 --10 -1 - - -1 -102 -1 -1 --9 -1 - - -3 -400 -1 -1 -0 -0 -0 -1 -0 -0 - -1 -1 - - - - - - -English -1 -9 - -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 - - - -%ProductName% Setup -Important Information -Please read the following information. -&Next > -< &Back -&Cancel -&Help -This is currently in test mode, and this release is solely for testing the program's update features. While this version is available, the official release is still recommended. - - - - - -Chinese (Simplified) -0 -4 - -2 -3 -4 -5 - - - -%ProductName% 安装程序 -重要信息 -请阅读以下信息。 -下一步(&N) > -< 返回(&B) -取消(&C) -帮助(&H) -当前是测试模式,发行此版本仅用于此程序的更新功能测试。虽然此版本可用,但仍建议使用正式版本。 - - - - - - -110 -Select Install Folder -2 -Select Install Folder -0 - -0 -ffffff -ece9d8 -ece9d8 -000000 -000000 -ffffff -ece9d8 -ece9d8 -ffffff -aca899 -000000 -000000 -aca899 -316ac5 -716f64 -Developer_top.jpg -Developer_side.jpg -Developer_body.jpg -0 -0 -1 -0 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --24 -700 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - - -0 -15 -15 -15 -15 - - -1 -15 -15 -15 -15 - - -2 -15 -15 -15 -15 - -10 -10 -497 -362 - -%AppFolder% - - -On Preload - - - - - - -On Back - - - - - - -On Next - - - - - - -On Cancel - - - - - - -On Help - - - - - - -On Ctrl Message -number e_CtrlID, number e_MsgID, table e_Details - - - - - - - -1 -103 -0 -0 -75 -1 - - -1 -101 -1 -1 -76 -1 - - -1 -100 -1 -1 --10 -1 - - -1 -102 -1 -1 --9 -1 - - -2 -203 -1 -1 -1 -0 - - -2 -211 -1 -1 -2 -0 - - -6 -801 -1 -1 -3 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%AppFolder% - - -1 -110 -1 -1 -4 -0 - - -2 -208 -1 -1 -5 -0 - - -2 -207 -1 -1 -6 -0 - - - - - -English -1 -9 - -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 - - - -%ProductName% Setup -Installation Folder -Where would you like %ProductName% to be installed? -&Next > -< &Back -&Cancel -&Help -C&hange... -%AppFolder% -The software will be installed in the folder listed below. To select a different location, either type in a new path, or click Change to browse for an existing folder. -Install %ProductName% to: -Space required: %SpaceRequired% -Space available on selected drive: %SpaceAvailable% - - - - -Chinese (Simplified) -0 -4 - -2 -3 -4 -5 - - - -%ProductName% 安装程序 -安装文件夹 -您想将 %ProductName% 安装到何处? -下一步(&N) > -< 返回(&B) -取消(&C) -帮助(&H) -更改(&H)... -%AppFolder% -软件将被安装到以下列出的文件夹中。要选择不同的位置,键入新的路径,或单击“更改”浏览现有的文件夹。 -将 %ProductName% 安装到: -所需空间: %SpaceRequired% -选定驱动器的可用空间: %SpaceAvailable% - - - - - -115 -Select Shortcut Folder -2 -Select Shortcut Folder -0 - -0 -ffffff -ece9d8 -ece9d8 -000000 -000000 -ffffff -ece9d8 -ece9d8 -ffffff -aca899 -000000 -000000 -aca899 -316ac5 -716f64 -Developer_top.jpg -Developer_side.jpg -Developer_body.jpg -0 -0 -1 -0 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --24 -700 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - - -0 -15 -15 -15 -15 - - -1 -15 -15 -15 -15 - - -2 -15 -15 -15 -15 - -10 -10 -497 -362 - -%AppShortcutFolderName% - - -On Preload - - - - - - -On Back - - - - - - -On Next - - - - - - -On Cancel - - - - - - -On Help - - - - - - -On Ctrl Message -number e_CtrlID, number e_MsgID, table e_Details - - - - - - - -1 -103 -0 -0 -75 -1 - - -1 -101 -1 -1 -76 -1 - - -1 -100 -1 -1 --10 -1 - - -1 -102 -1 -1 --9 -1 - - -2 -203 -1 -1 -0 -0 - - -2 -211 -1 -1 -1 -0 - - -4 -501 -1 -1 -2 -0 -1 -1 - -4 -1 - - -5 -600 -1 -1 -35 -1 -600 -601 - - -5 -601 -1 -1 -40 -0 -600 -601 - - - - - -English -1 -9 - -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 - - - -%ProductName% Setup -Shortcut Folder -Where would you like the shortcuts to be installed? -&Next > -< &Back -&Cancel -&Help -The shortcut icons will be created in the folder indicated below. If you don't want to use the default folder, you can either type a new name, or select an existing folder from the list. -Shortcut Folder: -Install shortcuts for current user only -Make shortcuts available to all users -%AppShortcutFolderName% - - - - -Chinese (Simplified) -0 -4 - -2 -3 -4 -5 - - - -%ProductName% 安装程序 -快捷方式文件夹 -您想将快捷方式安装到何处? -下一步(&N) > -< 返回(&B) -取消(&C) -帮助(&H) -快捷方式图标将在下面指出的文件夹中创建。如果您不想使用默认文件夹,您可以键入新的名称,或从列表中选择现有的文件夹。 -快捷方式文件夹: -只对当前用户安装快捷方式 -使快捷方式对所有用户都可用 -%AppShortcutFolderName% - - - - - -100 -Ready to Install -2 -Ready to Install -0 - -0 -ffffff -ece9d8 -ece9d8 -000000 -000000 -ffffff -ece9d8 -ece9d8 -ffffff -aca899 -000000 -000000 -aca899 -316ac5 -716f64 -Developer_top.jpg -Developer_side.jpg -Developer_body.jpg -0 -0 -1 -0 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --24 -700 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - - -0 -15 -15 -15 -15 - - -1 -15 -15 -15 -15 - - -2 -15 -15 -15 -15 - -10 -10 -497 -362 - - - -On Preload - - - - - - -On Back - - - - - - -On Next - - - - - - -On Cancel - - - - - - -On Help - - - - - - -On Ctrl Message -number e_CtrlID, number e_MsgID, table e_Details - - - - - - - -1 -103 -0 -0 -75 -1 - - -1 -101 -1 -1 -76 -1 - - -1 -100 -1 -1 --10 -1 - - -1 -102 -1 -1 --9 -1 - - -2 -200 -1 -1 -0 -0 - - -2 -300 -0 -1 -1 -1 - - - - - -English -1 -9 - -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 - - - -%ProductName% Setup -Ready to Install -You are now ready to install %ProductName% %ProductVer% -&Next > -< &Back -&Cancel -&Help -The installer now has enough information to install %ProductName% on your computer. - - -The following settings will be used: - -Install folder: %AppFolder% - -Shortcut folder: %AppShortcutFolderName% - - -Please click Next to proceed with the installation. -Title - - - - -Chinese (Simplified) -0 -4 - -2 -3 -4 -5 - - - -%ProductName% 安装程序 -准备安装 -现在您正准备安装 %ProductName% %ProductVer% -下一步(&N) > -< 返回(&B) -取消(&C) -帮助(&H) -现在安装程序已有足够的信息将 %ProductName% 安装到您的计算机中。 - - -将使用以下设置: - -安装文件夹: %AppFolder% - -快捷方式文件夹: %AppShortcutFolderName% - - -请单击“下一步”继续安装。 -标题 - - - - - - -1 - - -130 -One Progress Bar (While Installing) -2 -One Progress Bar (While Installing) -0 - -0 -ffffff -ece9d8 -ece9d8 -000000 -000000 -ffffff -ece9d8 -ece9d8 -ffffff -aca899 -000000 -000000 -aca899 -316ac5 -716f64 -Developer_top.jpg -Developer_side.jpg -Developer_body.jpg -0 -0 -1 -0 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --24 -700 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - - -0 -15 -15 -15 -15 - - -1 -15 -15 -15 -15 - - -2 -15 -15 -15 -15 - -10 -10 -497 -362 - -1 - - -On Preload - - - - - - -On Progress -number e_Stage, string e_CurrentItemText, number e_CurrentItemPct, number e_StagePct - - - - - -On Cancel - - - - - - - - -1 -102 -1 -1 -78 -1 - - -2 -203 -1 -1 -1 -0 - - -2 -211 -1 -1 -2 -0 - - -2 -212 -1 -1 -3 -0 - - -7 -900 -1 -1 -4 - -0 -100 -1 - - -2 -213 -0 -1 -2 -0 - - -2 -214 -0 -1 -3 -0 - - -7 -901 -0 -1 -4 - -0 -100 -0 - - - - - -English -1 -9 - -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 - - - -%ProductName% Setup -Installing %ProductName% -Please wait... -&Cancel - - - - -Progress Two -Performing Actions... - - - - - -Chinese (Simplified) -0 -4 - -2 -3 -4 -5 - - - -%ProductName% 安装程序 -正在安装 %ProductName% -请稍候... -取消(&C) - - - - -进程二 -正在执行动作... - - - - - - - - - -100 -Finished Install -1 -Finished Install -0 - -0 -ffffff -ece9d8 -ece9d8 -000000 -000000 -ffffff -ece9d8 -ece9d8 -ffffff -aca899 -000000 -000000 -aca899 -316ac5 -716f64 -Developer_top.jpg -Developer_side.jpg -Developer_body.jpg -0 -0 -1 -0 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --24 -700 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - - -0 -15 -15 -15 -15 - - -1 -15 -15 -15 -15 - - -2 -15 -15 -15 -15 - -10 -10 -497 -362 - - - -On Preload - - - - - - -On Back - - - - - - -On Next - - - - - - -On Cancel - - - - - - -On Help - - - - - - -On Ctrl Message -number e_CtrlID, number e_MsgID, table e_Details - - - - - - - -1 -103 -0 -0 -75 -1 - - -1 -101 -1 -0 -76 -1 - - -1 -100 -1 -1 --10 -1 - - -1 -102 -1 -0 --9 -1 - - -2 -200 -1 -1 -0 -0 - - -2 -300 -1 -1 -1 -1 - - - - - -English -1 -9 - -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 - - - -%ProductName% Setup -Installation Finished -The installation has completed successfully. -&Finish -< &Back -&Cancel -&Help -The %ProductName% %ProductVer% installation is complete. - -Thank you for choosing %ProductName%! - -Please click Finish to exit this installer. - -Installation Successful - - - - -Chinese (Simplified) -0 -4 - -2 -3 -4 -5 - - - -%ProductName% 安装程序 -安装已完成 -安装已成功完成。 -完成(&F) -< 返回(&B) -取消(&C) -帮助(&H) -%ProductName% %ProductVer% 安装已完成。 - -感谢您选择 %ProductName%! - -请单击“完成”退出该安装程序。 - -安装成功 - - - - - - - - -List 1 - -All - - - - - -1 -uninstall.xml -%AppFolder%\Uninstall -%AppFolder%\uninstall.exe -1 -0 -0 - -0 -0 -1 -008080 -b4c2e3 -5971b6 - -0 - -0 -0 -%ProductName% Uninstall - - -Arial -0 --37 -700 -1 -0 -0 -1 - - -ffffff -000000 -0 -1 -v%ProductVer% - - -Arial -0 --18 -700 -1 -0 -0 -1 - - -ffffff -000000 -0 -1 -
%Copyright% %CompanyName%. All rights reserved. %CompanyURL%
- - -Arial -0 --16 -400 -0 -0 -0 -1 - - -ffffff -000000 -0 -1 -
-1 -1 -1 -1 -Microsoft.DesktopAppInstaller -%ProductName% -1 -%AppFolder%\appinstaller.exe -1 -%CompanyName% -%CompanyURL% -%CompanyName% Support Department -%CompanyURL% -%ProductVer% - - - - - -%AppFolder% - - -1 -Uninstall -Removes %ProductName% from your computer. -1 -%AppFolder%\uninstall_icon.ico -0 -1 -%TempFolder%\%ProductName% Uninstall Log.txt -0 -0 -1 - - -100 -Welcome to Uninstall -1 -Welcome to Uninstall -0 - -0 -ffffff -ece9d8 -ece9d8 -000000 -000000 -ffffff -ece9d8 -ece9d8 -ffffff -aca899 -000000 -000000 -aca899 -316ac5 -716f64 -Developer_top.jpg -Developer_side.jpg -Developer_body.jpg -0 -0 -1 -0 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --24 -700 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - - -0 -15 -15 -15 -15 - - -1 -15 -15 -15 -15 - - -2 -15 -15 -15 -15 - -10 -10 -497 -362 - - - -On Preload - - - - - - -On Back - - - - - - -On Next - - - - - - -On Cancel - - - - - - -On Help - - - - - - -On Ctrl Message -number e_CtrlID, number e_MsgID, table e_Details - - - - - - - -1 -103 -0 -0 -75 -1 - - -1 -101 -1 -0 -76 -1 - - -1 -100 -1 -1 --10 -1 - - -1 -102 -1 -1 --9 -1 - - -2 -200 -1 -1 -1 -0 - - -2 -300 -1 -1 -0 -1 - - - - - -English -1 -9 - -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 - - - -%ProductName% Uninstaller -Welcome -Welcome to the uninstaller for %ProductName% %ProductVer% -&Next > -< &Back -&Cancel -&Help -This program will uninstall %ProductName% %ProductVer%. - -If %ProductName% is currently running, please close it before proceeding with the uninstallation. - -Otherwise, click Next to continue. - -Uninstall %ProductName% - - - - -Chinese (Simplified) -0 -4 - -2 -3 -4 -5 - - - -%ProductName% 卸载程序 -欢迎 -欢迎使用 %ProductName% %ProductVer% 卸载程序 -下一步(&N) > -< 返回(&B) -取消(&C) -帮助(&H) -该程序将卸载 %ProductName% %ProductVer%。 - -如果 %ProductName% 当前正在运行,继续卸载之前请将其关闭。 - -否则,请单击“下一步”继续。 - -卸载 %ProductName% - - - - - - -1 - - -130 -One Progress Bar (While Uninstalling) -2 -One Progress Bar (While Uninstalling) -0 - -0 -ffffff -ece9d8 -ece9d8 -000000 -000000 -ffffff -ece9d8 -ece9d8 -ffffff -aca899 -000000 -000000 -aca899 -316ac5 -716f64 -Developer_top.jpg -Developer_side.jpg -Developer_body.jpg -0 -0 -1 -0 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --24 -700 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - - -0 -15 -15 -15 -15 - - -1 -15 -15 -15 -15 - - -2 -15 -15 -15 -15 - -10 -10 -497 -362 - -1 - - -On Preload - - - - - - -On Progress -number e_Stage, string e_CurrentItemText, number e_CurrentItemPct, number e_StagePct - - - - - -On Cancel - - - - - - - - -1 -102 -1 -1 -78 -1 - - -2 -203 -1 -1 -1 -0 - - -2 -211 -1 -1 -2 -0 - - -2 -212 -1 -1 -3 -0 - - -7 -900 -1 -1 -4 - -0 -100 -1 - - -2 -213 -0 -1 -2 -0 - - -2 -214 -0 -1 -3 -0 - - -7 -901 -0 -1 -4 - -0 -100 -0 - - - - - -English -1 -9 - -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 - - - -%ProductName% Uninstaller -Removing %ProductName% -Please wait... -&Cancel - - - - -Progress Two -Performing Actions... - - - - - -Chinese (Simplified) -0 -4 - -2 -3 -4 -5 - - - -%ProductName% 卸载程序 -正在移除 %ProductName% -请稍候... -取消(&C) - - - - -进程二 -正在执行动作... - - - - - - - - - -100 -Finished Uninstall -1 -Finished Uninstall -0 - -0 -ffffff -ece9d8 -ece9d8 -000000 -000000 -ffffff -ece9d8 -ece9d8 -ffffff -aca899 -000000 -000000 -aca899 -316ac5 -716f64 -Developer_top.jpg -Developer_side.jpg -Developer_body.jpg -0 -0 -1 -0 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --13 -700 -0 -0 -0 -1 - - -Arial -0 --24 -700 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - -Arial -0 --13 -400 -0 -0 -0 -1 - - - -0 -15 -15 -15 -15 - - -1 -15 -15 -15 -15 - - -2 -15 -15 -15 -15 - -10 -10 -497 -362 - - - -On Preload - - - - - - -On Back - - - - - - -On Next - - - - - - -On Cancel - - - - - - -On Help - - - - - - -On Ctrl Message -number e_CtrlID, number e_MsgID, table e_Details - - - - - - - -1 -103 -0 -0 -75 -1 - - -1 -101 -1 -0 -76 -1 - - -1 -100 -1 -1 --10 -1 - - -1 -102 -1 -0 --9 -1 - - -2 -200 -1 -1 -0 -0 - - -2 -300 -1 -1 -1 -1 - - - - - -English -1 -9 - -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 - - - -%ProductName% Uninstaller -Uninstallation Finished -The uninstallation has completed successfully. -&Finish -< &Back -&Cancel -&Help -%ProductName% %ProductVer% has been uninstalled. - -Please click Finish to exit. - -Uninstallation Successful - - - - -Chinese (Simplified) -0 -4 - -2 -3 -4 -5 - - - -%ProductName% 卸载程序 -卸载已完成 -卸载已成功完成。 -完成(&F) -< 返回(&B) -取消(&C) -帮助(&H) -%ProductName% %ProductVer% 已被卸载。 - -请单击“完成”退出。 - -卸载成功 - - - - - - - -在启动时 - - - - - - -On Post Uninstall - - - - - - -
- - -1 -%TempFolder%\%ProductName% Setup Log.txt -0 -1 - -0 -0 -0 -1 -2 - -0 -0 -1 -008080 -b4c2e3 -5971b6 - -1 -%TempLaunchFolder%\main.ico -0 -0 -%ProductName% - - -Arial -0 --37 -700 -1 -0 -0 -1 - - -ffffff -000000 -0 -1 -v%ProductVer% - - -Arial -0 --18 -700 -1 -0 -0 -1 - - -ffffff -000000 -0 -1 -
%Copyright%. All rights reserved. %CompanyURL%
- - -Arial -0 --16 -400 -0 -0 -0 -1 - - -ffffff -000000 -0 -1 -
- -0 -0 -30 -30 -1 -1767105338 -0 -0 -1 -1 -2 -1 -0 -03F9811E-4657-4757-A24D-570C64F8ABB6 -0 -%CompanyName% -%CompanyURL% - - - - - -32768 -65535 -65535 -65535 -0 -0 -0 -0 -0 -0 -65535 -65535 -65535 -65535 -65535 -65535 - -0 -0 -0 -0 -1 -0 - - -Developer -New Project - - - -Copyright 2025 - - -9.5.3.0 -9.5.3.0 -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\shared - -0 - - - - - - -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\appinstaller\res\icons\main.ico -1 -0 - -All - - - - - -全局函数 - - - - - - -在安装后 - - - - - - -
- - -English -1 -9 - -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 - - - -Chinese (Simplified) -0 -4 - -2 -3 -4 -5 - - - - - -%ProductName% -Desktop App Installer -1 - - -%CompanyName% -Windows Modern -1 - - -%ProductVer% -0.1.0.0 -1 - - -%Copyright% -Copyright (C)2025 %CompanyName% -1 - - -%CompanyURL% - -1 - - -%WindowTitle% -%ProductName% Setup -1 - - -%WindowTitleUninstall% -%ProductName% Uninstaller -1 - - -%AppFolder% -%ProgramFilesFolder%\%ProductName% -2 - - -%AppShortcutFolderName% -%ProductName% -2 - - - - -Default - - -0 - - -0 -setup.exe -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Generated -0 -0 -0 -0 -0 -0 - -1 - - - - - -1 - - -0 - - - - - -1 -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\appinstaller\res\icons\main.ico -9.5.3.0 -9.5.3.0 -Indigo Rose Corporation -Setup Factory Runtime -Created with Setup Factory -sf_rt -Setup Application -Setup Engine Copyright ?1992-2019 Indigo Rose Corporation -Setup Factory is a trademark of Indigo Rose Corporation - - -0 - - - - - - -#SUFDIR#\Includes\Scripts\_SUF70_Global_Functions.lua -1 - -All - - - -
\ No newline at end of file diff --git a/others/Autosave/autosave_2025-11-30_22-49-47.suf b/others/Autosave/autosave_2025-12-03_08-16-44.suf similarity index 75% rename from others/Autosave/autosave_2025-11-30_22-49-47.suf rename to others/Autosave/autosave_2025-12-03_08-16-44.suf index cc29859..90d7796 100644 --- a/others/Autosave/autosave_2025-11-30_22-49-47.suf +++ b/others/Autosave/autosave_2025-12-03_08-16-44.suf @@ -923,7 +923,354 @@ On Preload + +-- ============================================ +-- 函数:DetectSystemLanguage +-- 描述:检测系统语言,返回 'zh' 或 'en' +-- ============================================ +function GetCurrentLanguage() + -- 调用官方API获取语言信息 + local langTbl = Application.GetInstallLanguage() + + -- 检查API是否调用成功 + if langTbl and langTbl.Primary then + local primaryLangId = langTbl.Primary + + -- 将语言ID转换为我们的语言标识 + -- 0x0409 (1033) = 英语(美国),0x0804 (2052) = 中文(简体) + if primaryLangId == 2052 then -- 中文(简体) + return "zh" + else -- 默认英语(包括1033及其他情况) + return "en" + end + end + + -- API调用失败或未知情况,默认返回英语 + return "en" +end + +-- ============================================ +-- 全局语言表 +-- 说明:所有需要本地化的字符串都定义在这里 +-- ============================================ +local LangStrings = { + zh = { + -- 帮助文本 + help_title = "安装程序命令行帮助", + help_body = [[ +MyApp 安装程序 - 命令行参数帮助 + +自动安装模式 (无界面或被动安装): + /S, /SILENT, /QUIET, /PASSIVE, /AUTO + -S, -SILENT, -QUIET, -PASSIVE, -AUTO + (也支持无前缀格式,如 SILENT) + +指定安装路径 (该功能在重新安装模式和升级模式不可用): + 1. 使用 /TO 参数 - 更改安装的根位置,但保留默认文件夹名称。 + 示例: /TO:"D:\" + 安装到: D:\MyApp\ (假设默认安装到 C:\Program Files\MyApp) + 示例: /TO "D:\MyCompany" + 安装到: D:\MyCompany\MyApp\ + + 2. 使用 /DIR 参数 - 指定完整的自定义安装路径。 + 示例: /DIR:"D:\MyApp Custom" + 安装到: D:\MyApp Custom\ + 示例: /dir "C:\Program Files\Another Name" + + 注意:路径若包含空格,请使用双引号包裹。 + +显示此帮助: + /?, /HELP, /H, -?, -HELP, -H, ?, HELP, H + +使用示例: + setup.exe /S /TO:"D:\" // 静默安装到D盘 + setup.exe /DIR:"C:\My App" /S // 静默安装到自定义目录 + setup.exe /TO D:\ /PASSIVE // 被动模式安装到D盘 +]], + + -- 对话框消息 + downgrade_title = "%ProductName% 安装程序", -- %ProductName% 会被自动替换 + downgrade_msg = "检测到已安装的版本 (%s) 比当前安装包版本 (%s) 更高。\n\n要继续进行降级安装吗?\n注意:这会覆盖现有版本。请确保已关闭原程序。", + + reinstall_title = "%ProductName% 安装程序", + reinstall_msg = "检测到当前计算机已安装与本安装包相同的版本 (%s),请问要继续安装吗?\n\n注意:重新安装时,会覆盖现有文件。请确保已关闭原程序。" + }, + + en = { + -- 帮助文本 + help_title = "Installer Command Line Help", + help_body = [[ +MyApp Installer - Command Line Help + +Automatic installation modes (unattended or passive): + /S, /SILENT, /QUIET, /PASSIVE, /AUTO + -S, -SILENT, -QUIET, -PASSIVE, -AUTO + (Prefixless formats like SILENT are also supported) + +Specify installation path (Not available in Reinstall and Upgrade modes): + 1. Use /TO parameter - Change the root location but keep the default folder name. + Example: /TO:"D:\" + Installs to: D:\MyApp\ (assuming default is C:\Program Files\MyApp) + Example: /TO "D:\MyCompany" + Installs to: D:\MyCompany\MyApp\ + + 2. Use /DIR parameter - Specify a complete custom installation path. + Example: /DIR:"D:\MyApp Custom" + Installs to: D:\MyApp Custom\ + Example: /dir "C:\Program Files\Another Name" + + Note: If the path contains spaces, please enclose it in double quotes. + +Show this help: + /?, /HELP, /H, -?, -HELP, -H, ?, HELP, H + +Usage Examples: + setup.exe /S /TO:"D:\" // Silent install to D drive + setup.exe /DIR:"C:\My App" /S // Silent install to custom directory + setup.exe /TO D:\ /PASSIVE // Passive mode install to D drive +]], + + -- 对话框消息 + downgrade_title = "%ProductName% Setup", + downgrade_msg = "A higher version (%s) is already installed compared to the current installer version (%s).\n\nDo you want to proceed with downgrade installation?\nNote: This will overwrite the existing version. Please ensure the original program is closed.", + + reinstall_title = "%ProductName% Setup", + reinstall_msg = "The same version (%s) is already installed on this computer. Do you want to continue with reinstallation?\n\nNote: Reinstallation will overwrite existing files. Please ensure the original program is closed." + } +} + +-- ============================================ +-- 函数:GetLocalizedString +-- 描述:获取当前语言的本地化字符串 +-- 参数:key - 字符串键名(如 "downgrade_msg") +-- 返回:本地化后的字符串 +-- ============================================ +function GetLocalizedString(key) + local lang = DetectSystemLanguage() + local str = LangStrings[lang][key] or LangStrings["en"][key] or "" + -- 替换可能的动态变量 + str = SessionVar.Expand(str); + return str +end + +function CompareVersion(verstrl, verstrr) + return String.CompareFileVersions (verstrl, verstrr); +end + +-- ============================================ +-- 函数:ParseSetupArgs +-- 描述:解析增强的安装程序命令行参数(兼容基础函数版本) +-- 返回: +-- isAutoMode (boolean): 是否为自动/静默模式 +-- customInstallPath (string or nil): 自定义的安装路径 +-- showHelp (boolean): 是否显示帮助信息 +-- pathParamUsed (string or nil): 使用的路径参数类型(“/TO”或“/DIR”) +-- ============================================ +function ParseSetupArgs() + local args = _CommandLineArgs or {} + local isAutoMode = false + local customInstallPath = nil + local showHelp = false + local pathParamUsed = nil + + -- 定义参数字典,提高检查效率 + local flagMap = {} + -- 自动模式参数 + local autoList = {"/S", "/SILENT", "/PASSIVE", "/QUIET", "/AUTO", "-S", "-SILENT", "-PASSIVE", "-QUIET", "-AUTO", "S", "SILENT", "PASSIVE", "QUIET", "AUTO"} + for _, flag in ipairs(autoList) do + flagMap[String.Upper(flag)] = "AUTO" + end + -- 帮助参数 + local helpList = {"/?", "/HELP", "/H", "-?", "-HELP", "-H", "?", "HELP", "H"} + for _, flag in ipairs(helpList) do + flagMap[String.Upper(flag)] = "HELP" + end + + -- 内部函数:从“参数:值”格式中提取值 + local function extractValueFromColonArg(fullArg) + local colonPos = String.Find(fullArg, ":", 1, true) + if colonPos > 0 then + -- 使用完整的 String.Mid 参数:字符串, 起始位置, 长度 + local totalLen = String.Length(fullArg) + local valueLen = totalLen - colonPos -- 计算要提取的长度 + local value = String.Mid(fullArg, colonPos + 1, valueLen) + -- 去除可能包裹的引号 + value = String.TrimRight(value, "\"") + value = String.TrimRight(value, "'") + return value + end + return "" + end + + -- 内部函数:处理 /TO 参数逻辑 + local function processToParam(rawPathValue) + -- 使用固定的默认文件夹名 + -- 重要:将 "MyApp" 改为你的程序默认文件夹名 + local defaultFolderName = SessionVar.Expand ("%ProductName%"); + if rawPathValue ~= "" and defaultFolderName ~= "" then + -- 确保 rawPathValue 以反斜杠结尾 + if String.Right(rawPathValue, 1) ~= "\\" then + rawPathValue = rawPathValue .. "\\" + end + return rawPathValue .. defaultFolderName + end + return rawPathValue + end + + -- 内部函数:检查字符串是否以指定前缀开头(不区分大小写) + local function startsWith(str, prefix) + return String.Left(String.Upper(str), String.Length(prefix)) == String.Upper(prefix) + end + + local i = 1 + while i <= #args do + local arg = args[i] + local argUpper = String.Upper(arg) + local argType = flagMap[argUpper] + + -- 1. 检查已知的独立参数(自动模式、帮助) + if argType == "AUTO" then + isAutoMode = true + elseif argType == "HELP" then + showHelp = true + -- 2. 检查“参数:值”格式的路径参数 + elseif startsWith(arg, "/TO:") or startsWith(arg, "-TO:") then + pathParamUsed = "/TO" + local rawPath = extractValueFromColonArg(arg) + if rawPath ~= "" then + customInstallPath = processToParam(rawPath) + end + elseif startsWith(arg, "/DIR:") or startsWith(arg, "-DIR:") then + pathParamUsed = "/DIR" + local rawPath = extractValueFromColonArg(arg) + if rawPath ~= "" then + customInstallPath = rawPath + end + -- 3. 检查“参数 值”格式的路径参数(空格分隔) + elseif argUpper == "/TO" or argUpper == "-TO" then + pathParamUsed = "/TO" + if i + 1 <= #args then + local nextArg = args[i + 1] + -- 确保下一个参数不是另一个开关参数 + local nextFirstChar = String.Left(nextArg, 1) + if nextFirstChar ~= "/" and nextFirstChar ~= "-" then + local rawPath = String.TrimRight(nextArg, "\"") + rawPath = String.TrimRight(rawPath, "'") + customInstallPath = processToParam(rawPath) + i = i + 1 -- 消耗下一个参数 + end + end + elseif argUpper == "/DIR" or argUpper == "-DIR" then + pathParamUsed = "/DIR" + if i + 1 <= #args then + local nextArg = args[i + 1] + local nextFirstChar = String.Left(nextArg, 1) + if nextFirstChar ~= "/" and nextFirstChar ~= "-" then + customInstallPath = String.TrimRight(nextArg, "\"") + customInstallPath = String.TrimRight(customInstallPath, "'") + i = i + 1 + end + end + end + -- 如果参数未匹配任何已知模式,它将被忽略 + i = i + 1 + end + + return isAutoMode, customInstallPath, showHelp, pathParamUsed +end + +-- ============================================ +-- 函数:ShowHelpAndExit +-- 描述:显示参数帮助信息并退出安装程序 +-- ============================================ +function ShowHelpAndExit() + -- 在消息框中显示帮助(如果是交互模式) + Dialog.Message(GetLocalizedString("help_title"), GetLocalizedString("help_body"), MB_OK, MB_ICONINFORMATION) + -- 退出安装程序 + Application.Exit() +end + + +-- 解析命令行参数 +local autoMode, installPath, needHelp = ParseSetupArgs() +if needHelp then + ShowHelpAndExit() +end +-- 存储结果供后续使用 +SessionVar.Set("%AutoInstallMode%", tostring(autoMode)) + +mode = 0; -- 0: Normal, 1: Reinstall, 2: Upgrade +keyexist = Registry.DoesKeyExist(HKEY_CURRENT_USER, "SOFTWARE\\Windows Modern\\App Installer"); + +if (keyexist) then + local ver = Registry.GetValue(HKEY_CURRENT_USER, "SOFTWARE\\Windows Modern\\App Installer", "Version", false); + local currentVer = SessionVar.Expand("%ProductVer%"); + local ishigh = CompareVersion(ver, currentVer); + + if (ishigh > 0) then + -- 降级安装 + if (autoMode == false) then + local msgpress = Dialog.Message( + GetLocalizedString("downgrade_title"), + string.format(GetLocalizedString("downgrade_msg"), ver, currentVer), + MB_YESNO, MB_ICONQUESTION + ); + if (msgpress == IDYES) then mode = 1; -- 重新安装(降级) + else Application.Exit(); + end + else mode = 1; + end + elseif (ishigh == 0) then + -- 重新安装(版本相同) + if (autoMode == false) then + local msgpress1 = Dialog.Message( + GetLocalizedString("reinstall_title"), + string.format(GetLocalizedString("reinstall_msg"), ver), + MB_YESNO, MB_ICONQUESTION + ); + if (msgpress1 == IDYES) then + mode = 1; -- 重新安装 + else + Application.Exit(); + end + else mode = 1; + end + -- 注意:这里没有 mode = 0 了! + else + -- 升级安装 + mode = 2; -- 升级 + end +else + mode = 0; -- 全新安装 +end + +g_mode = mode; + +if (installPath and mode == 0) then + SessionVar.Set("%AppFolder%", installPath); +end + +g_lastver = Registry.GetValue(HKEY_CURRENT_USER, "SOFTWARE\\Windows Modern\\App Installer", "Version", false); +g_lastpath = Registry.GetValue(HKEY_CURRENT_USER, "SOFTWARE\\Windows Modern\\App Installer", "AppPath", false); +g_lastuni = Registry.GetValue(HKEY_CURRENT_USER, "SOFTWARE\\Windows Modern\\App Installer", "Uninstall", false); + +SessionVar.Set ("%InstallMode%", tostring (g_mode)); +SessionVar.Set ("%LastVersion%", g_lastver); +SessionVar.Set ("%LastPath%", g_lastpath); +SessionVar.Set ("%LastUninstall%", g_lastuni); + +if (g_mode == 1 or g_mode == 2) then + strInstallFolderPath = SessionVar.Expand ("%LastPath%"); + SessionVar.Set ("%AppFolder%", strInstallFolderPath); +end + +if (autoMode == true) then + Screen.Jump ("Ready to Install"); +end + +if (mode == 2 and autoMode == false) then + Screen.Jump ("Welcome to Update Setup"); +end @@ -931,7 +1278,6 @@ On Back @@ -944,8 +1290,8 @@ Screen.Back(); +-- Screen.Next(); +Screen.Jump ("License Agreement") @@ -1097,6 +1443,299 @@ Otherwise, click Next to continue. 如果您有任何其他程序正在运行,请单击“取消”,关闭程序,然后再次运行该安装程序。 +否则,请单击“下一步”继续。 + +欢迎 + + + + + +100 +Welcome to Update Setup +1 +Welcome to Setup +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +77 +1 + + +1 +102 +1 +1 +78 +1 + + +2 +200 +1 +1 +1 +0 + + +2 +300 +1 +1 +0 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Update +Welcome +Welcome to the installer for %ProductName% %ProductVer% +&Next > +< &Back +&Cancel +&Help +Welcome to the %ProductName% %ProductVer% upgrade program. + +It is strongly recommended that you exit all programs related to %ProductName% before continuing this installation. + +If you have any other programs running, please click "Cancel" to close the program, and then run the installer again. + +Otherwise, please click "Next" to continue. +Welcome + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 升级程序 +欢迎 +欢迎使用 %ProductName% %ProductVer% 安装程序 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +欢迎使用 %ProductName% %ProductVer% 升级程序。 + +强烈建议您在继续该安装之前,退出 %ProductName% 相关的所有程序。 + +如果您有任何其他程序正在运行,请单击“取消”,关闭程序,然后再次运行该安装程序。 + 否则,请单击“下一步”继续。 欢迎 @@ -1426,10 +2065,10 @@ end -120 -User Information +105 +Scrolling Text 2 -User Information +Scrolling Text 0 0 @@ -1533,9 +2172,6 @@ end 497 362 -2 -0 -1 On Preload @@ -1561,34 +2197,17 @@ Screen.Back(); +end @@ -1629,7 +2248,7 @@ end 103 0 0 -98 +75 1 @@ -1637,7 +2256,7 @@ end 101 1 1 -99 +76 1 @@ -1657,1108 +2276,20 @@ end 1 -2 -203 +3 +400 1 1 0 -0 - - -2 -204 -1 -1 -97 -0 - - -2 -211 -1 -1 -1 -0 - - -6 -821 -1 -1 -2 +0 0 -0 +1 0 0 - -0 -1 -0 -1 -4 -%UserName% - - -1 -121 -0 -1 -3 -0 - - -2 -212 -1 -1 -4 -0 - - -6 -822 -1 -1 -5 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%UserCompany% - - -1 -122 -0 -1 -6 -0 - - -2 -213 -0 -0 -7 -0 - - -6 -823 -0 -0 -8 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar03% - - -1 -123 -0 -1 -9 -0 - - -2 -214 -0 -0 -10 -0 - - -6 -824 -0 -0 -11 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar04% - - -1 -124 -0 -1 -12 -0 - - -2 -215 -0 -0 -13 -0 - - -6 -825 -0 -0 -14 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar05% - - -1 -125 -0 -1 -15 -0 - - -2 -216 -0 -0 -16 -0 - - -6 -826 -0 -0 -17 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar06% - - -1 -126 -0 -1 -18 -0 - - -2 -217 -0 -0 -19 -0 - - -6 -827 -0 -0 -20 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar07% - - -1 -127 -0 -1 -21 -0 - - -2 -218 -0 -0 -22 -0 - - -6 -828 -0 -0 -23 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar08% - - -1 -128 -0 -1 -24 -0 - - -2 -219 -0 -0 -25 -0 - - -6 -829 -0 -0 -26 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar09% - - -1 -129 -0 -1 -27 -0 - - -2 -220 -0 -0 -28 -0 - - -6 -830 -0 -0 -29 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar10% - - -1 -130 -0 -1 -30 -0 - - -2 -221 -0 -0 -31 -0 - - -6 -831 -0 -0 -32 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar11% - - -1 -131 -0 -1 -33 -0 - - -2 -222 -0 -0 -34 -0 - - -6 -832 -0 -0 -35 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar12% - - -1 -132 -0 -1 -36 -0 - - -2 -223 -0 -0 -37 -0 - - -6 -833 -0 -0 -38 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar13% - - -1 -133 -0 -1 -39 -0 - - -2 -224 -0 -0 -40 -0 - - -6 -834 -0 -0 -41 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar14% - - -1 -134 -0 -1 -42 -0 - - -2 -225 -0 -0 -43 -0 - - -6 -835 -0 -0 -44 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar15% - - -1 -135 -0 -1 -45 -0 - - -2 -226 -0 -0 -46 -0 - - -6 -836 -0 -0 -47 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar16% - - -1 -136 -0 -1 -48 -0 - - -2 -227 -0 -0 -49 -0 - - -6 -837 -0 -0 -50 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar17% - - -1 -137 -0 -1 -51 -0 - - -2 -228 -0 -0 -52 -0 - - -6 -838 -0 -0 -53 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar18% - - -1 -138 -0 -1 -54 -0 - - -2 -229 -0 -0 -55 -0 - - -6 -839 -0 -0 -56 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar19% - - -1 -139 -0 -1 -57 -0 - - -2 -230 -0 -0 -58 -0 - - -6 -840 -0 -0 -59 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar20% - - -1 -140 -0 -1 -60 -0 - - -2 -231 -0 -0 -61 -0 - - -6 -841 -0 -0 -62 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar21% - - -1 -141 -0 -1 -63 -0 - - -2 -232 -0 -0 -64 -0 - - -6 -842 -0 -0 -65 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar22% - - -1 -142 -0 -1 -66 -0 - - -2 -233 -0 -0 -67 -0 - - -6 -843 -0 -0 -68 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar23% - - -1 -143 -0 -1 -69 -0 - - -2 -234 -0 -0 -70 -0 - - -6 -844 -0 -0 -71 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar24% - - -1 -144 -0 -1 -72 -0 - - -2 -235 -0 -0 -73 -0 - - -6 -845 -0 -0 -74 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar25% - - -1 -145 -0 -1 -75 -0 - - -2 -236 -0 -0 -76 -0 - - -6 -846 -0 -0 -77 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar26% - - -1 -146 -0 -1 -78 -0 - - -2 -237 -0 -0 -79 -0 - - -6 -847 -0 -0 -80 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar27% - - -1 -147 -0 -1 -81 -0 - - -2 -238 -0 -0 -82 -0 - - -6 -848 -0 -0 -83 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar28% - - -1 -148 -0 -1 -84 -0 - - -2 -239 -0 -0 -85 -0 - - -6 -849 -0 -0 -86 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar29% - - -1 -149 -0 -1 -87 -0 - - -2 -240 -0 -0 -88 -0 - - -6 -850 -0 -0 -89 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar30% - - -1 -150 -0 -1 -90 -0 - - -2 -241 -0 -0 -91 -0 - - -6 -851 -0 -0 -92 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar31% - - -1 -151 -0 -1 -93 -0 - - -2 -242 -0 -0 -94 -0 - - -6 -852 -0 -0 -95 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar32% - - -1 -152 -0 -1 -96 -0 + +1 +1 + @@ -2785,24 +2316,14 @@ end %ProductName% Setup -User Information -Enter your user information and click Next to continue. +Important Information +Please read the following information. &Next > < &Back &Cancel &Help - - -Name: -%RegOwner% -... -#### - -Company: -%RegOrganization% -... -#### - +This is currently in test mode, and this release is solely for testing the program's update features. While this version is available, the official release is still recommended. + @@ -2819,24 +2340,14 @@ end %ProductName% 安装程序 -用户信息 -请输入您的用户信息,并单击“下一步”继续。 +重要信息 +请阅读以下信息。 下一步(&N) > < 返回(&B) 取消(&C) 帮助(&H) - - -名称: -%RegOwner% -... -#### - -公司: -%RegOrganization% -... -#### - +当前是测试模式,发行此版本仅用于此程序的更新功能测试。虽然此版本可用,但仍建议使用正式版本。 + @@ -3412,7 +2923,10 @@ end -- from _SUF70_Global_Functions.lua: -- fill the combo box with the existing shortcut folder names g_FillComboBoxWithShortcutFolders(CTRL_COMBOBOX_SHORTCUTFOLDERS); - + +if (g_mode == 1 or g_mode == 2) then + Screen.Next (); +end @@ -3586,8 +3100,8 @@ end 5 600 -1 -1 +0 +0 35 1 600 @@ -3596,8 +3110,8 @@ end 5 601 -1 -1 +0 +0 40 0 600 @@ -3783,7 +3297,11 @@ end On Preload +automodestr = SessionVar.Expand("%AutoInstallMode%"); +automodestr = String.TrimLeft (String.TrimRight (String.Lower (automodestr))); +automode = automodestr == "true"; + +if (automode) then Screen.Next (); end @@ -3793,8 +3311,8 @@ end + +Screen.Back(); @@ -3804,8 +3322,7 @@ Screen.Back(); +Screen.Next(); @@ -4088,7 +3605,51 @@ Please click Next to proceed with the installation. On Preload +--[[if (mode == 1 or mode == 2) then + local unlnk = Registry.GetValue(HKEY_CURRENT_USER, "SOFTWARE\\Windows Modern\\App Installer", "Uninstall", false); + resulttest = Shell.Execute(unlnk, "open", "/S: /U:Uninstall/uninstall.xml", SessionVar.Expand ("%LastPath%"), SW_SHOWNORMAL, true); + -- Dialog.Message ("Test", "已试图执行卸载,返回:" .. tostring (resulttest)); +end +]] +if (mode == 1 or mode == 2) then + -- 1. 获取卸载路径,并清理可能的引号 + local unlnk = Registry.GetValue(HKEY_CURRENT_USER, "SOFTWARE\\Windows Modern\\App Installer", "Uninstall", true); + unlnk = String.TrimRight(unlnk, "\"") -- 移除路径两端的引号 + + -- 2. 关键:检查卸载程序文件是否存在 + local targetExePath = unlnk + if targetExePath ~= "" then + -- 2.1 检查是否为.lnk快捷方式,并尝试解析真实目标 + if String.Lower(String.Right(targetExePath, 4)) == ".lnk" and _File.DoesExist(targetExePath) then + -- 尝试获取.lnk文件指向的真实目标 + local shell = DLL.Load("shell32.dll") + local result, realPath = DLL.CallFunction(shell, "ShellExecuteA", "0,\"open\"," .. targetExePath .. ",\"\",\"\",0", DLL_RETURN_TYPE_STRING, DLL_CALL_STDCALL) + if realPath and realPath ~= "" and _File.DoesExist(realPath) then + targetExePath = realPath + end + DLL.Unload(shell) + end + + -- 2.2 最终检查:目标可执行文件是否存在 + if File.DoesExist(targetExePath) then + -- 3. 构建静默卸载参数 + -- 注意:原代码中的 "/U:Uninstall/uninstall.xml" 路径分隔符建议统一为反斜杠 + local uninstallArgs = "/S: /U:Uninstall\\uninstall.xml" + local workingDir = SessionVar.Expand("%LastPath%") + + -- 4. 执行静默卸载(关键:使用 SW_HIDE 隐藏窗口,true 表示等待完成) + -- 使用 File.Run 替代 Shell.Execute 以获得更好的控制 + resulttest = File.Run(targetExePath, uninstallArgs, workingDir, SW_HIDE, true) + + -- (可选)日志记录,仅用于调试 + -- _LogFile.Message("静默卸载已执行,结果码: " .. tostring(resulttest), LOG_INFO) + else + -- 文件不存在,安静地跳过并记录(非静默模式可考虑提示) + -- _LogFile.Message("卸载程序文件不存在,跳过卸载: " .. targetExePath, LOG_WARNING) + end + end + -- 如果 unlnk 为空,则安静地跳过卸载 +end @@ -4298,6 +3859,280 @@ end +155 +Scrolling Text Progress +2 +Scrolling Text Progress +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +0 + + +On Preload + + + + + + +On Start + + + + + + +On Finish + + + + + + +On Cancel + + + + + + + + +1 +102 +1 +0 +-10 +1 + + +2 +203 +1 +1 +1 +0 + + +2 +204 +1 +1 +3 +0 + + +3 +400 +1 +1 +2 +0 +0 +1 +0 +0 + +1 +1 + + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Performing Actions +Please wait... +&Cancel +Please wait while the following actions are performed: + + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +正在执行动作 +请稍候... +取消(&C) +请稍候,正在执行以下动作: + + + + + + + 100 Finished Install 1 @@ -4410,7 +4245,11 @@ end On Preload +automodestr = SessionVar.Expand("%AutoInstallMode%"); +automodestr = String.TrimLeft (String.TrimRight (String.Lower (automodestr))); +automode = automodestr == "true"; + +if (automode) then Application.Exit (); end @@ -4690,8 +4529,8 @@ Please click Finish to exit this installer. %AppFolder% - - +0 +1 1 Uninstall Removes %ProductName% from your computer. @@ -5613,7 +5452,11 @@ Please click Finish to exit. On Pre Uninstall - @@ -5657,7 +5500,7 @@ g_HandleSystemReboot(); 0 0 0 -0 +1 2 0 @@ -5797,20 +5640,207 @@ g_HandleSystemReboot(); All - -E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\others\Wwalczyszyn-Android-Style-Trash-empty.ico -1 -0 - -All - - 全局函数 - @@ -5839,7 +5869,10 @@ g_HandleSystemReboot(); 在安装后 - @@ -5947,7 +5980,7 @@ g_HandleSystemReboot(); 0 -setup.exe +InstallerSetup.exe E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Generated 0 0 diff --git a/others/Autosave/autosave_2025-11-30_22-50-06.suf b/others/Autosave/autosave_2025-12-03_08-17-45.suf similarity index 75% rename from others/Autosave/autosave_2025-11-30_22-50-06.suf rename to others/Autosave/autosave_2025-12-03_08-17-45.suf index b0a8605..0665443 100644 --- a/others/Autosave/autosave_2025-11-30_22-50-06.suf +++ b/others/Autosave/autosave_2025-12-03_08-17-45.suf @@ -923,7 +923,354 @@ On Preload + +-- ============================================ +-- 函数:DetectSystemLanguage +-- 描述:检测系统语言,返回 'zh' 或 'en' +-- ============================================ +function DetectSystemLanguage() + -- 调用官方API获取语言信息 + local langTbl = Application.GetInstallLanguage() + + -- 检查API是否调用成功 + if langTbl and langTbl.Primary then + local primaryLangId = langTbl.Primary + + -- 将语言ID转换为我们的语言标识 + -- 0x0409 (1033) = 英语(美国),0x0804 (2052) = 中文(简体) + if primaryLangId == 2052 then -- 中文(简体) + return "zh" + else -- 默认英语(包括1033及其他情况) + return "en" + end + end + + -- API调用失败或未知情况,默认返回英语 + return "en" +end + +-- ============================================ +-- 全局语言表 +-- 说明:所有需要本地化的字符串都定义在这里 +-- ============================================ +local LangStrings = { + zh = { + -- 帮助文本 + help_title = "安装程序命令行帮助", + help_body = [[ +MyApp 安装程序 - 命令行参数帮助 + +自动安装模式 (无界面或被动安装): + /S, /SILENT, /QUIET, /PASSIVE, /AUTO + -S, -SILENT, -QUIET, -PASSIVE, -AUTO + (也支持无前缀格式,如 SILENT) + +指定安装路径 (该功能在重新安装模式和升级模式不可用): + 1. 使用 /TO 参数 - 更改安装的根位置,但保留默认文件夹名称。 + 示例: /TO:"D:\" + 安装到: D:\MyApp\ (假设默认安装到 C:\Program Files\MyApp) + 示例: /TO "D:\MyCompany" + 安装到: D:\MyCompany\MyApp\ + + 2. 使用 /DIR 参数 - 指定完整的自定义安装路径。 + 示例: /DIR:"D:\MyApp Custom" + 安装到: D:\MyApp Custom\ + 示例: /dir "C:\Program Files\Another Name" + + 注意:路径若包含空格,请使用双引号包裹。 + +显示此帮助: + /?, /HELP, /H, -?, -HELP, -H, ?, HELP, H + +使用示例: + setup.exe /S /TO:"D:\" // 静默安装到D盘 + setup.exe /DIR:"C:\My App" /S // 静默安装到自定义目录 + setup.exe /TO D:\ /PASSIVE // 被动模式安装到D盘 +]], + + -- 对话框消息 + downgrade_title = "%ProductName% 安装程序", -- %ProductName% 会被自动替换 + downgrade_msg = "检测到已安装的版本 (%s) 比当前安装包版本 (%s) 更高。\n\n要继续进行降级安装吗?\n注意:这会覆盖现有版本。请确保已关闭原程序。", + + reinstall_title = "%ProductName% 安装程序", + reinstall_msg = "检测到当前计算机已安装与本安装包相同的版本 (%s),请问要继续安装吗?\n\n注意:重新安装时,会覆盖现有文件。请确保已关闭原程序。" + }, + + en = { + -- 帮助文本 + help_title = "Installer Command Line Help", + help_body = [[ +MyApp Installer - Command Line Help + +Automatic installation modes (unattended or passive): + /S, /SILENT, /QUIET, /PASSIVE, /AUTO + -S, -SILENT, -QUIET, -PASSIVE, -AUTO + (Prefixless formats like SILENT are also supported) + +Specify installation path (Not available in Reinstall and Upgrade modes): + 1. Use /TO parameter - Change the root location but keep the default folder name. + Example: /TO:"D:\" + Installs to: D:\MyApp\ (assuming default is C:\Program Files\MyApp) + Example: /TO "D:\MyCompany" + Installs to: D:\MyCompany\MyApp\ + + 2. Use /DIR parameter - Specify a complete custom installation path. + Example: /DIR:"D:\MyApp Custom" + Installs to: D:\MyApp Custom\ + Example: /dir "C:\Program Files\Another Name" + + Note: If the path contains spaces, please enclose it in double quotes. + +Show this help: + /?, /HELP, /H, -?, -HELP, -H, ?, HELP, H + +Usage Examples: + setup.exe /S /TO:"D:\" // Silent install to D drive + setup.exe /DIR:"C:\My App" /S // Silent install to custom directory + setup.exe /TO D:\ /PASSIVE // Passive mode install to D drive +]], + + -- 对话框消息 + downgrade_title = "%ProductName% Setup", + downgrade_msg = "A higher version (%s) is already installed compared to the current installer version (%s).\n\nDo you want to proceed with downgrade installation?\nNote: This will overwrite the existing version. Please ensure the original program is closed.", + + reinstall_title = "%ProductName% Setup", + reinstall_msg = "The same version (%s) is already installed on this computer. Do you want to continue with reinstallation?\n\nNote: Reinstallation will overwrite existing files. Please ensure the original program is closed." + } +} + +-- ============================================ +-- 函数:GetLocalizedString +-- 描述:获取当前语言的本地化字符串 +-- 参数:key - 字符串键名(如 "downgrade_msg") +-- 返回:本地化后的字符串 +-- ============================================ +function GetLocalizedString(key) + local lang = DetectSystemLanguage() + local str = LangStrings[lang][key] or LangStrings["en"][key] or "" + -- 替换可能的动态变量 + str = SessionVar.Expand(str); + return str +end + +function CompareVersion(verstrl, verstrr) + return String.CompareFileVersions (verstrl, verstrr); +end + +-- ============================================ +-- 函数:ParseSetupArgs +-- 描述:解析增强的安装程序命令行参数(兼容基础函数版本) +-- 返回: +-- isAutoMode (boolean): 是否为自动/静默模式 +-- customInstallPath (string or nil): 自定义的安装路径 +-- showHelp (boolean): 是否显示帮助信息 +-- pathParamUsed (string or nil): 使用的路径参数类型(“/TO”或“/DIR”) +-- ============================================ +function ParseSetupArgs() + local args = _CommandLineArgs or {} + local isAutoMode = false + local customInstallPath = nil + local showHelp = false + local pathParamUsed = nil + + -- 定义参数字典,提高检查效率 + local flagMap = {} + -- 自动模式参数 + local autoList = {"/S", "/SILENT", "/PASSIVE", "/QUIET", "/AUTO", "-S", "-SILENT", "-PASSIVE", "-QUIET", "-AUTO", "S", "SILENT", "PASSIVE", "QUIET", "AUTO"} + for _, flag in ipairs(autoList) do + flagMap[String.Upper(flag)] = "AUTO" + end + -- 帮助参数 + local helpList = {"/?", "/HELP", "/H", "-?", "-HELP", "-H", "?", "HELP", "H"} + for _, flag in ipairs(helpList) do + flagMap[String.Upper(flag)] = "HELP" + end + + -- 内部函数:从“参数:值”格式中提取值 + local function extractValueFromColonArg(fullArg) + local colonPos = String.Find(fullArg, ":", 1, true) + if colonPos > 0 then + -- 使用完整的 String.Mid 参数:字符串, 起始位置, 长度 + local totalLen = String.Length(fullArg) + local valueLen = totalLen - colonPos -- 计算要提取的长度 + local value = String.Mid(fullArg, colonPos + 1, valueLen) + -- 去除可能包裹的引号 + value = String.TrimRight(value, "\"") + value = String.TrimRight(value, "'") + return value + end + return "" + end + + -- 内部函数:处理 /TO 参数逻辑 + local function processToParam(rawPathValue) + -- 使用固定的默认文件夹名 + -- 重要:将 "MyApp" 改为你的程序默认文件夹名 + local defaultFolderName = SessionVar.Expand ("%ProductName%"); + if rawPathValue ~= "" and defaultFolderName ~= "" then + -- 确保 rawPathValue 以反斜杠结尾 + if String.Right(rawPathValue, 1) ~= "\\" then + rawPathValue = rawPathValue .. "\\" + end + return rawPathValue .. defaultFolderName + end + return rawPathValue + end + + -- 内部函数:检查字符串是否以指定前缀开头(不区分大小写) + local function startsWith(str, prefix) + return String.Left(String.Upper(str), String.Length(prefix)) == String.Upper(prefix) + end + + local i = 1 + while i <= #args do + local arg = args[i] + local argUpper = String.Upper(arg) + local argType = flagMap[argUpper] + + -- 1. 检查已知的独立参数(自动模式、帮助) + if argType == "AUTO" then + isAutoMode = true + elseif argType == "HELP" then + showHelp = true + -- 2. 检查“参数:值”格式的路径参数 + elseif startsWith(arg, "/TO:") or startsWith(arg, "-TO:") then + pathParamUsed = "/TO" + local rawPath = extractValueFromColonArg(arg) + if rawPath ~= "" then + customInstallPath = processToParam(rawPath) + end + elseif startsWith(arg, "/DIR:") or startsWith(arg, "-DIR:") then + pathParamUsed = "/DIR" + local rawPath = extractValueFromColonArg(arg) + if rawPath ~= "" then + customInstallPath = rawPath + end + -- 3. 检查“参数 值”格式的路径参数(空格分隔) + elseif argUpper == "/TO" or argUpper == "-TO" then + pathParamUsed = "/TO" + if i + 1 <= #args then + local nextArg = args[i + 1] + -- 确保下一个参数不是另一个开关参数 + local nextFirstChar = String.Left(nextArg, 1) + if nextFirstChar ~= "/" and nextFirstChar ~= "-" then + local rawPath = String.TrimRight(nextArg, "\"") + rawPath = String.TrimRight(rawPath, "'") + customInstallPath = processToParam(rawPath) + i = i + 1 -- 消耗下一个参数 + end + end + elseif argUpper == "/DIR" or argUpper == "-DIR" then + pathParamUsed = "/DIR" + if i + 1 <= #args then + local nextArg = args[i + 1] + local nextFirstChar = String.Left(nextArg, 1) + if nextFirstChar ~= "/" and nextFirstChar ~= "-" then + customInstallPath = String.TrimRight(nextArg, "\"") + customInstallPath = String.TrimRight(customInstallPath, "'") + i = i + 1 + end + end + end + -- 如果参数未匹配任何已知模式,它将被忽略 + i = i + 1 + end + + return isAutoMode, customInstallPath, showHelp, pathParamUsed +end + +-- ============================================ +-- 函数:ShowHelpAndExit +-- 描述:显示参数帮助信息并退出安装程序 +-- ============================================ +function ShowHelpAndExit() + -- 在消息框中显示帮助(如果是交互模式) + Dialog.Message(GetLocalizedString("help_title"), GetLocalizedString("help_body"), MB_OK, MB_ICONINFORMATION) + -- 退出安装程序 + Application.Exit() +end + + +-- 解析命令行参数 +local autoMode, installPath, needHelp = ParseSetupArgs() +if needHelp then + ShowHelpAndExit() +end +-- 存储结果供后续使用 +SessionVar.Set("%AutoInstallMode%", tostring(autoMode)) + +mode = 0; -- 0: Normal, 1: Reinstall, 2: Upgrade +keyexist = Registry.DoesKeyExist(HKEY_CURRENT_USER, "SOFTWARE\\Windows Modern\\App Installer"); + +if (keyexist) then + local ver = Registry.GetValue(HKEY_CURRENT_USER, "SOFTWARE\\Windows Modern\\App Installer", "Version", false); + local currentVer = SessionVar.Expand("%ProductVer%"); + local ishigh = CompareVersion(ver, currentVer); + + if (ishigh > 0) then + -- 降级安装 + if (autoMode == false) then + local msgpress = Dialog.Message( + GetLocalizedString("downgrade_title"), + string.format(GetLocalizedString("downgrade_msg"), ver, currentVer), + MB_YESNO, MB_ICONQUESTION + ); + if (msgpress == IDYES) then mode = 1; -- 重新安装(降级) + else Application.Exit(); + end + else mode = 1; + end + elseif (ishigh == 0) then + -- 重新安装(版本相同) + if (autoMode == false) then + local msgpress1 = Dialog.Message( + GetLocalizedString("reinstall_title"), + string.format(GetLocalizedString("reinstall_msg"), ver), + MB_YESNO, MB_ICONQUESTION + ); + if (msgpress1 == IDYES) then + mode = 1; -- 重新安装 + else + Application.Exit(); + end + else mode = 1; + end + -- 注意:这里没有 mode = 0 了! + else + -- 升级安装 + mode = 2; -- 升级 + end +else + mode = 0; -- 全新安装 +end + +g_mode = mode; + +if (installPath and mode == 0) then + SessionVar.Set("%AppFolder%", installPath); +end + +g_lastver = Registry.GetValue(HKEY_CURRENT_USER, "SOFTWARE\\Windows Modern\\App Installer", "Version", false); +g_lastpath = Registry.GetValue(HKEY_CURRENT_USER, "SOFTWARE\\Windows Modern\\App Installer", "AppPath", false); +g_lastuni = Registry.GetValue(HKEY_CURRENT_USER, "SOFTWARE\\Windows Modern\\App Installer", "Uninstall", false); + +SessionVar.Set ("%InstallMode%", tostring (g_mode)); +SessionVar.Set ("%LastVersion%", g_lastver); +SessionVar.Set ("%LastPath%", g_lastpath); +SessionVar.Set ("%LastUninstall%", g_lastuni); + +if (g_mode == 1 or g_mode == 2) then + strInstallFolderPath = SessionVar.Expand ("%LastPath%"); + SessionVar.Set ("%AppFolder%", strInstallFolderPath); +end + +if (autoMode == true) then + Screen.Jump ("Ready to Install"); +end + +if (mode == 2 and autoMode == false) then + Screen.Jump ("Welcome to Update Setup"); +end @@ -931,7 +1278,6 @@ On Back @@ -944,8 +1290,8 @@ Screen.Back(); +-- Screen.Next(); +Screen.Jump ("License Agreement") @@ -1097,6 +1443,299 @@ Otherwise, click Next to continue. 如果您有任何其他程序正在运行,请单击“取消”,关闭程序,然后再次运行该安装程序。 +否则,请单击“下一步”继续。 + +欢迎 + + + + + +100 +Welcome to Update Setup +1 +Welcome to Setup +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +77 +1 + + +1 +102 +1 +1 +78 +1 + + +2 +200 +1 +1 +1 +0 + + +2 +300 +1 +1 +0 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Update +Welcome +Welcome to the installer for %ProductName% %ProductVer% +&Next > +< &Back +&Cancel +&Help +Welcome to the %ProductName% %ProductVer% upgrade program. + +It is strongly recommended that you exit all programs related to %ProductName% before continuing this installation. + +If you have any other programs running, please click "Cancel" to close the program, and then run the installer again. + +Otherwise, please click "Next" to continue. +Welcome + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 升级程序 +欢迎 +欢迎使用 %ProductName% %ProductVer% 安装程序 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +欢迎使用 %ProductName% %ProductVer% 升级程序。 + +强烈建议您在继续该安装之前,退出 %ProductName% 相关的所有程序。 + +如果您有任何其他程序正在运行,请单击“取消”,关闭程序,然后再次运行该安装程序。 + 否则,请单击“下一步”继续。 欢迎 @@ -1426,10 +2065,10 @@ end -120 -User Information +105 +Scrolling Text 2 -User Information +Scrolling Text 0 0 @@ -1533,9 +2172,6 @@ end 497 362 -2 -0 -1 On Preload @@ -1561,34 +2197,17 @@ Screen.Back(); +end @@ -1629,7 +2248,7 @@ end 103 0 0 -98 +75 1 @@ -1637,7 +2256,7 @@ end 101 1 1 -99 +76 1 @@ -1657,1108 +2276,20 @@ end 1 -2 -203 +3 +400 1 1 0 -0 - - -2 -204 -1 -1 -97 -0 - - -2 -211 -1 -1 -1 -0 - - -6 -821 -1 -1 -2 +0 0 -0 +1 0 0 - -0 -1 -0 -1 -4 -%UserName% - - -1 -121 -0 -1 -3 -0 - - -2 -212 -1 -1 -4 -0 - - -6 -822 -1 -1 -5 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%UserCompany% - - -1 -122 -0 -1 -6 -0 - - -2 -213 -0 -0 -7 -0 - - -6 -823 -0 -0 -8 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar03% - - -1 -123 -0 -1 -9 -0 - - -2 -214 -0 -0 -10 -0 - - -6 -824 -0 -0 -11 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar04% - - -1 -124 -0 -1 -12 -0 - - -2 -215 -0 -0 -13 -0 - - -6 -825 -0 -0 -14 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar05% - - -1 -125 -0 -1 -15 -0 - - -2 -216 -0 -0 -16 -0 - - -6 -826 -0 -0 -17 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar06% - - -1 -126 -0 -1 -18 -0 - - -2 -217 -0 -0 -19 -0 - - -6 -827 -0 -0 -20 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar07% - - -1 -127 -0 -1 -21 -0 - - -2 -218 -0 -0 -22 -0 - - -6 -828 -0 -0 -23 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar08% - - -1 -128 -0 -1 -24 -0 - - -2 -219 -0 -0 -25 -0 - - -6 -829 -0 -0 -26 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar09% - - -1 -129 -0 -1 -27 -0 - - -2 -220 -0 -0 -28 -0 - - -6 -830 -0 -0 -29 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar10% - - -1 -130 -0 -1 -30 -0 - - -2 -221 -0 -0 -31 -0 - - -6 -831 -0 -0 -32 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar11% - - -1 -131 -0 -1 -33 -0 - - -2 -222 -0 -0 -34 -0 - - -6 -832 -0 -0 -35 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar12% - - -1 -132 -0 -1 -36 -0 - - -2 -223 -0 -0 -37 -0 - - -6 -833 -0 -0 -38 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar13% - - -1 -133 -0 -1 -39 -0 - - -2 -224 -0 -0 -40 -0 - - -6 -834 -0 -0 -41 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar14% - - -1 -134 -0 -1 -42 -0 - - -2 -225 -0 -0 -43 -0 - - -6 -835 -0 -0 -44 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar15% - - -1 -135 -0 -1 -45 -0 - - -2 -226 -0 -0 -46 -0 - - -6 -836 -0 -0 -47 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar16% - - -1 -136 -0 -1 -48 -0 - - -2 -227 -0 -0 -49 -0 - - -6 -837 -0 -0 -50 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar17% - - -1 -137 -0 -1 -51 -0 - - -2 -228 -0 -0 -52 -0 - - -6 -838 -0 -0 -53 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar18% - - -1 -138 -0 -1 -54 -0 - - -2 -229 -0 -0 -55 -0 - - -6 -839 -0 -0 -56 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar19% - - -1 -139 -0 -1 -57 -0 - - -2 -230 -0 -0 -58 -0 - - -6 -840 -0 -0 -59 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar20% - - -1 -140 -0 -1 -60 -0 - - -2 -231 -0 -0 -61 -0 - - -6 -841 -0 -0 -62 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar21% - - -1 -141 -0 -1 -63 -0 - - -2 -232 -0 -0 -64 -0 - - -6 -842 -0 -0 -65 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar22% - - -1 -142 -0 -1 -66 -0 - - -2 -233 -0 -0 -67 -0 - - -6 -843 -0 -0 -68 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar23% - - -1 -143 -0 -1 -69 -0 - - -2 -234 -0 -0 -70 -0 - - -6 -844 -0 -0 -71 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar24% - - -1 -144 -0 -1 -72 -0 - - -2 -235 -0 -0 -73 -0 - - -6 -845 -0 -0 -74 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar25% - - -1 -145 -0 -1 -75 -0 - - -2 -236 -0 -0 -76 -0 - - -6 -846 -0 -0 -77 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar26% - - -1 -146 -0 -1 -78 -0 - - -2 -237 -0 -0 -79 -0 - - -6 -847 -0 -0 -80 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar27% - - -1 -147 -0 -1 -81 -0 - - -2 -238 -0 -0 -82 -0 - - -6 -848 -0 -0 -83 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar28% - - -1 -148 -0 -1 -84 -0 - - -2 -239 -0 -0 -85 -0 - - -6 -849 -0 -0 -86 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar29% - - -1 -149 -0 -1 -87 -0 - - -2 -240 -0 -0 -88 -0 - - -6 -850 -0 -0 -89 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar30% - - -1 -150 -0 -1 -90 -0 - - -2 -241 -0 -0 -91 -0 - - -6 -851 -0 -0 -92 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar31% - - -1 -151 -0 -1 -93 -0 - - -2 -242 -0 -0 -94 -0 - - -6 -852 -0 -0 -95 -0 -0 -0 -0 - -0 -1 -0 -1 -4 -%EditVar32% - - -1 -152 -0 -1 -96 -0 + +1 +1 + @@ -2785,24 +2316,14 @@ end %ProductName% Setup -User Information -Enter your user information and click Next to continue. +Important Information +Please read the following information. &Next > < &Back &Cancel &Help - - -Name: -%RegOwner% -... -#### - -Company: -%RegOrganization% -... -#### - +This is currently in test mode, and this release is solely for testing the program's update features. While this version is available, the official release is still recommended. + @@ -2819,24 +2340,14 @@ end %ProductName% 安装程序 -用户信息 -请输入您的用户信息,并单击“下一步”继续。 +重要信息 +请阅读以下信息。 下一步(&N) > < 返回(&B) 取消(&C) 帮助(&H) - - -名称: -%RegOwner% -... -#### - -公司: -%RegOrganization% -... -#### - +当前是测试模式,发行此版本仅用于此程序的更新功能测试。虽然此版本可用,但仍建议使用正式版本。 + @@ -3412,7 +2923,10 @@ end -- from _SUF70_Global_Functions.lua: -- fill the combo box with the existing shortcut folder names g_FillComboBoxWithShortcutFolders(CTRL_COMBOBOX_SHORTCUTFOLDERS); - + +if (g_mode == 1 or g_mode == 2) then + Screen.Next (); +end @@ -3586,8 +3100,8 @@ end 5 600 -1 -1 +0 +0 35 1 600 @@ -3596,8 +3110,8 @@ end 5 601 -1 -1 +0 +0 40 0 600 @@ -3783,7 +3297,11 @@ end On Preload +automodestr = SessionVar.Expand("%AutoInstallMode%"); +automodestr = String.TrimLeft (String.TrimRight (String.Lower (automodestr))); +automode = automodestr == "true"; + +if (automode) then Screen.Next (); end @@ -3793,8 +3311,8 @@ end + +Screen.Back(); @@ -3804,8 +3322,7 @@ Screen.Back(); +Screen.Next(); @@ -4088,7 +3605,51 @@ Please click Next to proceed with the installation. On Preload +--[[if (mode == 1 or mode == 2) then + local unlnk = Registry.GetValue(HKEY_CURRENT_USER, "SOFTWARE\\Windows Modern\\App Installer", "Uninstall", false); + resulttest = Shell.Execute(unlnk, "open", "/S: /U:Uninstall/uninstall.xml", SessionVar.Expand ("%LastPath%"), SW_SHOWNORMAL, true); + -- Dialog.Message ("Test", "已试图执行卸载,返回:" .. tostring (resulttest)); +end +]] +if (mode == 1 or mode == 2) then + -- 1. 获取卸载路径,并清理可能的引号 + local unlnk = Registry.GetValue(HKEY_CURRENT_USER, "SOFTWARE\\Windows Modern\\App Installer", "Uninstall", true); + unlnk = String.TrimRight(unlnk, "\"") -- 移除路径两端的引号 + + -- 2. 关键:检查卸载程序文件是否存在 + local targetExePath = unlnk + if targetExePath ~= "" then + -- 2.1 检查是否为.lnk快捷方式,并尝试解析真实目标 + if String.Lower(String.Right(targetExePath, 4)) == ".lnk" and _File.DoesExist(targetExePath) then + -- 尝试获取.lnk文件指向的真实目标 + local shell = DLL.Load("shell32.dll") + local result, realPath = DLL.CallFunction(shell, "ShellExecuteA", "0,\"open\"," .. targetExePath .. ",\"\",\"\",0", DLL_RETURN_TYPE_STRING, DLL_CALL_STDCALL) + if realPath and realPath ~= "" and _File.DoesExist(realPath) then + targetExePath = realPath + end + DLL.Unload(shell) + end + + -- 2.2 最终检查:目标可执行文件是否存在 + if File.DoesExist(targetExePath) then + -- 3. 构建静默卸载参数 + -- 注意:原代码中的 "/U:Uninstall/uninstall.xml" 路径分隔符建议统一为反斜杠 + local uninstallArgs = "/S: /U:Uninstall\\uninstall.xml" + local workingDir = SessionVar.Expand("%LastPath%") + + -- 4. 执行静默卸载(关键:使用 SW_HIDE 隐藏窗口,true 表示等待完成) + -- 使用 File.Run 替代 Shell.Execute 以获得更好的控制 + resulttest = File.Run(targetExePath, uninstallArgs, workingDir, SW_HIDE, true) + + -- (可选)日志记录,仅用于调试 + -- _LogFile.Message("静默卸载已执行,结果码: " .. tostring(resulttest), LOG_INFO) + else + -- 文件不存在,安静地跳过并记录(非静默模式可考虑提示) + -- _LogFile.Message("卸载程序文件不存在,跳过卸载: " .. targetExePath, LOG_WARNING) + end + end + -- 如果 unlnk 为空,则安静地跳过卸载 +end @@ -4298,6 +3859,280 @@ end +155 +Scrolling Text Progress +2 +Scrolling Text Progress +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +0 + + +On Preload + + + + + + +On Start + + + + + + +On Finish + + + + + + +On Cancel + + + + + + + + +1 +102 +1 +0 +-10 +1 + + +2 +203 +1 +1 +1 +0 + + +2 +204 +1 +1 +3 +0 + + +3 +400 +1 +1 +2 +0 +0 +1 +0 +0 + +1 +1 + + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Performing Actions +Please wait... +&Cancel +Please wait while the following actions are performed: + + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +正在执行动作 +请稍候... +取消(&C) +请稍候,正在执行以下动作: + + + + + + + 100 Finished Install 1 @@ -4410,7 +4245,11 @@ end On Preload +automodestr = SessionVar.Expand("%AutoInstallMode%"); +automodestr = String.TrimLeft (String.TrimRight (String.Lower (automodestr))); +automode = automodestr == "true"; + +if (automode) then Application.Exit (); end @@ -4690,8 +4529,8 @@ Please click Finish to exit this installer. %AppFolder% - - +0 +1 1 Uninstall Removes %ProductName% from your computer. @@ -5613,7 +5452,11 @@ Please click Finish to exit. On Pre Uninstall - @@ -5657,7 +5500,7 @@ g_HandleSystemReboot(); 0 0 0 -0 +1 2 0 @@ -5802,7 +5645,202 @@ g_HandleSystemReboot(); 全局函数 - @@ -5831,7 +5869,10 @@ g_HandleSystemReboot(); 在安装后 - @@ -5939,7 +5980,7 @@ g_HandleSystemReboot(); 0 -setup.exe +InstallerSetup.exe E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Generated 0 0 diff --git a/others/Autosave/autosave_2025-11-30_23-02-18.suf b/others/Autosave/autosave_2025-12-03_08-29-32.suf similarity index 75% rename from others/Autosave/autosave_2025-11-30_23-02-18.suf rename to others/Autosave/autosave_2025-12-03_08-29-32.suf index ab0cd7e..e18e8f2 100644 --- a/others/Autosave/autosave_2025-11-30_23-02-18.suf +++ b/others/Autosave/autosave_2025-12-03_08-29-32.suf @@ -923,7 +923,354 @@ On Preload + +-- ============================================ +-- 函数:DetectSystemLanguage +-- 描述:检测系统语言,返回 'zh' 或 'en' +-- ============================================ +function DetectSystemLanguage() + -- 调用官方API获取语言信息 + local langTbl = Application.GetInstallLanguage() + Dialog.Message ("Language Test", tostring (langTbl.Primary) .. " " .. tostring (langTbl.Secondary)); + -- 检查API是否调用成功 + if langTbl and langTbl.Primary then + local primaryLangId = langTbl.Primary + + -- 将语言ID转换为我们的语言标识 + -- 0x0409 (1033) = 英语(美国),0x0804 (2052) = 中文(简体) + if primaryLangId == 2052 then -- 中文(简体) + return "zh" + else -- 默认英语(包括1033及其他情况) + return "en" + end + end + + -- API调用失败或未知情况,默认返回英语 + return "en" +end + +-- ============================================ +-- 全局语言表 +-- 说明:所有需要本地化的字符串都定义在这里 +-- ============================================ +local LangStrings = { + zh = { + -- 帮助文本 + help_title = "安装程序命令行帮助", + help_body = [[ +MyApp 安装程序 - 命令行参数帮助 + +自动安装模式 (无界面或被动安装): + /S, /SILENT, /QUIET, /PASSIVE, /AUTO + -S, -SILENT, -QUIET, -PASSIVE, -AUTO + (也支持无前缀格式,如 SILENT) + +指定安装路径 (该功能在重新安装模式和升级模式不可用): + 1. 使用 /TO 参数 - 更改安装的根位置,但保留默认文件夹名称。 + 示例: /TO:"D:\" + 安装到: D:\MyApp\ (假设默认安装到 C:\Program Files\MyApp) + 示例: /TO "D:\MyCompany" + 安装到: D:\MyCompany\MyApp\ + + 2. 使用 /DIR 参数 - 指定完整的自定义安装路径。 + 示例: /DIR:"D:\MyApp Custom" + 安装到: D:\MyApp Custom\ + 示例: /dir "C:\Program Files\Another Name" + + 注意:路径若包含空格,请使用双引号包裹。 + +显示此帮助: + /?, /HELP, /H, -?, -HELP, -H, ?, HELP, H + +使用示例: + setup.exe /S /TO:"D:\" // 静默安装到D盘 + setup.exe /DIR:"C:\My App" /S // 静默安装到自定义目录 + setup.exe /TO D:\ /PASSIVE // 被动模式安装到D盘 +]], + + -- 对话框消息 + downgrade_title = "%ProductName% 安装程序", -- %ProductName% 会被自动替换 + downgrade_msg = "检测到已安装的版本 (%s) 比当前安装包版本 (%s) 更高。\n\n要继续进行降级安装吗?\n注意:这会覆盖现有版本。请确保已关闭原程序。", + + reinstall_title = "%ProductName% 安装程序", + reinstall_msg = "检测到当前计算机已安装与本安装包相同的版本 (%s),请问要继续安装吗?\n\n注意:重新安装时,会覆盖现有文件。请确保已关闭原程序。" + }, + + en = { + -- 帮助文本 + help_title = "Installer Command Line Help", + help_body = [[ +MyApp Installer - Command Line Help + +Automatic installation modes (unattended or passive): + /S, /SILENT, /QUIET, /PASSIVE, /AUTO + -S, -SILENT, -QUIET, -PASSIVE, -AUTO + (Prefixless formats like SILENT are also supported) + +Specify installation path (Not available in Reinstall and Upgrade modes): + 1. Use /TO parameter - Change the root location but keep the default folder name. + Example: /TO:"D:\" + Installs to: D:\MyApp\ (assuming default is C:\Program Files\MyApp) + Example: /TO "D:\MyCompany" + Installs to: D:\MyCompany\MyApp\ + + 2. Use /DIR parameter - Specify a complete custom installation path. + Example: /DIR:"D:\MyApp Custom" + Installs to: D:\MyApp Custom\ + Example: /dir "C:\Program Files\Another Name" + + Note: If the path contains spaces, please enclose it in double quotes. + +Show this help: + /?, /HELP, /H, -?, -HELP, -H, ?, HELP, H + +Usage Examples: + setup.exe /S /TO:"D:\" // Silent install to D drive + setup.exe /DIR:"C:\My App" /S // Silent install to custom directory + setup.exe /TO D:\ /PASSIVE // Passive mode install to D drive +]], + + -- 对话框消息 + downgrade_title = "%ProductName% Setup", + downgrade_msg = "A higher version (%s) is already installed compared to the current installer version (%s).\n\nDo you want to proceed with downgrade installation?\nNote: This will overwrite the existing version. Please ensure the original program is closed.", + + reinstall_title = "%ProductName% Setup", + reinstall_msg = "The same version (%s) is already installed on this computer. Do you want to continue with reinstallation?\n\nNote: Reinstallation will overwrite existing files. Please ensure the original program is closed." + } +} + +-- ============================================ +-- 函数:GetLocalizedString +-- 描述:获取当前语言的本地化字符串 +-- 参数:key - 字符串键名(如 "downgrade_msg") +-- 返回:本地化后的字符串 +-- ============================================ +function GetLocalizedString(key) + local lang = DetectSystemLanguage() + local str = LangStrings[lang][key] or LangStrings["en"][key] or "" + -- 替换可能的动态变量 + str = SessionVar.Expand(str); + return str +end + +function CompareVersion(verstrl, verstrr) + return String.CompareFileVersions (verstrl, verstrr); +end + +-- ============================================ +-- 函数:ParseSetupArgs +-- 描述:解析增强的安装程序命令行参数(兼容基础函数版本) +-- 返回: +-- isAutoMode (boolean): 是否为自动/静默模式 +-- customInstallPath (string or nil): 自定义的安装路径 +-- showHelp (boolean): 是否显示帮助信息 +-- pathParamUsed (string or nil): 使用的路径参数类型(“/TO”或“/DIR”) +-- ============================================ +function ParseSetupArgs() + local args = _CommandLineArgs or {} + local isAutoMode = false + local customInstallPath = nil + local showHelp = false + local pathParamUsed = nil + + -- 定义参数字典,提高检查效率 + local flagMap = {} + -- 自动模式参数 + local autoList = {"/S", "/SILENT", "/PASSIVE", "/QUIET", "/AUTO", "-S", "-SILENT", "-PASSIVE", "-QUIET", "-AUTO", "S", "SILENT", "PASSIVE", "QUIET", "AUTO"} + for _, flag in ipairs(autoList) do + flagMap[String.Upper(flag)] = "AUTO" + end + -- 帮助参数 + local helpList = {"/?", "/HELP", "/H", "-?", "-HELP", "-H", "?", "HELP", "H"} + for _, flag in ipairs(helpList) do + flagMap[String.Upper(flag)] = "HELP" + end + + -- 内部函数:从“参数:值”格式中提取值 + local function extractValueFromColonArg(fullArg) + local colonPos = String.Find(fullArg, ":", 1, true) + if colonPos > 0 then + -- 使用完整的 String.Mid 参数:字符串, 起始位置, 长度 + local totalLen = String.Length(fullArg) + local valueLen = totalLen - colonPos -- 计算要提取的长度 + local value = String.Mid(fullArg, colonPos + 1, valueLen) + -- 去除可能包裹的引号 + value = String.TrimRight(value, "\"") + value = String.TrimRight(value, "'") + return value + end + return "" + end + + -- 内部函数:处理 /TO 参数逻辑 + local function processToParam(rawPathValue) + -- 使用固定的默认文件夹名 + -- 重要:将 "MyApp" 改为你的程序默认文件夹名 + local defaultFolderName = SessionVar.Expand ("%ProductName%"); + if rawPathValue ~= "" and defaultFolderName ~= "" then + -- 确保 rawPathValue 以反斜杠结尾 + if String.Right(rawPathValue, 1) ~= "\\" then + rawPathValue = rawPathValue .. "\\" + end + return rawPathValue .. defaultFolderName + end + return rawPathValue + end + + -- 内部函数:检查字符串是否以指定前缀开头(不区分大小写) + local function startsWith(str, prefix) + return String.Left(String.Upper(str), String.Length(prefix)) == String.Upper(prefix) + end + + local i = 1 + while i <= #args do + local arg = args[i] + local argUpper = String.Upper(arg) + local argType = flagMap[argUpper] + + -- 1. 检查已知的独立参数(自动模式、帮助) + if argType == "AUTO" then + isAutoMode = true + elseif argType == "HELP" then + showHelp = true + -- 2. 检查“参数:值”格式的路径参数 + elseif startsWith(arg, "/TO:") or startsWith(arg, "-TO:") then + pathParamUsed = "/TO" + local rawPath = extractValueFromColonArg(arg) + if rawPath ~= "" then + customInstallPath = processToParam(rawPath) + end + elseif startsWith(arg, "/DIR:") or startsWith(arg, "-DIR:") then + pathParamUsed = "/DIR" + local rawPath = extractValueFromColonArg(arg) + if rawPath ~= "" then + customInstallPath = rawPath + end + -- 3. 检查“参数 值”格式的路径参数(空格分隔) + elseif argUpper == "/TO" or argUpper == "-TO" then + pathParamUsed = "/TO" + if i + 1 <= #args then + local nextArg = args[i + 1] + -- 确保下一个参数不是另一个开关参数 + local nextFirstChar = String.Left(nextArg, 1) + if nextFirstChar ~= "/" and nextFirstChar ~= "-" then + local rawPath = String.TrimRight(nextArg, "\"") + rawPath = String.TrimRight(rawPath, "'") + customInstallPath = processToParam(rawPath) + i = i + 1 -- 消耗下一个参数 + end + end + elseif argUpper == "/DIR" or argUpper == "-DIR" then + pathParamUsed = "/DIR" + if i + 1 <= #args then + local nextArg = args[i + 1] + local nextFirstChar = String.Left(nextArg, 1) + if nextFirstChar ~= "/" and nextFirstChar ~= "-" then + customInstallPath = String.TrimRight(nextArg, "\"") + customInstallPath = String.TrimRight(customInstallPath, "'") + i = i + 1 + end + end + end + -- 如果参数未匹配任何已知模式,它将被忽略 + i = i + 1 + end + + return isAutoMode, customInstallPath, showHelp, pathParamUsed +end + +-- ============================================ +-- 函数:ShowHelpAndExit +-- 描述:显示参数帮助信息并退出安装程序 +-- ============================================ +function ShowHelpAndExit() + -- 在消息框中显示帮助(如果是交互模式) + Dialog.Message(GetLocalizedString("help_title"), GetLocalizedString("help_body"), MB_OK, MB_ICONINFORMATION) + -- 退出安装程序 + Application.Exit() +end + + +-- 解析命令行参数 +local autoMode, installPath, needHelp = ParseSetupArgs() +if needHelp then + ShowHelpAndExit() +end +-- 存储结果供后续使用 +SessionVar.Set("%AutoInstallMode%", tostring(autoMode)) + +mode = 0; -- 0: Normal, 1: Reinstall, 2: Upgrade +keyexist = Registry.DoesKeyExist(HKEY_CURRENT_USER, "SOFTWARE\\Windows Modern\\App Installer"); + +if (keyexist) then + local ver = Registry.GetValue(HKEY_CURRENT_USER, "SOFTWARE\\Windows Modern\\App Installer", "Version", false); + local currentVer = SessionVar.Expand("%ProductVer%"); + local ishigh = CompareVersion(ver, currentVer); + + if (ishigh > 0) then + -- 降级安装 + if (autoMode == false) then + local msgpress = Dialog.Message( + GetLocalizedString("downgrade_title"), + string.format(GetLocalizedString("downgrade_msg"), ver, currentVer), + MB_YESNO, MB_ICONQUESTION + ); + if (msgpress == IDYES) then mode = 1; -- 重新安装(降级) + else Application.Exit(); + end + else mode = 1; + end + elseif (ishigh == 0) then + -- 重新安装(版本相同) + if (autoMode == false) then + local msgpress1 = Dialog.Message( + GetLocalizedString("reinstall_title"), + string.format(GetLocalizedString("reinstall_msg"), ver), + MB_YESNO, MB_ICONQUESTION + ); + if (msgpress1 == IDYES) then + mode = 1; -- 重新安装 + else + Application.Exit(); + end + else mode = 1; + end + -- 注意:这里没有 mode = 0 了! + else + -- 升级安装 + mode = 2; -- 升级 + end +else + mode = 0; -- 全新安装 +end + +g_mode = mode; + +if (installPath and mode == 0) then + SessionVar.Set("%AppFolder%", installPath); +end + +g_lastver = Registry.GetValue(HKEY_CURRENT_USER, "SOFTWARE\\Windows Modern\\App Installer", "Version", false); +g_lastpath = Registry.GetValue(HKEY_CURRENT_USER, "SOFTWARE\\Windows Modern\\App Installer", "AppPath", false); +g_lastuni = Registry.GetValue(HKEY_CURRENT_USER, "SOFTWARE\\Windows Modern\\App Installer", "Uninstall", false); + +SessionVar.Set ("%InstallMode%", tostring (g_mode)); +SessionVar.Set ("%LastVersion%", g_lastver); +SessionVar.Set ("%LastPath%", g_lastpath); +SessionVar.Set ("%LastUninstall%", g_lastuni); + +if (g_mode == 1 or g_mode == 2) then + strInstallFolderPath = SessionVar.Expand ("%LastPath%"); + SessionVar.Set ("%AppFolder%", strInstallFolderPath); +end + +if (autoMode == true) then + Screen.Jump ("Ready to Install"); +end + +if (mode == 2 and autoMode == false) then + Screen.Jump ("Welcome to Update Setup"); +end @@ -931,7 +1278,6 @@ On Back @@ -944,8 +1290,8 @@ Screen.Back(); +-- Screen.Next(); +Screen.Jump ("License Agreement") @@ -1097,6 +1443,299 @@ Otherwise, click Next to continue. 如果您有任何其他程序正在运行,请单击“取消”,关闭程序,然后再次运行该安装程序。 +否则,请单击“下一步”继续。 + +欢迎 + + + + + +100 +Welcome to Update Setup +1 +Welcome to Setup +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +77 +1 + + +1 +102 +1 +1 +78 +1 + + +2 +200 +1 +1 +1 +0 + + +2 +300 +1 +1 +0 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Update +Welcome +Welcome to the installer for %ProductName% %ProductVer% +&Next > +< &Back +&Cancel +&Help +Welcome to the %ProductName% %ProductVer% upgrade program. + +It is strongly recommended that you exit all programs related to %ProductName% before continuing this installation. + +If you have any other programs running, please click "Cancel" to close the program, and then run the installer again. + +Otherwise, please click "Next" to continue. +Welcome + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 升级程序 +欢迎 +欢迎使用 %ProductName% %ProductVer% 安装程序 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +欢迎使用 %ProductName% %ProductVer% 升级程序。 + +强烈建议您在继续该安装之前,退出 %ProductName% 相关的所有程序。 + +如果您有任何其他程序正在运行,请单击“取消”,关闭程序,然后再次运行该安装程序。 + 否则,请单击“下一步”继续。 欢迎 @@ -1559,8 +2198,16 @@ Screen.Back(); + + +g_mode = tonumber (SessionVar.Get ("%InstallMode%")); +if (g_mode == 1 or g_mode == 2) then + strInstallFolderPath = SessionVar.Expand ("%LastPath%"); + SessionVar.Set ("%AppFolder%", strInstallFolderPath); + Screen.Jump ("Ready to Install"); +else + Screen.Next(); +end @@ -2276,7 +2923,10 @@ end -- from _SUF70_Global_Functions.lua: -- fill the combo box with the existing shortcut folder names g_FillComboBoxWithShortcutFolders(CTRL_COMBOBOX_SHORTCUTFOLDERS); - + +if (g_mode == 1 or g_mode == 2) then + Screen.Next (); +end @@ -2450,8 +3100,8 @@ end 5 600 -1 -1 +0 +0 35 1 600 @@ -2460,8 +3110,8 @@ end 5 601 -1 -1 +0 +0 40 0 600 @@ -2647,7 +3297,11 @@ end On Preload +automodestr = SessionVar.Expand("%AutoInstallMode%"); +automodestr = String.TrimLeft (String.TrimRight (String.Lower (automodestr))); +automode = automodestr == "true"; + +if (automode) then Screen.Next (); end @@ -2657,8 +3311,8 @@ end + +Screen.Back(); @@ -2668,8 +3322,7 @@ Screen.Back(); +Screen.Next(); @@ -2952,7 +3605,51 @@ Please click Next to proceed with the installation. On Preload +--[[if (mode == 1 or mode == 2) then + local unlnk = Registry.GetValue(HKEY_CURRENT_USER, "SOFTWARE\\Windows Modern\\App Installer", "Uninstall", false); + resulttest = Shell.Execute(unlnk, "open", "/S: /U:Uninstall/uninstall.xml", SessionVar.Expand ("%LastPath%"), SW_SHOWNORMAL, true); + -- Dialog.Message ("Test", "已试图执行卸载,返回:" .. tostring (resulttest)); +end +]] +if (mode == 1 or mode == 2) then + -- 1. 获取卸载路径,并清理可能的引号 + local unlnk = Registry.GetValue(HKEY_CURRENT_USER, "SOFTWARE\\Windows Modern\\App Installer", "Uninstall", true); + unlnk = String.TrimRight(unlnk, "\"") -- 移除路径两端的引号 + + -- 2. 关键:检查卸载程序文件是否存在 + local targetExePath = unlnk + if targetExePath ~= "" then + -- 2.1 检查是否为.lnk快捷方式,并尝试解析真实目标 + if String.Lower(String.Right(targetExePath, 4)) == ".lnk" and _File.DoesExist(targetExePath) then + -- 尝试获取.lnk文件指向的真实目标 + local shell = DLL.Load("shell32.dll") + local result, realPath = DLL.CallFunction(shell, "ShellExecuteA", "0,\"open\"," .. targetExePath .. ",\"\",\"\",0", DLL_RETURN_TYPE_STRING, DLL_CALL_STDCALL) + if realPath and realPath ~= "" and _File.DoesExist(realPath) then + targetExePath = realPath + end + DLL.Unload(shell) + end + + -- 2.2 最终检查:目标可执行文件是否存在 + if File.DoesExist(targetExePath) then + -- 3. 构建静默卸载参数 + -- 注意:原代码中的 "/U:Uninstall/uninstall.xml" 路径分隔符建议统一为反斜杠 + local uninstallArgs = "/S: /U:Uninstall\\uninstall.xml" + local workingDir = SessionVar.Expand("%LastPath%") + + -- 4. 执行静默卸载(关键:使用 SW_HIDE 隐藏窗口,true 表示等待完成) + -- 使用 File.Run 替代 Shell.Execute 以获得更好的控制 + resulttest = File.Run(targetExePath, uninstallArgs, workingDir, SW_HIDE, true) + + -- (可选)日志记录,仅用于调试 + -- _LogFile.Message("静默卸载已执行,结果码: " .. tostring(resulttest), LOG_INFO) + else + -- 文件不存在,安静地跳过并记录(非静默模式可考虑提示) + -- _LogFile.Message("卸载程序文件不存在,跳过卸载: " .. targetExePath, LOG_WARNING) + end + end + -- 如果 unlnk 为空,则安静地跳过卸载 +end @@ -3162,6 +3859,280 @@ end +155 +Scrolling Text Progress +2 +Scrolling Text Progress +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +0 + + +On Preload + + + + + + +On Start + + + + + + +On Finish + + + + + + +On Cancel + + + + + + + + +1 +102 +1 +0 +-10 +1 + + +2 +203 +1 +1 +1 +0 + + +2 +204 +1 +1 +3 +0 + + +3 +400 +1 +1 +2 +0 +0 +1 +0 +0 + +1 +1 + + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Performing Actions +Please wait... +&Cancel +Please wait while the following actions are performed: + + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +正在执行动作 +请稍候... +取消(&C) +请稍候,正在执行以下动作: + + + + + + + 100 Finished Install 1 @@ -3274,7 +4245,11 @@ end On Preload +automodestr = SessionVar.Expand("%AutoInstallMode%"); +automodestr = String.TrimLeft (String.TrimRight (String.Lower (automodestr))); +automode = automodestr == "true"; + +if (automode) then Application.Exit (); end @@ -3554,8 +4529,8 @@ Please click Finish to exit this installer. %AppFolder% - - +0 +1 1 Uninstall Removes %ProductName% from your computer. @@ -4477,7 +5452,11 @@ Please click Finish to exit. On Pre Uninstall - @@ -4666,7 +5645,202 @@ g_HandleSystemReboot(); 全局函数 - @@ -4695,7 +5869,10 @@ g_HandleSystemReboot(); 在安装后 - @@ -4803,7 +5980,7 @@ g_HandleSystemReboot(); 0 -setup.exe +InstallerSetup.exe E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Generated 0 0 diff --git a/others/Autosave/autosave_2025-12-03_08-51-59.suf b/others/Autosave/autosave_2025-12-03_08-51-59.suf new file mode 100644 index 0000000..6ba54e9 --- /dev/null +++ b/others/Autosave/autosave_2025-12-03_08-51-59.suf @@ -0,0 +1,6084 @@ + + +{AFB904C4-C255-4540-B97E-A75A34F1FFB0} +9.5.3.0 + + + +1 + +*.* +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\shared +* +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +1 + +1 +1 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\appinstaller.exe +appinstaller.exe +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +exe +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +1 +0 +0 +0 +0 +0 + +App Installer + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\certmgr.dll +certmgr.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\notice.dll +notice.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\pkgmgr.dll +pkgmgr.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\pkgread.dll +pkgread.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\PriFileFormat.dll +PriFileFormat.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\priformatcli.dll +priformatcli.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\reslib.dll +reslib.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\settings.exe +settings.exe +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +exe +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +1 +0 +0 +0 +0 +0 + +Settings + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\others\uninstall_icon.ico +uninstall_icon.ico +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\others +ico +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + + + + +100 +Welcome to Setup +1 +Welcome to Setup +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +77 +1 + + +1 +102 +1 +1 +78 +1 + + +2 +200 +1 +1 +1 +0 + + +2 +300 +1 +1 +0 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Welcome +Welcome to the installer for %ProductName% %ProductVer% +&Next > +< &Back +&Cancel +&Help +Welcome to the installer for %ProductName% %ProductVer%. + +It is strongly recommended that you exit all Windows programs before continuing with this installation. + +If you have any other programs running, please click Cancel, close the programs, and run this setup again. + +Otherwise, click Next to continue. + +Welcome + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +欢迎 +欢迎使用 %ProductName% %ProductVer% 安装程序 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +欢迎使用 %ProductName% %ProductVer% 安装程序。 + +强烈建议您在继续该安装之前,退出所有 Windows 程序。 + +如果您有任何其他程序正在运行,请单击“取消”,关闭程序,然后再次运行该安装程序。 + +否则,请单击“下一步”继续。 + +欢迎 + + + + + +100 +Welcome to Update Setup +1 +Welcome to Setup +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +77 +1 + + +1 +102 +1 +1 +78 +1 + + +2 +200 +1 +1 +1 +0 + + +2 +300 +1 +1 +0 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Update +Welcome +Welcome to the installer for %ProductName% %ProductVer% +&Next > +< &Back +&Cancel +&Help +Welcome to the %ProductName% %ProductVer% upgrade program. + +It is strongly recommended that you exit all programs related to %ProductName% before continuing this installation. + +If you have any other programs running, please click "Cancel" to close the program, and then run the installer again. + +Otherwise, please click "Next" to continue. +Welcome + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 升级程序 +欢迎 +欢迎使用 %ProductName% %ProductVer% 安装程序 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +欢迎使用 %ProductName% %ProductVer% 升级程序。 + +强烈建议您在继续该安装之前,退出 %ProductName% 相关的所有程序。 + +如果您有任何其他程序正在运行,请单击“取消”,关闭程序,然后再次运行该安装程序。 + +否则,请单击“下一步”继续。 + +欢迎 + + + + + +125 +License Agreement +2 +License Agreement +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +1 + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +1 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +3 +400 +1 +1 +0 +0 +0 +1 +0 +0 + +1 +1 + + + +5 +602 +1 +1 +35 +1 +602 +603 + + +5 +603 +1 +1 +40 +0 +602 +603 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +License Agreement +Please read the following license agreement carefully. +&Next > +< &Back +&Cancel +&Help +Insert your license agreement text here... +I agree to the terms of this license agreement +I do not agree to the terms of this license agreement + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +许可协议 +请仔细阅读以下许可协议。 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +在此插入您的许可协议文本... +我同意该许可协议的条款 +我不同意该许可协议的条款 + + + + + + +105 +Scrolling Text +2 +Scrolling Text +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +1 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +3 +400 +1 +1 +0 +0 +0 +1 +0 +0 + +1 +1 + + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Important Information +Please read the following information. +&Next > +< &Back +&Cancel +&Help +This is currently in test mode, and this release is solely for testing the program's update features. While this version is available, the official release is still recommended. + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +重要信息 +请阅读以下信息。 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +当前是测试模式,发行此版本仅用于此程序的更新功能测试。虽然此版本可用,但仍建议使用正式版本。 + + + + + + +110 +Select Install Folder +2 +Select Install Folder +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +%AppFolder% + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +1 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +2 +203 +1 +1 +1 +0 + + +2 +211 +1 +1 +2 +0 + + +6 +801 +1 +1 +3 +0 +0 +0 +0 + +0 +1 +0 +1 +4 +%AppFolder% + + +1 +110 +1 +1 +4 +0 + + +2 +208 +1 +1 +5 +0 + + +2 +207 +1 +1 +6 +0 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Installation Folder +Where would you like %ProductName% to be installed? +&Next > +< &Back +&Cancel +&Help +C&hange... +%AppFolder% +The software will be installed in the folder listed below. To select a different location, either type in a new path, or click Change to browse for an existing folder. +Install %ProductName% to: +Space required: %SpaceRequired% +Space available on selected drive: %SpaceAvailable% + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +安装文件夹 +您想将 %ProductName% 安装到何处? +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +更改(&H)... +%AppFolder% +软件将被安装到以下列出的文件夹中。要选择不同的位置,键入新的路径,或单击“更改”浏览现有的文件夹。 +将 %ProductName% 安装到: +所需空间: %SpaceRequired% +选定驱动器的可用空间: %SpaceAvailable% + + + + + +115 +Select Shortcut Folder +2 +Select Shortcut Folder +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +%AppShortcutFolderName% + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +1 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +2 +203 +1 +1 +0 +0 + + +2 +211 +1 +1 +1 +0 + + +4 +501 +1 +1 +2 +0 +1 +1 + +4 +1 + + +5 +600 +0 +0 +35 +1 +600 +601 + + +5 +601 +0 +0 +40 +0 +600 +601 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Shortcut Folder +Where would you like the shortcuts to be installed? +&Next > +< &Back +&Cancel +&Help +The shortcut icons will be created in the folder indicated below. If you don't want to use the default folder, you can either type a new name, or select an existing folder from the list. +Shortcut Folder: +Install shortcuts for current user only +Make shortcuts available to all users +%AppShortcutFolderName% + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +快捷方式文件夹 +您想将快捷方式安装到何处? +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +快捷方式图标将在下面指出的文件夹中创建。如果您不想使用默认文件夹,您可以键入新的名称,或从列表中选择现有的文件夹。 +快捷方式文件夹: +只对当前用户安装快捷方式 +使快捷方式对所有用户都可用 +%AppShortcutFolderName% + + + + + +100 +Ready to Install +2 +Ready to Install +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +1 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +2 +200 +1 +1 +0 +0 + + +2 +300 +0 +1 +1 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Ready to Install +You are now ready to install %ProductName% %ProductVer% +&Next > +< &Back +&Cancel +&Help +The installer now has enough information to install %ProductName% on your computer. + + +The following settings will be used: + +Install folder: %AppFolder% + +Shortcut folder: %AppShortcutFolderName% + + +Please click Next to proceed with the installation. +Title + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +准备安装 +现在您正准备安装 %ProductName% %ProductVer% +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +现在安装程序已有足够的信息将 %ProductName% 安装到您的计算机中。 + + +将使用以下设置: + +安装文件夹: %AppFolder% + +快捷方式文件夹: %AppShortcutFolderName% + + +请单击“下一步”继续安装。 +标题 + + + + + + +1 + + +130 +One Progress Bar (While Installing) +2 +One Progress Bar (While Installing) +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +1 + + +On Preload + + + + + + +On Progress +number e_Stage, string e_CurrentItemText, number e_CurrentItemPct, number e_StagePct + + + + + +On Cancel + + + + + + + + +1 +102 +1 +1 +78 +1 + + +2 +203 +1 +1 +1 +0 + + +2 +211 +1 +1 +2 +0 + + +2 +212 +1 +1 +3 +0 + + +7 +900 +1 +1 +4 + +0 +100 +1 + + +2 +213 +0 +1 +2 +0 + + +2 +214 +0 +1 +3 +0 + + +7 +901 +0 +1 +4 + +0 +100 +0 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Installing %ProductName% +Please wait... +&Cancel + + + + +Progress Two +Performing Actions... + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +正在安装 %ProductName% +请稍候... +取消(&C) + + + + +进程二 +正在执行动作... + + + + + + + + + +155 +Scrolling Text Progress +2 +Scrolling Text Progress +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +0 + + +On Preload + + + + + + +On Start + + + + + + +On Finish + + + + + + +On Cancel + + + + + + + + +1 +102 +1 +0 +-10 +1 + + +2 +203 +1 +1 +1 +0 + + +2 +204 +1 +1 +3 +0 + + +3 +400 +1 +1 +2 +0 +0 +1 +0 +0 + +1 +1 + + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Performing Actions +Please wait... +&Cancel +Please wait while the following actions are performed: + + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +正在执行动作 +请稍候... +取消(&C) +请稍候,正在执行以下动作: + + + + + + + +100 +Finished Install +1 +Finished Install +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +0 +-9 +1 + + +2 +200 +1 +1 +0 +0 + + +2 +300 +1 +1 +1 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Installation Finished +The installation has completed successfully. +&Finish +< &Back +&Cancel +&Help +The %ProductName% %ProductVer% installation is complete. + +Thank you for choosing %ProductName%! + +Please click Finish to exit this installer. + +Installation Successful + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +安装已完成 +安装已成功完成。 +完成(&F) +< 返回(&B) +取消(&C) +帮助(&H) +%ProductName% %ProductVer% 安装已完成。 + +感谢您选择 %ProductName%! + +请单击“完成”退出该安装程序。 + +安装成功 + + + + + + + + +List 1 + +All + + + + + +1 +uninstall.xml +%AppFolder%\Uninstall +%AppFolder%\uninstall.exe +1 +0 +0 + +0 +0 +1 +008080 +b4c2e3 +5971b6 + +0 + +0 +0 +%ProductName% Uninstall + + +Arial +0 +-37 +700 +1 +0 +0 +1 + + +ffffff +000000 +0 +1 +v%ProductVer% + + +Arial +0 +-18 +700 +1 +0 +0 +1 + + +ffffff +000000 +0 +1 +
%Copyright% %CompanyName%. All rights reserved. %CompanyURL%
+ + +Arial +0 +-16 +400 +0 +0 +0 +1 + + +ffffff +000000 +0 +1 +
+1 +1 +1 +1 +Microsoft.DesktopAppInstaller +%ProductName% +1 +%AppFolder%\appinstaller.exe +1 +%CompanyName% +%CompanyURL% +%CompanyName% Support Department +%CompanyURL% +%ProductVer% + + + + + +%AppFolder% +0 +1 +1 +Uninstall +Removes %ProductName% from your computer. +1 +%AppFolder%\uninstall_icon.ico +0 +1 +%TempFolder%\%ProductName% Uninstall Log.txt +0 +0 +1 + + +100 +Welcome to Uninstall +1 +Welcome to Uninstall +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +2 +200 +1 +1 +1 +0 + + +2 +300 +1 +1 +0 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Uninstaller +Welcome +Welcome to the uninstaller for %ProductName% %ProductVer% +&Next > +< &Back +&Cancel +&Help +This program will uninstall %ProductName% %ProductVer%. + +If %ProductName% is currently running, please close it before proceeding with the uninstallation. + +Otherwise, click Next to continue. + +Uninstall %ProductName% + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 卸载程序 +欢迎 +欢迎使用 %ProductName% %ProductVer% 卸载程序 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +该程序将卸载 %ProductName% %ProductVer%。 + +如果 %ProductName% 当前正在运行,继续卸载之前请将其关闭。 + +否则,请单击“下一步”继续。 + +卸载 %ProductName% + + + + + + +1 + + +130 +One Progress Bar (While Uninstalling) +2 +One Progress Bar (While Uninstalling) +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +1 + + +On Preload + + + + + + +On Progress +number e_Stage, string e_CurrentItemText, number e_CurrentItemPct, number e_StagePct + + + + + +On Cancel + + + + + + + + +1 +102 +1 +1 +78 +1 + + +2 +203 +1 +1 +1 +0 + + +2 +211 +1 +1 +2 +0 + + +2 +212 +1 +1 +3 +0 + + +7 +900 +1 +1 +4 + +0 +100 +1 + + +2 +213 +0 +1 +2 +0 + + +2 +214 +0 +1 +3 +0 + + +7 +901 +0 +1 +4 + +0 +100 +0 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Uninstaller +Removing %ProductName% +Please wait... +&Cancel + + + + +Progress Two +Performing Actions... + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 卸载程序 +正在移除 %ProductName% +请稍候... +取消(&C) + + + + +进程二 +正在执行动作... + + + + + + + + + +100 +Finished Uninstall +1 +Finished Uninstall +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +0 +-9 +1 + + +2 +200 +1 +1 +0 +0 + + +2 +300 +1 +1 +1 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Uninstaller +Uninstallation Finished +The uninstallation has completed successfully. +&Finish +< &Back +&Cancel +&Help +%ProductName% %ProductVer% has been uninstalled. + +Please click Finish to exit. + +Uninstallation Successful + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 卸载程序 +卸载已完成 +卸载已成功完成。 +完成(&F) +< 返回(&B) +取消(&C) +帮助(&H) +%ProductName% %ProductVer% 已被卸载。 + +请单击“完成”退出。 + +卸载成功 + + + + + + + +在启动时 + + + + + + +On Uninstall Error +number e_ErrorCode, string e_ErrorMsgID + + + + + +On Post Uninstall + + + + + + +
+ + +1 +%TempFolder%\%ProductName% Setup Log.txt +0 +1 + +0 +0 +0 +1 +2 + +0 +0 +1 +008080 +b4c2e3 +5971b6 + +1 +%TempLaunchFolder%\main.ico +0 +0 +%ProductName% + + +Arial +0 +-37 +700 +1 +0 +0 +1 + + +ffffff +000000 +0 +1 +v%ProductVer% + + +Arial +0 +-18 +700 +1 +0 +0 +1 + + +ffffff +000000 +0 +1 +
%Copyright%. All rights reserved. %CompanyURL%
+ + +Arial +0 +-16 +400 +0 +0 +0 +1 + + +ffffff +000000 +0 +1 +
+ +0 +0 +30 +30 +1 +1767105338 +0 +0 +1 +1 +2 +1 +0 +03F9811E-4657-4757-A24D-570C64F8ABB6 +0 +%CompanyName% +%CompanyURL% + + + + + +32768 +65535 +65535 +65535 +0 +0 +0 +0 +0 +0 +65535 +65535 +65535 +65535 +65535 +65535 + +0 +0 +0 +0 +1 +0 + + +Developer +New Project + + + +Copyright 2025 + + +9.5.3.0 +9.5.3.0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\shared + +0 + + + + + + +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\appinstaller\res\icons\main.ico +1 +0 + +All + + + + + +全局函数 + + + + + + +在启动时 + + + + + + +在安装后 + + + + + + +在关闭时 + + + + + + +
+ + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + + + +%ProductName% +Desktop App Installer +1 + + +%CompanyName% +Windows Modern +1 + + +%ProductVer% +0.1.0.0 +1 + + +%Copyright% +Copyright (C)2025 %CompanyName% +1 + + +%CompanyURL% + +1 + + +%WindowTitle% +%ProductName% Setup +1 + + +%WindowTitleUninstall% +%ProductName% Uninstaller +1 + + +%AppFolder% +%ProgramFilesFolder%\%ProductName% +2 + + +%AppShortcutFolderName% +%ProductName% +2 + + + + +Default + + +0 + + +0 +InstallerSetup.exe +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Generated +0 +0 +0 +0 +0 +0 + +1 + + + + + +1 + + +0 + + + + + +1 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\appinstaller\res\icons\main.ico +9.5.3.0 +9.5.3.0 +Indigo Rose Corporation +Setup Factory Runtime +Created with Setup Factory +sf_rt +Setup Application +Setup Engine Copyright ?1992-2019 Indigo Rose Corporation +Setup Factory is a trademark of Indigo Rose Corporation + + +0 + + + + + + +#SUFDIR#\Includes\Scripts\_SUF70_Global_Functions.lua +1 + +All + + + +
\ No newline at end of file diff --git a/others/Autosave/autosave_2025-12-03_09-08-40.suf b/others/Autosave/autosave_2025-12-03_09-08-40.suf new file mode 100644 index 0000000..15a7c15 --- /dev/null +++ b/others/Autosave/autosave_2025-12-03_09-08-40.suf @@ -0,0 +1,6042 @@ + + +{AFB904C4-C255-4540-B97E-A75A34F1FFB0} +9.5.3.0 + + + +1 + +*.* +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\shared +* +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +1 + +1 +1 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\appinstaller.exe +appinstaller.exe +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +exe +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +1 +0 +0 +0 +0 +0 + +App Installer + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\certmgr.dll +certmgr.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\notice.dll +notice.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\pkgmgr.dll +pkgmgr.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\pkgread.dll +pkgread.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\PriFileFormat.dll +PriFileFormat.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\priformatcli.dll +priformatcli.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\reslib.dll +reslib.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\settings.exe +settings.exe +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +exe +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +1 +0 +0 +0 +0 +0 + +Settings + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\others\uninstall_icon.ico +uninstall_icon.ico +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\others +ico +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + + + + +100 +Welcome to Setup +1 +Welcome to Setup +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +77 +1 + + +1 +102 +1 +1 +78 +1 + + +2 +200 +1 +1 +1 +0 + + +2 +300 +1 +1 +0 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Welcome +Welcome to the installer for %ProductName% %ProductVer% +&Next > +< &Back +&Cancel +&Help +Welcome to the installer for %ProductName% %ProductVer%. + +It is strongly recommended that you exit all Windows programs before continuing with this installation. + +If you have any other programs running, please click Cancel, close the programs, and run this setup again. + +Otherwise, click Next to continue. + +Welcome + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +欢迎 +欢迎使用 %ProductName% %ProductVer% 安装程序 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +欢迎使用 %ProductName% %ProductVer% 安装程序。 + +强烈建议您在继续该安装之前,退出所有 Windows 程序。 + +如果您有任何其他程序正在运行,请单击“取消”,关闭程序,然后再次运行该安装程序。 + +否则,请单击“下一步”继续。 + +欢迎 + + + + + +100 +Welcome to Update Setup +1 +Welcome to Setup +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +77 +1 + + +1 +102 +1 +1 +78 +1 + + +2 +200 +1 +1 +1 +0 + + +2 +300 +1 +1 +0 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Update +Welcome +Welcome to the installer for %ProductName% %ProductVer% +&Next > +< &Back +&Cancel +&Help +Welcome to the %ProductName% %ProductVer% upgrade program. + +It is strongly recommended that you exit all programs related to %ProductName% before continuing this installation. + +If you have any other programs running, please click "Cancel" to close the program, and then run the installer again. + +Otherwise, please click "Next" to continue. +Welcome + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 升级程序 +欢迎 +欢迎使用 %ProductName% %ProductVer% 安装程序 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +欢迎使用 %ProductName% %ProductVer% 升级程序。 + +强烈建议您在继续该安装之前,退出 %ProductName% 相关的所有程序。 + +如果您有任何其他程序正在运行,请单击“取消”,关闭程序,然后再次运行该安装程序。 + +否则,请单击“下一步”继续。 + +欢迎 + + + + + +125 +License Agreement +2 +License Agreement +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +1 + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +1 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +3 +400 +1 +1 +0 +0 +0 +1 +0 +0 + +1 +1 + + + +5 +602 +1 +1 +35 +1 +602 +603 + + +5 +603 +1 +1 +40 +0 +602 +603 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +License Agreement +Please read the following license agreement carefully. +&Next > +< &Back +&Cancel +&Help +Insert your license agreement text here... +I agree to the terms of this license agreement +I do not agree to the terms of this license agreement + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +许可协议 +请仔细阅读以下许可协议。 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +在此插入您的许可协议文本... +我同意该许可协议的条款 +我不同意该许可协议的条款 + + + + + + +105 +Scrolling Text +2 +Scrolling Text +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +1 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +3 +400 +1 +1 +0 +0 +0 +1 +0 +0 + +1 +1 + + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Important Information +Please read the following information. +&Next > +< &Back +&Cancel +&Help +This is currently in test mode, and this release is solely for testing the program's update features. While this version is available, the official release is still recommended. + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +重要信息 +请阅读以下信息。 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +当前是测试模式,发行此版本仅用于此程序的更新功能测试。虽然此版本可用,但仍建议使用正式版本。 + + + + + + +110 +Select Install Folder +2 +Select Install Folder +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +%AppFolder% + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +1 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +2 +203 +1 +1 +1 +0 + + +2 +211 +1 +1 +2 +0 + + +6 +801 +1 +1 +3 +0 +0 +0 +0 + +0 +1 +0 +1 +4 +%AppFolder% + + +1 +110 +1 +1 +4 +0 + + +2 +208 +1 +1 +5 +0 + + +2 +207 +1 +1 +6 +0 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Installation Folder +Where would you like %ProductName% to be installed? +&Next > +< &Back +&Cancel +&Help +C&hange... +%AppFolder% +The software will be installed in the folder listed below. To select a different location, either type in a new path, or click Change to browse for an existing folder. +Install %ProductName% to: +Space required: %SpaceRequired% +Space available on selected drive: %SpaceAvailable% + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +安装文件夹 +您想将 %ProductName% 安装到何处? +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +更改(&H)... +%AppFolder% +软件将被安装到以下列出的文件夹中。要选择不同的位置,键入新的路径,或单击“更改”浏览现有的文件夹。 +将 %ProductName% 安装到: +所需空间: %SpaceRequired% +选定驱动器的可用空间: %SpaceAvailable% + + + + + +115 +Select Shortcut Folder +2 +Select Shortcut Folder +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +%AppShortcutFolderName% + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +1 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +2 +203 +1 +1 +0 +0 + + +2 +211 +1 +1 +1 +0 + + +4 +501 +1 +1 +2 +0 +1 +1 + +4 +1 + + +5 +600 +0 +0 +35 +1 +600 +601 + + +5 +601 +0 +0 +40 +0 +600 +601 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Shortcut Folder +Where would you like the shortcuts to be installed? +&Next > +< &Back +&Cancel +&Help +The shortcut icons will be created in the folder indicated below. If you don't want to use the default folder, you can either type a new name, or select an existing folder from the list. +Shortcut Folder: +Install shortcuts for current user only +Make shortcuts available to all users +%AppShortcutFolderName% + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +快捷方式文件夹 +您想将快捷方式安装到何处? +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +快捷方式图标将在下面指出的文件夹中创建。如果您不想使用默认文件夹,您可以键入新的名称,或从列表中选择现有的文件夹。 +快捷方式文件夹: +只对当前用户安装快捷方式 +使快捷方式对所有用户都可用 +%AppShortcutFolderName% + + + + + +100 +Ready to Install +2 +Ready to Install +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +1 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +2 +200 +1 +1 +0 +0 + + +2 +300 +0 +1 +1 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Ready to Install +You are now ready to install %ProductName% %ProductVer% +&Next > +< &Back +&Cancel +&Help +The installer now has enough information to install %ProductName% on your computer. + + +The following settings will be used: + +Install folder: %AppFolder% + +Shortcut folder: %AppShortcutFolderName% + + +Please click Next to proceed with the installation. +Title + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +准备安装 +现在您正准备安装 %ProductName% %ProductVer% +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +现在安装程序已有足够的信息将 %ProductName% 安装到您的计算机中。 + + +将使用以下设置: + +安装文件夹: %AppFolder% + +快捷方式文件夹: %AppShortcutFolderName% + + +请单击“下一步”继续安装。 +标题 + + + + + + +1 + + +130 +One Progress Bar (While Installing) +2 +One Progress Bar (While Installing) +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +1 + + +On Preload + + + + + + +On Progress +number e_Stage, string e_CurrentItemText, number e_CurrentItemPct, number e_StagePct + + + + + +On Cancel + + + + + + + + +1 +102 +1 +1 +78 +1 + + +2 +203 +1 +1 +1 +0 + + +2 +211 +1 +1 +2 +0 + + +2 +212 +1 +1 +3 +0 + + +7 +900 +1 +1 +4 + +0 +100 +1 + + +2 +213 +0 +1 +2 +0 + + +2 +214 +0 +1 +3 +0 + + +7 +901 +0 +1 +4 + +0 +100 +0 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Installing %ProductName% +Please wait... +&Cancel + + + + +Progress Two +Performing Actions... + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +正在安装 %ProductName% +请稍候... +取消(&C) + + + + +进程二 +正在执行动作... + + + + + + + + + +155 +Scrolling Text Progress +2 +Scrolling Text Progress +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +0 + + +On Preload + + + + + + +On Start + + + + + + +On Finish + + + + + + +On Cancel + + + + + + + + +1 +102 +1 +0 +-10 +1 + + +2 +203 +1 +1 +1 +0 + + +2 +204 +1 +1 +3 +0 + + +3 +400 +1 +1 +2 +0 +0 +1 +0 +0 + +1 +1 + + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Performing Actions +Please wait... +&Cancel +Please wait while the following actions are performed: + + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +正在执行动作 +请稍候... +取消(&C) +请稍候,正在执行以下动作: + + + + + + + +100 +Finished Install +1 +Finished Install +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +0 +-9 +1 + + +2 +200 +1 +1 +0 +0 + + +2 +300 +1 +1 +1 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Installation Finished +The installation has completed successfully. +&Finish +< &Back +&Cancel +&Help +The %ProductName% %ProductVer% installation is complete. + +Thank you for choosing %ProductName%! + +Please click Finish to exit this installer. + +Installation Successful + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +安装已完成 +安装已成功完成。 +完成(&F) +< 返回(&B) +取消(&C) +帮助(&H) +%ProductName% %ProductVer% 安装已完成。 + +感谢您选择 %ProductName%! + +请单击“完成”退出该安装程序。 + +安装成功 + + + + + + + + +List 1 + +All + + + + + +1 +uninstall.xml +%AppFolder%\Uninstall +%AppFolder%\uninstall.exe +1 +0 +0 + +0 +0 +1 +008080 +b4c2e3 +5971b6 + +0 + +0 +0 +%ProductName% Uninstall + + +Arial +0 +-37 +700 +1 +0 +0 +1 + + +ffffff +000000 +0 +1 +v%ProductVer% + + +Arial +0 +-18 +700 +1 +0 +0 +1 + + +ffffff +000000 +0 +1 +
%Copyright% %CompanyName%. All rights reserved. %CompanyURL%
+ + +Arial +0 +-16 +400 +0 +0 +0 +1 + + +ffffff +000000 +0 +1 +
+1 +1 +1 +1 +Microsoft.DesktopAppInstaller +%ProductName% +1 +%AppFolder%\appinstaller.exe +1 +%CompanyName% +%CompanyURL% +%CompanyName% Support Department +%CompanyURL% +%ProductVer% + + + + + +%AppFolder% +0 +1 +1 +Uninstall +Removes %ProductName% from your computer. +1 +%AppFolder%\uninstall_icon.ico +0 +1 +%TempFolder%\%ProductName% Uninstall Log.txt +0 +0 +1 + + +100 +Welcome to Uninstall +1 +Welcome to Uninstall +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +2 +200 +1 +1 +1 +0 + + +2 +300 +1 +1 +0 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Uninstaller +Welcome +Welcome to the uninstaller for %ProductName% %ProductVer% +&Next > +< &Back +&Cancel +&Help +This program will uninstall %ProductName% %ProductVer%. + +If %ProductName% is currently running, please close it before proceeding with the uninstallation. + +Otherwise, click Next to continue. + +Uninstall %ProductName% + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 卸载程序 +欢迎 +欢迎使用 %ProductName% %ProductVer% 卸载程序 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +该程序将卸载 %ProductName% %ProductVer%。 + +如果 %ProductName% 当前正在运行,继续卸载之前请将其关闭。 + +否则,请单击“下一步”继续。 + +卸载 %ProductName% + + + + + + +1 + + +130 +One Progress Bar (While Uninstalling) +2 +One Progress Bar (While Uninstalling) +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +1 + + +On Preload + + + + + + +On Progress +number e_Stage, string e_CurrentItemText, number e_CurrentItemPct, number e_StagePct + + + + + +On Cancel + + + + + + + + +1 +102 +1 +1 +78 +1 + + +2 +203 +1 +1 +1 +0 + + +2 +211 +1 +1 +2 +0 + + +2 +212 +1 +1 +3 +0 + + +7 +900 +1 +1 +4 + +0 +100 +1 + + +2 +213 +0 +1 +2 +0 + + +2 +214 +0 +1 +3 +0 + + +7 +901 +0 +1 +4 + +0 +100 +0 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Uninstaller +Removing %ProductName% +Please wait... +&Cancel + + + + +Progress Two +Performing Actions... + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 卸载程序 +正在移除 %ProductName% +请稍候... +取消(&C) + + + + +进程二 +正在执行动作... + + + + + + + + + +100 +Finished Uninstall +1 +Finished Uninstall +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +0 +-9 +1 + + +2 +200 +1 +1 +0 +0 + + +2 +300 +1 +1 +1 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Uninstaller +Uninstallation Finished +The uninstallation has completed successfully. +&Finish +< &Back +&Cancel +&Help +%ProductName% %ProductVer% has been uninstalled. + +Please click Finish to exit. + +Uninstallation Successful + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 卸载程序 +卸载已完成 +卸载已成功完成。 +完成(&F) +< 返回(&B) +取消(&C) +帮助(&H) +%ProductName% %ProductVer% 已被卸载。 + +请单击“完成”退出。 + +卸载成功 + + + + + + + +在启动时 + + + + + + +On Uninstall Error +number e_ErrorCode, string e_ErrorMsgID + + + + + +On Post Uninstall + + + + + + +
+ + +1 +%TempFolder%\%ProductName% Setup Log.txt +0 +1 + +0 +0 +0 +1 +2 + +0 +0 +1 +008080 +b4c2e3 +5971b6 + +1 +%TempLaunchFolder%\main.ico +0 +0 +%ProductName% + + +Arial +0 +-37 +700 +1 +0 +0 +1 + + +ffffff +000000 +0 +1 +v%ProductVer% + + +Arial +0 +-18 +700 +1 +0 +0 +1 + + +ffffff +000000 +0 +1 +
%Copyright%. All rights reserved. %CompanyURL%
+ + +Arial +0 +-16 +400 +0 +0 +0 +1 + + +ffffff +000000 +0 +1 +
+ +0 +0 +30 +30 +1 +1767105338 +0 +0 +1 +1 +2 +1 +0 +03F9811E-4657-4757-A24D-570C64F8ABB6 +0 +%CompanyName% +%CompanyURL% + + + + + +32768 +65535 +65535 +65535 +0 +0 +0 +0 +0 +0 +65535 +65535 +65535 +65535 +65535 +65535 + +0 +0 +0 +0 +1 +0 + + +Developer +New Project + + + +Copyright 2025 + + +9.5.3.0 +9.5.3.0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\shared + +0 + + + + + + +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\appinstaller\res\icons\main.ico +1 +0 + +All + + + + + +全局函数 + + + + + + +在启动时 + + + + + + +在安装后 + + + + + + +在关闭时 + + + + + + +
+ + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + + + +%ProductName% +Desktop App Installer +1 + + +%CompanyName% +Windows Modern +1 + + +%ProductVer% +0.1.0.0 +1 + + +%Copyright% +Copyright (C)2025 %CompanyName% +1 + + +%CompanyURL% + +1 + + +%WindowTitle% +%ProductName% Setup +1 + + +%WindowTitleUninstall% +%ProductName% Uninstaller +1 + + +%AppFolder% +%ProgramFilesFolder%\%ProductName% +2 + + +%AppShortcutFolderName% +%ProductName% +2 + + + + +Default + + +0 + + +0 +InstallerSetup.exe +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Generated +0 +0 +0 +0 +0 +0 + +1 + + + + + +1 + + +0 + + + + + +1 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\appinstaller\res\icons\main.ico +9.5.3.0 +9.5.3.0 +Indigo Rose Corporation +Setup Factory Runtime +Created with Setup Factory +sf_rt +Setup Application +Setup Engine Copyright ?1992-2019 Indigo Rose Corporation +Setup Factory is a trademark of Indigo Rose Corporation + + +0 + + + + + + +#SUFDIR#\Includes\Scripts\_SUF70_Global_Functions.lua +1 + +All + + + +
\ No newline at end of file diff --git a/others/Autosave/autosave_2025-11-30_22-58-12.suf b/others/Autosave/autosave_2025-12-03_09-12-17.suf similarity index 75% rename from others/Autosave/autosave_2025-11-30_22-58-12.suf rename to others/Autosave/autosave_2025-12-03_09-12-17.suf index ab0cd7e..371bf50 100644 --- a/others/Autosave/autosave_2025-11-30_22-58-12.suf +++ b/others/Autosave/autosave_2025-12-03_09-12-17.suf @@ -923,7 +923,358 @@ On Preload + +function GetLangID(p, s) + -- s 左移 10 位 = s * 2^10 + -- 按位或 = 把 p 加上即可,因为 p < 2^10(WinAPI 保证) + return s * 1024 + p +end + +-- ============================================ +-- 函数:DetectSystemLanguage +-- 描述:检测系统语言,返回 'zh' 或 'en' +-- ============================================ +function DetectSystemLanguage() + -- 调用官方API获取语言信息 + local langTbl = Application.GetInstallLanguage(); + local langid = GetLangID (langTbl.Primary, langTbl.Secondary); + -- 检查API是否调用成功 + if langTbl and langid then + -- 将语言ID转换为我们的语言标识 + -- 0x0409 (1033) = 英语(美国),0x0804 (2052) = 中文(简体) + if langid == 2052 then -- 中文(简体) + return "zh" + else -- 默认英语(包括1033及其他情况) + return "en" + end + end + + -- API调用失败或未知情况,默认返回英语 + return "en" +end + +-- ============================================ +-- 全局语言表 +-- 说明:所有需要本地化的字符串都定义在这里 +-- ============================================ +local LangStrings = { + zh = { + -- 帮助文本 + help_title = "安装程序命令行帮助", + help_body = [[ +MyApp 安装程序 - 命令行参数帮助 + +自动安装模式 (无界面或被动安装): + /S, /SILENT, /QUIET, /PASSIVE, /AUTO + -S, -SILENT, -QUIET, -PASSIVE, -AUTO + (也支持无前缀格式,如 SILENT) + +指定安装路径 (该功能在重新安装模式和升级模式不可用): + 1. 使用 /TO 参数 - 更改安装的根位置,但保留默认文件夹名称。 + 示例: /TO:"D:\" + 安装到: D:\MyApp\ (假设默认安装到 C:\Program Files\MyApp) + 示例: /TO "D:\MyCompany" + 安装到: D:\MyCompany\MyApp\ + + 2. 使用 /DIR 参数 - 指定完整的自定义安装路径。 + 示例: /DIR:"D:\MyApp Custom" + 安装到: D:\MyApp Custom\ + 示例: /dir "C:\Program Files\Another Name" + + 注意:路径若包含空格,请使用双引号包裹。 + +显示此帮助: + /?, /HELP, /H, -?, -HELP, -H, ?, HELP, H + +使用示例: + setup.exe /S /TO:"D:\" // 静默安装到D盘 + setup.exe /DIR:"C:\My App" /S // 静默安装到自定义目录 + setup.exe /TO D:\ /PASSIVE // 被动模式安装到D盘 +]], + + -- 对话框消息 + downgrade_title = "%ProductName% 安装程序", -- %ProductName% 会被自动替换 + downgrade_msg = "检测到已安装的版本 (%s) 比当前安装包版本 (%s) 更高。\n\n要继续进行降级安装吗?\n注意:这会覆盖现有版本。请确保已关闭原程序。", + + reinstall_title = "%ProductName% 安装程序", + reinstall_msg = "检测到当前计算机已安装与本安装包相同的版本 (%s),请问要继续安装吗?\n\n注意:重新安装时,会覆盖现有文件。请确保已关闭原程序。" + }, + + en = { + -- 帮助文本 + help_title = "Installer Command Line Help", + help_body = [[ +MyApp Installer - Command Line Help + +Automatic installation modes (unattended or passive): + /S, /SILENT, /QUIET, /PASSIVE, /AUTO + -S, -SILENT, -QUIET, -PASSIVE, -AUTO + (Prefixless formats like SILENT are also supported) + +Specify installation path (Not available in Reinstall and Upgrade modes): + 1. Use /TO parameter - Change the root location but keep the default folder name. + Example: /TO:"D:\" + Installs to: D:\MyApp\ (assuming default is C:\Program Files\MyApp) + Example: /TO "D:\MyCompany" + Installs to: D:\MyCompany\MyApp\ + + 2. Use /DIR parameter - Specify a complete custom installation path. + Example: /DIR:"D:\MyApp Custom" + Installs to: D:\MyApp Custom\ + Example: /dir "C:\Program Files\Another Name" + + Note: If the path contains spaces, please enclose it in double quotes. + +Show this help: + /?, /HELP, /H, -?, -HELP, -H, ?, HELP, H + +Usage Examples: + setup.exe /S /TO:"D:\" // Silent install to D drive + setup.exe /DIR:"C:\My App" /S // Silent install to custom directory + setup.exe /TO D:\ /PASSIVE // Passive mode install to D drive +]], + + -- 对话框消息 + downgrade_title = "%ProductName% Setup", + downgrade_msg = "A higher version (%s) is already installed compared to the current installer version (%s).\n\nDo you want to proceed with downgrade installation?\nNote: This will overwrite the existing version. Please ensure the original program is closed.", + + reinstall_title = "%ProductName% Setup", + reinstall_msg = "The same version (%s) is already installed on this computer. Do you want to continue with reinstallation?\n\nNote: Reinstallation will overwrite existing files. Please ensure the original program is closed." + } +} + +-- ============================================ +-- 函数:GetLocalizedString +-- 描述:获取当前语言的本地化字符串 +-- 参数:key - 字符串键名(如 "downgrade_msg") +-- 返回:本地化后的字符串 +-- ============================================ +function GetLocalizedString(key) + local lang = DetectSystemLanguage() + local str = LangStrings[lang][key] or LangStrings["en"][key] or "" + -- 替换可能的动态变量 + str = SessionVar.Expand(str); + return str +end + +function CompareVersion(verstrl, verstrr) + return String.CompareFileVersions (verstrl, verstrr); +end + +-- ============================================ +-- 函数:ParseSetupArgs +-- 描述:解析增强的安装程序命令行参数(兼容基础函数版本) +-- 返回: +-- isAutoMode (boolean): 是否为自动/静默模式 +-- customInstallPath (string or nil): 自定义的安装路径 +-- showHelp (boolean): 是否显示帮助信息 +-- pathParamUsed (string or nil): 使用的路径参数类型(“/TO”或“/DIR”) +-- ============================================ +function ParseSetupArgs() + local args = _CommandLineArgs or {} + local isAutoMode = false + local customInstallPath = nil + local showHelp = false + local pathParamUsed = nil + + -- 定义参数字典,提高检查效率 + local flagMap = {} + -- 自动模式参数 + local autoList = {"/S", "/SILENT", "/PASSIVE", "/QUIET", "/AUTO", "-S", "-SILENT", "-PASSIVE", "-QUIET", "-AUTO", "S", "SILENT", "PASSIVE", "QUIET", "AUTO"} + for _, flag in ipairs(autoList) do + flagMap[String.Upper(flag)] = "AUTO" + end + -- 帮助参数 + local helpList = {"/?", "/HELP", "/H", "-?", "-HELP", "-H", "?", "HELP", "H"} + for _, flag in ipairs(helpList) do + flagMap[String.Upper(flag)] = "HELP" + end + + -- 内部函数:从“参数:值”格式中提取值 + local function extractValueFromColonArg(fullArg) + local colonPos = String.Find(fullArg, ":", 1, true) + if colonPos > 0 then + -- 使用完整的 String.Mid 参数:字符串, 起始位置, 长度 + local totalLen = String.Length(fullArg) + local valueLen = totalLen - colonPos -- 计算要提取的长度 + local value = String.Mid(fullArg, colonPos + 1, valueLen) + -- 去除可能包裹的引号 + value = String.TrimRight(value, "\"") + value = String.TrimRight(value, "'") + return value + end + return "" + end + + -- 内部函数:处理 /TO 参数逻辑 + local function processToParam(rawPathValue) + -- 使用固定的默认文件夹名 + -- 重要:将 "MyApp" 改为你的程序默认文件夹名 + local defaultFolderName = SessionVar.Expand ("%ProductName%"); + if rawPathValue ~= "" and defaultFolderName ~= "" then + -- 确保 rawPathValue 以反斜杠结尾 + if String.Right(rawPathValue, 1) ~= "\\" then + rawPathValue = rawPathValue .. "\\" + end + return rawPathValue .. defaultFolderName + end + return rawPathValue + end + + -- 内部函数:检查字符串是否以指定前缀开头(不区分大小写) + local function startsWith(str, prefix) + return String.Left(String.Upper(str), String.Length(prefix)) == String.Upper(prefix) + end + + local i = 1 + while i <= #args do + local arg = args[i] + local argUpper = String.Upper(arg) + local argType = flagMap[argUpper] + + -- 1. 检查已知的独立参数(自动模式、帮助) + if argType == "AUTO" then + isAutoMode = true + elseif argType == "HELP" then + showHelp = true + -- 2. 检查“参数:值”格式的路径参数 + elseif startsWith(arg, "/TO:") or startsWith(arg, "-TO:") then + pathParamUsed = "/TO" + local rawPath = extractValueFromColonArg(arg) + if rawPath ~= "" then + customInstallPath = processToParam(rawPath) + end + elseif startsWith(arg, "/DIR:") or startsWith(arg, "-DIR:") then + pathParamUsed = "/DIR" + local rawPath = extractValueFromColonArg(arg) + if rawPath ~= "" then + customInstallPath = rawPath + end + -- 3. 检查“参数 值”格式的路径参数(空格分隔) + elseif argUpper == "/TO" or argUpper == "-TO" then + pathParamUsed = "/TO" + if i + 1 <= #args then + local nextArg = args[i + 1] + -- 确保下一个参数不是另一个开关参数 + local nextFirstChar = String.Left(nextArg, 1) + if nextFirstChar ~= "/" and nextFirstChar ~= "-" then + local rawPath = String.TrimRight(nextArg, "\"") + rawPath = String.TrimRight(rawPath, "'") + customInstallPath = processToParam(rawPath) + i = i + 1 -- 消耗下一个参数 + end + end + elseif argUpper == "/DIR" or argUpper == "-DIR" then + pathParamUsed = "/DIR" + if i + 1 <= #args then + local nextArg = args[i + 1] + local nextFirstChar = String.Left(nextArg, 1) + if nextFirstChar ~= "/" and nextFirstChar ~= "-" then + customInstallPath = String.TrimRight(nextArg, "\"") + customInstallPath = String.TrimRight(customInstallPath, "'") + i = i + 1 + end + end + end + -- 如果参数未匹配任何已知模式,它将被忽略 + i = i + 1 + end + + return isAutoMode, customInstallPath, showHelp, pathParamUsed +end + +-- ============================================ +-- 函数:ShowHelpAndExit +-- 描述:显示参数帮助信息并退出安装程序 +-- ============================================ +function ShowHelpAndExit() + -- 在消息框中显示帮助(如果是交互模式) + Dialog.Message(GetLocalizedString("help_title"), GetLocalizedString("help_body"), MB_OK, MB_ICONINFORMATION) + -- 退出安装程序 + Application.Exit() +end + + +-- 解析命令行参数 +local autoMode, installPath, needHelp = ParseSetupArgs() +if needHelp then + ShowHelpAndExit() +end +-- 存储结果供后续使用 +SessionVar.Set("%AutoInstallMode%", tostring(autoMode)) + +mode = 0; -- 0: Normal, 1: Reinstall, 2: Upgrade +keyexist = Registry.DoesKeyExist(HKEY_CURRENT_USER, "SOFTWARE\\Windows Modern\\App Installer"); + +if (keyexist) then + local ver = Registry.GetValue(HKEY_CURRENT_USER, "SOFTWARE\\Windows Modern\\App Installer", "Version", false); + local currentVer = SessionVar.Expand("%ProductVer%"); + local ishigh = CompareVersion(ver, currentVer); + + if (ishigh > 0) then + -- 降级安装 + if (autoMode == false) then + local msgpress = Dialog.Message( + GetLocalizedString("downgrade_title"), + string.format(GetLocalizedString("downgrade_msg"), ver, currentVer), + MB_YESNO, MB_ICONQUESTION + ); + if (msgpress == IDYES) then mode = 1; -- 重新安装(降级) + else Application.Exit(); + end + else mode = 1; + end + elseif (ishigh == 0) then + -- 重新安装(版本相同) + if (autoMode == false) then + local msgpress1 = Dialog.Message( + GetLocalizedString("reinstall_title"), + string.format(GetLocalizedString("reinstall_msg"), ver), + MB_YESNO, MB_ICONQUESTION + ); + if (msgpress1 == IDYES) then + mode = 1; -- 重新安装 + else + Application.Exit(); + end + else mode = 1; + end + -- 注意:这里没有 mode = 0 了! + else + -- 升级安装 + mode = 2; -- 升级 + end +else + mode = 0; -- 全新安装 +end + +g_mode = mode; + +if (installPath and mode == 0) then + SessionVar.Set("%AppFolder%", installPath); +end + +g_lastver = Registry.GetValue(HKEY_CURRENT_USER, "SOFTWARE\\Windows Modern\\App Installer", "Version", false); +g_lastpath = Registry.GetValue(HKEY_CURRENT_USER, "SOFTWARE\\Windows Modern\\App Installer", "AppPath", false); +g_lastuni = Registry.GetValue(HKEY_CURRENT_USER, "SOFTWARE\\Windows Modern\\App Installer", "Uninstall", false); + +SessionVar.Set ("%InstallMode%", tostring (g_mode)); +SessionVar.Set ("%LastVersion%", g_lastver); +SessionVar.Set ("%LastPath%", g_lastpath); +SessionVar.Set ("%LastUninstall%", g_lastuni); + +if (g_mode == 1 or g_mode == 2) then + strInstallFolderPath = SessionVar.Expand ("%LastPath%"); + SessionVar.Set ("%AppFolder%", strInstallFolderPath); +end + +if (autoMode == true) then + Screen.Jump ("Ready to Install"); +end + +if (mode == 2 and autoMode == false) then + Screen.Jump ("Welcome to Update Setup"); +end @@ -931,7 +1282,6 @@ On Back @@ -944,8 +1294,8 @@ Screen.Back(); +-- Screen.Next(); +Screen.Jump ("License Agreement") @@ -1097,6 +1447,299 @@ Otherwise, click Next to continue. 如果您有任何其他程序正在运行,请单击“取消”,关闭程序,然后再次运行该安装程序。 +否则,请单击“下一步”继续。 + +欢迎 +
+
+
+
+ +100 +Welcome to Update Setup +1 +Welcome to Setup +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +77 +1 + + +1 +102 +1 +1 +78 +1 + + +2 +200 +1 +1 +1 +0 + + +2 +300 +1 +1 +0 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Update +Welcome +Welcome to the installer for %ProductName% %ProductVer% +&Next > +< &Back +&Cancel +&Help +Welcome to the %ProductName% %ProductVer% upgrade program. + +It is strongly recommended that you exit all programs related to %ProductName% before continuing this installation. + +If you have any other programs running, please click "Cancel" to close the program, and then run the installer again. + +Otherwise, please click "Next" to continue. +Welcome + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 升级程序 +欢迎 +欢迎使用 %ProductName% %ProductVer% 安装程序 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +欢迎使用 %ProductName% %ProductVer% 升级程序。 + +强烈建议您在继续该安装之前,退出 %ProductName% 相关的所有程序。 + +如果您有任何其他程序正在运行,请单击“取消”,关闭程序,然后再次运行该安装程序。 + 否则,请单击“下一步”继续。 欢迎 @@ -1559,8 +2202,16 @@ Screen.Back(); + + +g_mode = tonumber (SessionVar.Get ("%InstallMode%")); +if (g_mode == 1 or g_mode == 2) then + strInstallFolderPath = SessionVar.Expand ("%LastPath%"); + SessionVar.Set ("%AppFolder%", strInstallFolderPath); + Screen.Jump ("Ready to Install"); +else + Screen.Next(); +end @@ -2276,7 +2927,10 @@ end -- from _SUF70_Global_Functions.lua: -- fill the combo box with the existing shortcut folder names g_FillComboBoxWithShortcutFolders(CTRL_COMBOBOX_SHORTCUTFOLDERS); - + +if (g_mode == 1 or g_mode == 2) then + Screen.Next (); +end @@ -2450,8 +3104,8 @@ end 5 600 -1 -1 +0 +0 35 1 600 @@ -2460,8 +3114,8 @@ end 5 601 -1 -1 +0 +0 40 0 600 @@ -2647,7 +3301,11 @@ end On Preload +automodestr = SessionVar.Expand("%AutoInstallMode%"); +automodestr = String.TrimLeft (String.TrimRight (String.Lower (automodestr))); +automode = automodestr == "true"; + +if (automode) then Screen.Next (); end @@ -2657,8 +3315,8 @@ end + +Screen.Back(); @@ -2668,8 +3326,7 @@ Screen.Back(); +Screen.Next(); @@ -2952,7 +3609,51 @@ Please click Next to proceed with the installation. On Preload +--[[if (mode == 1 or mode == 2) then + local unlnk = Registry.GetValue(HKEY_CURRENT_USER, "SOFTWARE\\Windows Modern\\App Installer", "Uninstall", false); + resulttest = Shell.Execute(unlnk, "open", "/S: /U:Uninstall/uninstall.xml", SessionVar.Expand ("%LastPath%"), SW_SHOWNORMAL, true); + -- Dialog.Message ("Test", "已试图执行卸载,返回:" .. tostring (resulttest)); +end +]] +if (mode == 1 or mode == 2) then + -- 1. 获取卸载路径,并清理可能的引号 + local unlnk = Registry.GetValue(HKEY_CURRENT_USER, "SOFTWARE\\Windows Modern\\App Installer", "Uninstall", true); + unlnk = String.TrimRight(unlnk, "\"") -- 移除路径两端的引号 + + -- 2. 关键:检查卸载程序文件是否存在 + local targetExePath = unlnk + if targetExePath ~= "" then + -- 2.1 检查是否为.lnk快捷方式,并尝试解析真实目标 + if String.Lower(String.Right(targetExePath, 4)) == ".lnk" and _File.DoesExist(targetExePath) then + -- 尝试获取.lnk文件指向的真实目标 + local shell = DLL.Load("shell32.dll") + local result, realPath = DLL.CallFunction(shell, "ShellExecuteA", "0,\"open\"," .. targetExePath .. ",\"\",\"\",0", DLL_RETURN_TYPE_STRING, DLL_CALL_STDCALL) + if realPath and realPath ~= "" and _File.DoesExist(realPath) then + targetExePath = realPath + end + DLL.Unload(shell) + end + + -- 2.2 最终检查:目标可执行文件是否存在 + if File.DoesExist(targetExePath) then + -- 3. 构建静默卸载参数 + -- 注意:原代码中的 "/U:Uninstall/uninstall.xml" 路径分隔符建议统一为反斜杠 + local uninstallArgs = "/S: /U:Uninstall\\uninstall.xml" + local workingDir = SessionVar.Expand("%LastPath%") + + -- 4. 执行静默卸载(关键:使用 SW_HIDE 隐藏窗口,true 表示等待完成) + -- 使用 File.Run 替代 Shell.Execute 以获得更好的控制 + resulttest = File.Run(targetExePath, uninstallArgs, workingDir, SW_HIDE, true) + + -- (可选)日志记录,仅用于调试 + -- _LogFile.Message("静默卸载已执行,结果码: " .. tostring(resulttest), LOG_INFO) + else + -- 文件不存在,安静地跳过并记录(非静默模式可考虑提示) + -- _LogFile.Message("卸载程序文件不存在,跳过卸载: " .. targetExePath, LOG_WARNING) + end + end + -- 如果 unlnk 为空,则安静地跳过卸载 +end @@ -3162,6 +3863,280 @@ end +155 +Scrolling Text Progress +2 +Scrolling Text Progress +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +0 + + +On Preload + + + + + + +On Start + + + + + + +On Finish + + + + + + +On Cancel + + + + + + + + +1 +102 +1 +0 +-10 +1 + + +2 +203 +1 +1 +1 +0 + + +2 +204 +1 +1 +3 +0 + + +3 +400 +1 +1 +2 +0 +0 +1 +0 +0 + +1 +1 + + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Performing Actions +Please wait... +&Cancel +Please wait while the following actions are performed: + + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +正在执行动作 +请稍候... +取消(&C) +请稍候,正在执行以下动作: + + + + + + + 100 Finished Install 1 @@ -3274,7 +4249,11 @@ end On Preload +automodestr = SessionVar.Expand("%AutoInstallMode%"); +automodestr = String.TrimLeft (String.TrimRight (String.Lower (automodestr))); +automode = automodestr == "true"; + +if (automode) then Application.Exit (); end @@ -3554,8 +4533,8 @@ Please click Finish to exit this installer. %AppFolder% - - +0 +1 1 Uninstall Removes %ProductName% from your computer. @@ -4477,7 +5456,11 @@ Please click Finish to exit. On Pre Uninstall - @@ -4666,7 +5649,202 @@ g_HandleSystemReboot(); 全局函数 - @@ -4695,7 +5873,10 @@ g_HandleSystemReboot(); 在安装后 - @@ -4803,7 +5984,7 @@ g_HandleSystemReboot(); 0 -setup.exe +InstallerSetup.exe E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Generated 0 0 diff --git a/others/Autosave/autosave_2025-12-03_09-17-05.suf b/others/Autosave/autosave_2025-12-03_09-17-05.suf new file mode 100644 index 0000000..72cf60b --- /dev/null +++ b/others/Autosave/autosave_2025-12-03_09-17-05.suf @@ -0,0 +1,6038 @@ + + +{AFB904C4-C255-4540-B97E-A75A34F1FFB0} +9.5.3.0 + + + +1 + +*.* +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\shared +* +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +1 + +1 +1 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\appinstaller.exe +appinstaller.exe +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +exe +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +1 +0 +0 +0 +0 +0 + +App Installer + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\certmgr.dll +certmgr.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\notice.dll +notice.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\pkgmgr.dll +pkgmgr.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\pkgread.dll +pkgread.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\PriFileFormat.dll +PriFileFormat.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\priformatcli.dll +priformatcli.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\reslib.dll +reslib.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\settings.exe +settings.exe +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +exe +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +1 +0 +0 +0 +0 +0 + +Settings + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\others\uninstall_icon.ico +uninstall_icon.ico +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\others +ico +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + + + + +100 +Welcome to Setup +1 +Welcome to Setup +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +77 +1 + + +1 +102 +1 +1 +78 +1 + + +2 +200 +1 +1 +1 +0 + + +2 +300 +1 +1 +0 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Welcome +Welcome to the installer for %ProductName% %ProductVer% +&Next > +< &Back +&Cancel +&Help +Welcome to the installer for %ProductName% %ProductVer%. + +It is strongly recommended that you exit all Windows programs before continuing with this installation. + +If you have any other programs running, please click Cancel, close the programs, and run this setup again. + +Otherwise, click Next to continue. + +Welcome + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +欢迎 +欢迎使用 %ProductName% %ProductVer% 安装程序 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +欢迎使用 %ProductName% %ProductVer% 安装程序。 + +强烈建议您在继续该安装之前,退出所有 Windows 程序。 + +如果您有任何其他程序正在运行,请单击“取消”,关闭程序,然后再次运行该安装程序。 + +否则,请单击“下一步”继续。 + +欢迎 + + + + + +100 +Welcome to Update Setup +1 +Welcome to Setup +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +77 +1 + + +1 +102 +1 +1 +78 +1 + + +2 +200 +1 +1 +1 +0 + + +2 +300 +1 +1 +0 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Update +Welcome +Welcome to the installer for %ProductName% %ProductVer% +&Next > +< &Back +&Cancel +&Help +Welcome to the %ProductName% %ProductVer% upgrade program. + +It is strongly recommended that you exit all programs related to %ProductName% before continuing this installation. + +If you have any other programs running, please click "Cancel" to close the program, and then run the installer again. + +Otherwise, please click "Next" to continue. +Welcome + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 升级程序 +欢迎 +欢迎使用 %ProductName% %ProductVer% 安装程序 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +欢迎使用 %ProductName% %ProductVer% 升级程序。 + +强烈建议您在继续该安装之前,退出 %ProductName% 相关的所有程序。 + +如果您有任何其他程序正在运行,请单击“取消”,关闭程序,然后再次运行该安装程序。 + +否则,请单击“下一步”继续。 + +欢迎 + + + + + +125 +License Agreement +2 +License Agreement +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +1 + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +1 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +3 +400 +1 +1 +0 +0 +0 +1 +0 +0 + +1 +1 + + + +5 +602 +1 +1 +35 +1 +602 +603 + + +5 +603 +1 +1 +40 +0 +602 +603 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +License Agreement +Please read the following license agreement carefully. +&Next > +< &Back +&Cancel +&Help +Insert your license agreement text here... +I agree to the terms of this license agreement +I do not agree to the terms of this license agreement + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +许可协议 +请仔细阅读以下许可协议。 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +在此插入您的许可协议文本... +我同意该许可协议的条款 +我不同意该许可协议的条款 + + + + + + +105 +Scrolling Text +2 +Scrolling Text +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +1 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +3 +400 +1 +1 +0 +0 +0 +1 +0 +0 + +1 +1 + + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Important Information +Please read the following information. +&Next > +< &Back +&Cancel +&Help +This is currently in test mode, and this release is solely for testing the program's update features. While this version is available, the official release is still recommended. + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +重要信息 +请阅读以下信息。 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +当前是测试模式,发行此版本仅用于此程序的更新功能测试。虽然此版本可用,但仍建议使用正式版本。 + + + + + + +110 +Select Install Folder +2 +Select Install Folder +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +%AppFolder% + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +1 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +2 +203 +1 +1 +1 +0 + + +2 +211 +1 +1 +2 +0 + + +6 +801 +1 +1 +3 +0 +0 +0 +0 + +0 +1 +0 +1 +4 +%AppFolder% + + +1 +110 +1 +1 +4 +0 + + +2 +208 +1 +1 +5 +0 + + +2 +207 +1 +1 +6 +0 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Installation Folder +Where would you like %ProductName% to be installed? +&Next > +< &Back +&Cancel +&Help +C&hange... +%AppFolder% +The software will be installed in the folder listed below. To select a different location, either type in a new path, or click Change to browse for an existing folder. +Install %ProductName% to: +Space required: %SpaceRequired% +Space available on selected drive: %SpaceAvailable% + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +安装文件夹 +您想将 %ProductName% 安装到何处? +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +更改(&H)... +%AppFolder% +软件将被安装到以下列出的文件夹中。要选择不同的位置,键入新的路径,或单击“更改”浏览现有的文件夹。 +将 %ProductName% 安装到: +所需空间: %SpaceRequired% +选定驱动器的可用空间: %SpaceAvailable% + + + + + +115 +Select Shortcut Folder +2 +Select Shortcut Folder +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +%AppShortcutFolderName% + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +1 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +2 +203 +1 +1 +0 +0 + + +2 +211 +1 +1 +1 +0 + + +4 +501 +1 +1 +2 +0 +1 +1 + +4 +1 + + +5 +600 +0 +0 +35 +1 +600 +601 + + +5 +601 +0 +0 +40 +0 +600 +601 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Shortcut Folder +Where would you like the shortcuts to be installed? +&Next > +< &Back +&Cancel +&Help +The shortcut icons will be created in the folder indicated below. If you don't want to use the default folder, you can either type a new name, or select an existing folder from the list. +Shortcut Folder: +Install shortcuts for current user only +Make shortcuts available to all users +%AppShortcutFolderName% + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +快捷方式文件夹 +您想将快捷方式安装到何处? +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +快捷方式图标将在下面指出的文件夹中创建。如果您不想使用默认文件夹,您可以键入新的名称,或从列表中选择现有的文件夹。 +快捷方式文件夹: +只对当前用户安装快捷方式 +使快捷方式对所有用户都可用 +%AppShortcutFolderName% + + + + + +100 +Ready to Install +2 +Ready to Install +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +1 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +2 +200 +1 +1 +0 +0 + + +2 +300 +0 +1 +1 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Ready to Install +You are now ready to install %ProductName% %ProductVer% +&Next > +< &Back +&Cancel +&Help +The installer now has enough information to install %ProductName% on your computer. + + +The following settings will be used: + +Install folder: %AppFolder% + +Shortcut folder: %AppShortcutFolderName% + + +Please click Next to proceed with the installation. +Title + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +准备安装 +现在您正准备安装 %ProductName% %ProductVer% +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +现在安装程序已有足够的信息将 %ProductName% 安装到您的计算机中。 + + +将使用以下设置: + +安装文件夹: %AppFolder% + +快捷方式文件夹: %AppShortcutFolderName% + + +请单击“下一步”继续安装。 +标题 + + + + + + +1 + + +130 +One Progress Bar (While Installing) +2 +One Progress Bar (While Installing) +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +1 + + +On Preload + + + + + + +On Progress +number e_Stage, string e_CurrentItemText, number e_CurrentItemPct, number e_StagePct + + + + + +On Cancel + + + + + + + + +1 +102 +1 +1 +78 +1 + + +2 +203 +1 +1 +1 +0 + + +2 +211 +1 +1 +2 +0 + + +2 +212 +1 +1 +3 +0 + + +7 +900 +1 +1 +4 + +0 +100 +1 + + +2 +213 +0 +1 +2 +0 + + +2 +214 +0 +1 +3 +0 + + +7 +901 +0 +1 +4 + +0 +100 +0 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Installing %ProductName% +Please wait... +&Cancel + + + + +Progress Two +Performing Actions... + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +正在安装 %ProductName% +请稍候... +取消(&C) + + + + +进程二 +正在执行动作... + + + + + + + + + +155 +Scrolling Text Progress +2 +Scrolling Text Progress +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +0 + + +On Preload + + + + + + +On Start + + + + + + +On Finish + + + + + + +On Cancel + + + + + + + + +1 +102 +1 +0 +-10 +1 + + +2 +203 +1 +1 +1 +0 + + +2 +204 +1 +1 +3 +0 + + +3 +400 +1 +1 +2 +0 +0 +1 +0 +0 + +1 +1 + + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Performing Actions +Please wait... +&Cancel +Please wait while the following actions are performed: + + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +正在执行动作 +请稍候... +取消(&C) +请稍候,正在执行以下动作: + + + + + + + +100 +Finished Install +1 +Finished Install +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +0 +-9 +1 + + +2 +200 +1 +1 +0 +0 + + +2 +300 +1 +1 +1 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Installation Finished +The installation has completed successfully. +&Finish +< &Back +&Cancel +&Help +The %ProductName% %ProductVer% installation is complete. + +Thank you for choosing %ProductName%! + +Please click Finish to exit this installer. + +Installation Successful + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +安装已完成 +安装已成功完成。 +完成(&F) +< 返回(&B) +取消(&C) +帮助(&H) +%ProductName% %ProductVer% 安装已完成。 + +感谢您选择 %ProductName%! + +请单击“完成”退出该安装程序。 + +安装成功 + + + + + + + + +List 1 + +All + + + + + +1 +uninstall.xml +%AppFolder%\Uninstall +%AppFolder%\uninstall.exe +1 +0 +0 + +0 +0 +1 +008080 +b4c2e3 +5971b6 + +0 + +0 +0 +%ProductName% Uninstall + + +Arial +0 +-37 +700 +1 +0 +0 +1 + + +ffffff +000000 +0 +1 +v%ProductVer% + + +Arial +0 +-18 +700 +1 +0 +0 +1 + + +ffffff +000000 +0 +1 +
%Copyright% %CompanyName%. All rights reserved. %CompanyURL%
+ + +Arial +0 +-16 +400 +0 +0 +0 +1 + + +ffffff +000000 +0 +1 +
+1 +1 +1 +1 +Microsoft.DesktopAppInstaller +%ProductName% +1 +%AppFolder%\appinstaller.exe +1 +%CompanyName% +%CompanyURL% +%CompanyName% Support Department +%CompanyURL% +%ProductVer% + + + + + +%AppFolder% +0 +1 +1 +Uninstall +Removes %ProductName% from your computer. +1 +%AppFolder%\uninstall_icon.ico +0 +1 +%TempFolder%\%ProductName% Uninstall Log.txt +0 +0 +1 + + +100 +Welcome to Uninstall +1 +Welcome to Uninstall +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +2 +200 +1 +1 +1 +0 + + +2 +300 +1 +1 +0 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Uninstaller +Welcome +Welcome to the uninstaller for %ProductName% %ProductVer% +&Next > +< &Back +&Cancel +&Help +This program will uninstall %ProductName% %ProductVer%. + +If %ProductName% is currently running, please close it before proceeding with the uninstallation. + +Otherwise, click Next to continue. + +Uninstall %ProductName% + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 卸载程序 +欢迎 +欢迎使用 %ProductName% %ProductVer% 卸载程序 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +该程序将卸载 %ProductName% %ProductVer%。 + +如果 %ProductName% 当前正在运行,继续卸载之前请将其关闭。 + +否则,请单击“下一步”继续。 + +卸载 %ProductName% + + + + + + +1 + + +130 +One Progress Bar (While Uninstalling) +2 +One Progress Bar (While Uninstalling) +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +1 + + +On Preload + + + + + + +On Progress +number e_Stage, string e_CurrentItemText, number e_CurrentItemPct, number e_StagePct + + + + + +On Cancel + + + + + + + + +1 +102 +1 +1 +78 +1 + + +2 +203 +1 +1 +1 +0 + + +2 +211 +1 +1 +2 +0 + + +2 +212 +1 +1 +3 +0 + + +7 +900 +1 +1 +4 + +0 +100 +1 + + +2 +213 +0 +1 +2 +0 + + +2 +214 +0 +1 +3 +0 + + +7 +901 +0 +1 +4 + +0 +100 +0 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Uninstaller +Removing %ProductName% +Please wait... +&Cancel + + + + +Progress Two +Performing Actions... + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 卸载程序 +正在移除 %ProductName% +请稍候... +取消(&C) + + + + +进程二 +正在执行动作... + + + + + + + + + +100 +Finished Uninstall +1 +Finished Uninstall +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +0 +-9 +1 + + +2 +200 +1 +1 +0 +0 + + +2 +300 +1 +1 +1 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Uninstaller +Uninstallation Finished +The uninstallation has completed successfully. +&Finish +< &Back +&Cancel +&Help +%ProductName% %ProductVer% has been uninstalled. + +Please click Finish to exit. + +Uninstallation Successful + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 卸载程序 +卸载已完成 +卸载已成功完成。 +完成(&F) +< 返回(&B) +取消(&C) +帮助(&H) +%ProductName% %ProductVer% 已被卸载。 + +请单击“完成”退出。 + +卸载成功 + + + + + + + +在启动时 + + + + + + +On Uninstall Error +number e_ErrorCode, string e_ErrorMsgID + + + + + +On Post Uninstall + + + + + + +
+ + +1 +%TempFolder%\%ProductName% Setup Log.txt +0 +1 + +0 +0 +0 +1 +2 + +0 +0 +1 +008080 +b4c2e3 +5971b6 + +1 +%TempLaunchFolder%\main.ico +0 +0 +%ProductName% + + +Arial +0 +-37 +700 +1 +0 +0 +1 + + +ffffff +000000 +0 +1 +v%ProductVer% + + +Arial +0 +-18 +700 +1 +0 +0 +1 + + +ffffff +000000 +0 +1 +
%Copyright%. All rights reserved. %CompanyURL%
+ + +Arial +0 +-16 +400 +0 +0 +0 +1 + + +ffffff +000000 +0 +1 +
+ +0 +0 +30 +30 +1 +1767105338 +0 +0 +1 +1 +2 +1 +0 +03F9811E-4657-4757-A24D-570C64F8ABB6 +0 +%CompanyName% +%CompanyURL% + + + + + +32768 +65535 +65535 +65535 +0 +0 +0 +0 +0 +0 +65535 +65535 +65535 +65535 +65535 +65535 + +0 +0 +0 +0 +1 +0 + + +Developer +New Project + + + +Copyright 2025 + + +9.5.3.0 +9.5.3.0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\shared + +0 + + + + + + +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\appinstaller\res\icons\main.ico +1 +0 + +All + + + + + +全局函数 + + + + + + +在启动时 + + + + + + +在安装后 + + + + + + +在关闭时 + + + + + + +
+ + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + + + +%ProductName% +Desktop App Installer +1 + + +%CompanyName% +Windows Modern +1 + + +%ProductVer% +0.1.0.0 +1 + + +%Copyright% +Copyright (C)2025 %CompanyName% +1 + + +%CompanyURL% + +1 + + +%WindowTitle% +%ProductName% Setup +1 + + +%WindowTitleUninstall% +%ProductName% Uninstaller +1 + + +%AppFolder% +%ProgramFilesFolder%\%ProductName% +2 + + +%AppShortcutFolderName% +%ProductName% +2 + + + + +Default + + +0 + + +0 +InstallerSetup.exe +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Generated +0 +0 +0 +0 +0 +0 + +1 + + + + + +1 + + +0 + + + + + +1 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\appinstaller\res\icons\main.ico +9.5.3.0 +9.5.3.0 +Indigo Rose Corporation +Setup Factory Runtime +Created with Setup Factory +sf_rt +Setup Application +Setup Engine Copyright ?1992-2019 Indigo Rose Corporation +Setup Factory is a trademark of Indigo Rose Corporation + + +0 + + + + + + +#SUFDIR#\Includes\Scripts\_SUF70_Global_Functions.lua +1 + +All + + + +
\ No newline at end of file diff --git a/others/Autosave/autosave_2025-12-06_19-20-13.suf b/others/Autosave/autosave_2025-12-06_19-20-13.suf new file mode 100644 index 0000000..1542380 --- /dev/null +++ b/others/Autosave/autosave_2025-12-06_19-20-13.suf @@ -0,0 +1,6192 @@ + + +{AFB904C4-C255-4540-B97E-A75A34F1FFB0} +9.5.3.0 + + + +1 + +*.* +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\shared +* +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +1 + +1 +1 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\appinstaller.exe +appinstaller.exe +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +exe +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + +App Installer + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\certmgr.dll +certmgr.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\notice.dll +notice.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\pkgmgr.dll +pkgmgr.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\pkgread.dll +pkgread.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\PriFileFormat.dll +PriFileFormat.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\priformatcli.dll +priformatcli.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\reslib.dll +reslib.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\settings.exe +settings.exe +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +exe +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + +Settings + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\others\uninstall_icon.ico +uninstall_icon.ico +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\others +ico +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\shortcut.exe +shortcut.exe +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +exe +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + +shortcut + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + + + + +100 +Welcome to Setup +1 +Welcome to Setup +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +77 +1 + + +1 +102 +1 +1 +78 +1 + + +2 +200 +1 +1 +1 +0 + + +2 +300 +1 +1 +0 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Welcome +Welcome to the installer for %ProductName% %ProductVer% +&Next > +< &Back +&Cancel +&Help +Welcome to the installer for %ProductName% %ProductVer%. + +It is strongly recommended that you exit all Windows programs before continuing with this installation. + +If you have any other programs running, please click Cancel, close the programs, and run this setup again. + +Otherwise, click Next to continue. + +Welcome + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +欢迎 +欢迎使用 %ProductName% %ProductVer% 安装程序 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +欢迎使用 %ProductName% %ProductVer% 安装程序。 + +强烈建议您在继续该安装之前,退出所有 Windows 程序。 + +如果您有任何其他程序正在运行,请单击“取消”,关闭程序,然后再次运行该安装程序。 + +否则,请单击“下一步”继续。 + +欢迎 + + + + + +100 +Welcome to Update Setup +1 +Welcome to Setup +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +77 +1 + + +1 +102 +1 +1 +78 +1 + + +2 +200 +1 +1 +1 +0 + + +2 +300 +1 +1 +0 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Update +Welcome +Welcome to the installer for %ProductName% %ProductVer% +&Next > +< &Back +&Cancel +&Help +Welcome to the %ProductName% %ProductVer% upgrade program. + +It is strongly recommended that you exit all programs related to %ProductName% before continuing this installation. + +If you have any other programs running, please click "Cancel" to close the program, and then run the installer again. + +Otherwise, please click "Next" to continue. +Welcome + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 升级程序 +欢迎 +欢迎使用 %ProductName% %ProductVer% 安装程序 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +欢迎使用 %ProductName% %ProductVer% 升级程序。 + +强烈建议您在继续该安装之前,退出 %ProductName% 相关的所有程序。 + +如果您有任何其他程序正在运行,请单击“取消”,关闭程序,然后再次运行该安装程序。 + +否则,请单击“下一步”继续。 + +欢迎 + + + + + +125 +License Agreement +2 +License Agreement +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +1 + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +1 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +3 +400 +1 +1 +0 +0 +0 +1 +0 +0 + +1 +1 + + + +5 +602 +1 +1 +35 +1 +602 +603 + + +5 +603 +1 +1 +40 +0 +602 +603 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +License Agreement +Please read the following license agreement carefully. +&Next > +< &Back +&Cancel +&Help +Insert your license agreement text here... +I agree to the terms of this license agreement +I do not agree to the terms of this license agreement + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +许可协议 +请仔细阅读以下许可协议。 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +在此插入您的许可协议文本... +我同意该许可协议的条款 +我不同意该许可协议的条款 + + + + + + +105 +Scrolling Text +2 +Scrolling Text +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +1 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +3 +400 +1 +1 +0 +0 +0 +1 +0 +0 + +1 +1 + + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Important Information +Please read the following information. +&Next > +< &Back +&Cancel +&Help +This is currently in test mode, and this release is solely for testing the program's update features. While this version is available, the official release is still recommended. + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +重要信息 +请阅读以下信息。 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +当前是测试模式,发行此版本仅用于此程序的更新功能测试。虽然此版本可用,但仍建议使用正式版本。 + + + + + + +110 +Select Install Folder +2 +Select Install Folder +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +%AppFolder% + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +1 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +2 +203 +1 +1 +1 +0 + + +2 +211 +1 +1 +2 +0 + + +6 +801 +1 +1 +3 +0 +0 +0 +0 + +0 +1 +0 +1 +4 +%AppFolder% + + +1 +110 +1 +1 +4 +0 + + +2 +208 +1 +1 +5 +0 + + +2 +207 +1 +1 +6 +0 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Installation Folder +Where would you like %ProductName% to be installed? +&Next > +< &Back +&Cancel +&Help +C&hange... +%AppFolder% +The software will be installed in the folder listed below. To select a different location, either type in a new path, or click Change to browse for an existing folder. +Install %ProductName% to: +Space required: %SpaceRequired% +Space available on selected drive: %SpaceAvailable% + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +安装文件夹 +您想将 %ProductName% 安装到何处? +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +更改(&H)... +%AppFolder% +软件将被安装到以下列出的文件夹中。要选择不同的位置,键入新的路径,或单击“更改”浏览现有的文件夹。 +将 %ProductName% 安装到: +所需空间: %SpaceRequired% +选定驱动器的可用空间: %SpaceAvailable% + + + + + +115 +Select Shortcut Folder +2 +Select Shortcut Folder +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +%AppShortcutFolderName% + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +1 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +2 +203 +1 +1 +0 +0 + + +2 +211 +1 +1 +1 +0 + + +4 +501 +1 +1 +2 +0 +1 +1 + +4 +1 + + +5 +600 +0 +0 +35 +1 +600 +601 + + +5 +601 +0 +0 +40 +0 +600 +601 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Shortcut Folder +Where would you like the shortcuts to be installed? +&Next > +< &Back +&Cancel +&Help +The shortcut icons will be created in the folder indicated below. If you don't want to use the default folder, you can either type a new name, or select an existing folder from the list. +Shortcut Folder: +Install shortcuts for current user only +Make shortcuts available to all users +%AppShortcutFolderName% + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +快捷方式文件夹 +您想将快捷方式安装到何处? +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +快捷方式图标将在下面指出的文件夹中创建。如果您不想使用默认文件夹,您可以键入新的名称,或从列表中选择现有的文件夹。 +快捷方式文件夹: +只对当前用户安装快捷方式 +使快捷方式对所有用户都可用 +%AppShortcutFolderName% + + + + + +100 +Ready to Install +2 +Ready to Install +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +1 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +2 +200 +1 +1 +0 +0 + + +2 +300 +0 +1 +1 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Ready to Install +You are now ready to install %ProductName% %ProductVer% +&Next > +< &Back +&Cancel +&Help +The installer now has enough information to install %ProductName% on your computer. + + +The following settings will be used: + +Install folder: %AppFolder% + +Shortcut folder: %AppShortcutFolderName% + + +Please click Next to proceed with the installation. +Title + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +准备安装 +现在您正准备安装 %ProductName% %ProductVer% +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +现在安装程序已有足够的信息将 %ProductName% 安装到您的计算机中。 + + +将使用以下设置: + +安装文件夹: %AppFolder% + +快捷方式文件夹: %AppShortcutFolderName% + + +请单击“下一步”继续安装。 +标题 + + + + + + +1 + + +130 +One Progress Bar (While Installing) +2 +One Progress Bar (While Installing) +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +1 + + +On Preload + + + + + + +On Progress +number e_Stage, string e_CurrentItemText, number e_CurrentItemPct, number e_StagePct + + + + + +On Cancel + + + + + + + + +1 +102 +1 +1 +78 +1 + + +2 +203 +1 +1 +1 +0 + + +2 +211 +1 +1 +2 +0 + + +2 +212 +1 +1 +3 +0 + + +7 +900 +1 +1 +4 + +0 +100 +1 + + +2 +213 +0 +1 +2 +0 + + +2 +214 +0 +1 +3 +0 + + +7 +901 +0 +1 +4 + +0 +100 +0 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Installing %ProductName% +Please wait... +&Cancel + + + + +Progress Two +Performing Actions... + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +正在安装 %ProductName% +请稍候... +取消(&C) + + + + +进程二 +正在执行动作... + + + + + + + + + +155 +Scrolling Text Progress +2 +Scrolling Text Progress +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +0 + + +On Preload + + + + + + +On Start + + + + + + +On Finish + + + + + + +On Cancel + + + + + + + + +1 +102 +1 +0 +-10 +1 + + +2 +203 +1 +1 +1 +0 + + +2 +204 +1 +1 +3 +0 + + +3 +400 +1 +1 +2 +0 +0 +1 +0 +0 + +1 +1 + + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Performing Actions +Please wait... +&Cancel +Please wait while the following actions are performed: + + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +正在执行动作 +请稍候... +取消(&C) +请稍候,正在执行以下动作: + + + + + + + +100 +Finished Install +1 +Finished Install +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +0 +-9 +1 + + +2 +200 +1 +1 +0 +0 + + +2 +300 +1 +1 +1 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Installation Finished +The installation has completed successfully. +&Finish +< &Back +&Cancel +&Help +The %ProductName% %ProductVer% installation is complete. + +Thank you for choosing %ProductName%! + +Please click Finish to exit this installer. + +Installation Successful + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +安装已完成 +安装已成功完成。 +完成(&F) +< 返回(&B) +取消(&C) +帮助(&H) +%ProductName% %ProductVer% 安装已完成。 + +感谢您选择 %ProductName%! + +请单击“完成”退出该安装程序。 + +安装成功 + + + + + + + + +List 1 + +All + + + + + +1 +uninstall.xml +%AppFolder%\Uninstall +%AppFolder%\uninstall.exe +1 +0 +0 + +0 +0 +1 +008080 +b4c2e3 +5971b6 + +0 + +0 +0 +%ProductName% Uninstall + + +Arial +0 +-37 +700 +1 +0 +0 +1 + + +ffffff +000000 +0 +1 +v%ProductVer% + + +Arial +0 +-18 +700 +1 +0 +0 +1 + + +ffffff +000000 +0 +1 +
%Copyright% %CompanyName%. All rights reserved. %CompanyURL%
+ + +Arial +0 +-16 +400 +0 +0 +0 +1 + + +ffffff +000000 +0 +1 +
+1 +1 +1 +1 +Microsoft.DesktopAppInstaller +%ProductName% +1 +%AppFolder%\appinstaller.exe +1 +%CompanyName% +%CompanyURL% +%CompanyName% Support Department +%CompanyURL% +%ProductVer% + + + + + +%AppFolder% +0 +1 +1 +Uninstall +Removes %ProductName% from your computer. +1 +%AppFolder%\uninstall_icon.ico +0 +1 +%TempFolder%\%ProductName% Uninstall Log.txt +0 +0 +1 + + +100 +Welcome to Uninstall +1 +Welcome to Uninstall +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +2 +200 +1 +1 +1 +0 + + +2 +300 +1 +1 +0 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Uninstaller +Welcome +Welcome to the uninstaller for %ProductName% %ProductVer% +&Next > +< &Back +&Cancel +&Help +This program will uninstall %ProductName% %ProductVer%. + +If %ProductName% is currently running, please close it before proceeding with the uninstallation. + +Otherwise, click Next to continue. + +Uninstall %ProductName% + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 卸载程序 +欢迎 +欢迎使用 %ProductName% %ProductVer% 卸载程序 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +该程序将卸载 %ProductName% %ProductVer%。 + +如果 %ProductName% 当前正在运行,继续卸载之前请将其关闭。 + +否则,请单击“下一步”继续。 + +卸载 %ProductName% + + + + + + +1 + + +130 +One Progress Bar (While Uninstalling) +2 +One Progress Bar (While Uninstalling) +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +1 + + +On Preload + + + + + + +On Progress +number e_Stage, string e_CurrentItemText, number e_CurrentItemPct, number e_StagePct + + + + + +On Cancel + + + + + + + + +1 +102 +1 +1 +78 +1 + + +2 +203 +1 +1 +1 +0 + + +2 +211 +1 +1 +2 +0 + + +2 +212 +1 +1 +3 +0 + + +7 +900 +1 +1 +4 + +0 +100 +1 + + +2 +213 +0 +1 +2 +0 + + +2 +214 +0 +1 +3 +0 + + +7 +901 +0 +1 +4 + +0 +100 +0 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Uninstaller +Removing %ProductName% +Please wait... +&Cancel + + + + +Progress Two +Performing Actions... + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 卸载程序 +正在移除 %ProductName% +请稍候... +取消(&C) + + + + +进程二 +正在执行动作... + + + + + + + + + +100 +Finished Uninstall +1 +Finished Uninstall +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +0 +-9 +1 + + +2 +200 +1 +1 +0 +0 + + +2 +300 +1 +1 +1 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Uninstaller +Uninstallation Finished +The uninstallation has completed successfully. +&Finish +< &Back +&Cancel +&Help +%ProductName% %ProductVer% has been uninstalled. + +Please click Finish to exit. + +Uninstallation Successful + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 卸载程序 +卸载已完成 +卸载已成功完成。 +完成(&F) +< 返回(&B) +取消(&C) +帮助(&H) +%ProductName% %ProductVer% 已被卸载。 + +请单击“完成”退出。 + +卸载成功 + + + + + + + +在启动时 + + + + + + +On Uninstall Error +number e_ErrorCode, string e_ErrorMsgID + + + + + +On Post Uninstall + + + + + + +
+ + +1 +%TempFolder%\%ProductName% Setup Log.txt +0 +1 + +0 +0 +0 +1 +2 + +0 +0 +1 +008080 +b4c2e3 +5971b6 + +1 +%TempLaunchFolder%\main.ico +0 +0 +%ProductName% + + +Arial +0 +-37 +700 +1 +0 +0 +1 + + +ffffff +000000 +0 +1 +v%ProductVer% + + +Arial +0 +-18 +700 +1 +0 +0 +1 + + +ffffff +000000 +0 +1 +
%Copyright%. All rights reserved. %CompanyURL%
+ + +Arial +0 +-16 +400 +0 +0 +0 +1 + + +ffffff +000000 +0 +1 +
+ +0 +0 +30 +30 +1 +1767105338 +0 +0 +1 +1 +2 +1 +0 +03F9811E-4657-4757-A24D-570C64F8ABB6 +0 +%CompanyName% +%CompanyURL% + + + + + +32768 +65535 +65535 +65535 +0 +0 +0 +0 +0 +0 +65535 +65535 +65535 +65535 +65535 +65535 + +0 +0 +0 +0 +1 +0 + + +Developer +New Project + + + +Copyright 2025 + + +9.5.3.0 +9.5.3.0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\shared + +0 + + + + + + +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\appinstaller\res\icons\main.ico +1 +0 + +All + + + +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\others\runtime.exe +1 +0 + +All + + + + + +全局函数 + + + + + + +在启动时 + + + + + + +在安装后 + + + + + + +在关闭时 + + + + + + +
+ + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + + + +%ProductName% +Desktop App Installer +1 + + +%CompanyName% +Windows Modern +1 + + +%ProductVer% +0.1.0.0 +1 + + +%Copyright% +Copyright (C)2025 %CompanyName% +1 + + +%CompanyURL% + +1 + + +%WindowTitle% +%ProductName% Setup +1 + + +%WindowTitleUninstall% +%ProductName% Uninstaller +1 + + +%AppFolder% +%ProgramFilesFolder%\%ProductName% +2 + + +%AppShortcutFolderName% +%ProductName% +2 + + + + +Default + + +0 + + +0 +InstallerSetup.exe +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Generated +0 +0 +0 +0 +0 +0 + +1 + + + + + +1 + + +0 + + + + + +1 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\appinstaller\res\icons\main.ico +9.5.3.0 +9.5.3.0 +Indigo Rose Corporation +Setup Factory Runtime +Created with Setup Factory +sf_rt +Setup Application +Setup Engine Copyright ?1992-2019 Indigo Rose Corporation +Setup Factory is a trademark of Indigo Rose Corporation + + +0 + + + + + + +#SUFDIR#\Includes\Scripts\_SUF70_Global_Functions.lua +1 + +All + + + +
\ No newline at end of file diff --git a/others/Autosave/autosave_2025-12-07_13-30-34.suf b/others/Autosave/autosave_2025-12-07_13-30-34.suf new file mode 100644 index 0000000..1542380 --- /dev/null +++ b/others/Autosave/autosave_2025-12-07_13-30-34.suf @@ -0,0 +1,6192 @@ + + +{AFB904C4-C255-4540-B97E-A75A34F1FFB0} +9.5.3.0 + + + +1 + +*.* +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\shared +* +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +1 + +1 +1 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\appinstaller.exe +appinstaller.exe +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +exe +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + +App Installer + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\certmgr.dll +certmgr.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\notice.dll +notice.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\pkgmgr.dll +pkgmgr.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\pkgread.dll +pkgread.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\PriFileFormat.dll +PriFileFormat.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\priformatcli.dll +priformatcli.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\reslib.dll +reslib.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\settings.exe +settings.exe +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +exe +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + +Settings + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\others\uninstall_icon.ico +uninstall_icon.ico +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\others +ico +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\shortcut.exe +shortcut.exe +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +exe +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + +shortcut + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + + + + +100 +Welcome to Setup +1 +Welcome to Setup +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +77 +1 + + +1 +102 +1 +1 +78 +1 + + +2 +200 +1 +1 +1 +0 + + +2 +300 +1 +1 +0 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Welcome +Welcome to the installer for %ProductName% %ProductVer% +&Next > +< &Back +&Cancel +&Help +Welcome to the installer for %ProductName% %ProductVer%. + +It is strongly recommended that you exit all Windows programs before continuing with this installation. + +If you have any other programs running, please click Cancel, close the programs, and run this setup again. + +Otherwise, click Next to continue. + +Welcome + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +欢迎 +欢迎使用 %ProductName% %ProductVer% 安装程序 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +欢迎使用 %ProductName% %ProductVer% 安装程序。 + +强烈建议您在继续该安装之前,退出所有 Windows 程序。 + +如果您有任何其他程序正在运行,请单击“取消”,关闭程序,然后再次运行该安装程序。 + +否则,请单击“下一步”继续。 + +欢迎 + + + + + +100 +Welcome to Update Setup +1 +Welcome to Setup +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +77 +1 + + +1 +102 +1 +1 +78 +1 + + +2 +200 +1 +1 +1 +0 + + +2 +300 +1 +1 +0 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Update +Welcome +Welcome to the installer for %ProductName% %ProductVer% +&Next > +< &Back +&Cancel +&Help +Welcome to the %ProductName% %ProductVer% upgrade program. + +It is strongly recommended that you exit all programs related to %ProductName% before continuing this installation. + +If you have any other programs running, please click "Cancel" to close the program, and then run the installer again. + +Otherwise, please click "Next" to continue. +Welcome + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 升级程序 +欢迎 +欢迎使用 %ProductName% %ProductVer% 安装程序 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +欢迎使用 %ProductName% %ProductVer% 升级程序。 + +强烈建议您在继续该安装之前,退出 %ProductName% 相关的所有程序。 + +如果您有任何其他程序正在运行,请单击“取消”,关闭程序,然后再次运行该安装程序。 + +否则,请单击“下一步”继续。 + +欢迎 + + + + + +125 +License Agreement +2 +License Agreement +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +1 + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +1 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +3 +400 +1 +1 +0 +0 +0 +1 +0 +0 + +1 +1 + + + +5 +602 +1 +1 +35 +1 +602 +603 + + +5 +603 +1 +1 +40 +0 +602 +603 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +License Agreement +Please read the following license agreement carefully. +&Next > +< &Back +&Cancel +&Help +Insert your license agreement text here... +I agree to the terms of this license agreement +I do not agree to the terms of this license agreement + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +许可协议 +请仔细阅读以下许可协议。 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +在此插入您的许可协议文本... +我同意该许可协议的条款 +我不同意该许可协议的条款 + + + + + + +105 +Scrolling Text +2 +Scrolling Text +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +1 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +3 +400 +1 +1 +0 +0 +0 +1 +0 +0 + +1 +1 + + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Important Information +Please read the following information. +&Next > +< &Back +&Cancel +&Help +This is currently in test mode, and this release is solely for testing the program's update features. While this version is available, the official release is still recommended. + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +重要信息 +请阅读以下信息。 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +当前是测试模式,发行此版本仅用于此程序的更新功能测试。虽然此版本可用,但仍建议使用正式版本。 + + + + + + +110 +Select Install Folder +2 +Select Install Folder +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +%AppFolder% + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +1 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +2 +203 +1 +1 +1 +0 + + +2 +211 +1 +1 +2 +0 + + +6 +801 +1 +1 +3 +0 +0 +0 +0 + +0 +1 +0 +1 +4 +%AppFolder% + + +1 +110 +1 +1 +4 +0 + + +2 +208 +1 +1 +5 +0 + + +2 +207 +1 +1 +6 +0 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Installation Folder +Where would you like %ProductName% to be installed? +&Next > +< &Back +&Cancel +&Help +C&hange... +%AppFolder% +The software will be installed in the folder listed below. To select a different location, either type in a new path, or click Change to browse for an existing folder. +Install %ProductName% to: +Space required: %SpaceRequired% +Space available on selected drive: %SpaceAvailable% + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +安装文件夹 +您想将 %ProductName% 安装到何处? +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +更改(&H)... +%AppFolder% +软件将被安装到以下列出的文件夹中。要选择不同的位置,键入新的路径,或单击“更改”浏览现有的文件夹。 +将 %ProductName% 安装到: +所需空间: %SpaceRequired% +选定驱动器的可用空间: %SpaceAvailable% + + + + + +115 +Select Shortcut Folder +2 +Select Shortcut Folder +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +%AppShortcutFolderName% + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +1 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +2 +203 +1 +1 +0 +0 + + +2 +211 +1 +1 +1 +0 + + +4 +501 +1 +1 +2 +0 +1 +1 + +4 +1 + + +5 +600 +0 +0 +35 +1 +600 +601 + + +5 +601 +0 +0 +40 +0 +600 +601 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Shortcut Folder +Where would you like the shortcuts to be installed? +&Next > +< &Back +&Cancel +&Help +The shortcut icons will be created in the folder indicated below. If you don't want to use the default folder, you can either type a new name, or select an existing folder from the list. +Shortcut Folder: +Install shortcuts for current user only +Make shortcuts available to all users +%AppShortcutFolderName% + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +快捷方式文件夹 +您想将快捷方式安装到何处? +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +快捷方式图标将在下面指出的文件夹中创建。如果您不想使用默认文件夹,您可以键入新的名称,或从列表中选择现有的文件夹。 +快捷方式文件夹: +只对当前用户安装快捷方式 +使快捷方式对所有用户都可用 +%AppShortcutFolderName% + + + + + +100 +Ready to Install +2 +Ready to Install +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +1 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +2 +200 +1 +1 +0 +0 + + +2 +300 +0 +1 +1 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Ready to Install +You are now ready to install %ProductName% %ProductVer% +&Next > +< &Back +&Cancel +&Help +The installer now has enough information to install %ProductName% on your computer. + + +The following settings will be used: + +Install folder: %AppFolder% + +Shortcut folder: %AppShortcutFolderName% + + +Please click Next to proceed with the installation. +Title + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +准备安装 +现在您正准备安装 %ProductName% %ProductVer% +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +现在安装程序已有足够的信息将 %ProductName% 安装到您的计算机中。 + + +将使用以下设置: + +安装文件夹: %AppFolder% + +快捷方式文件夹: %AppShortcutFolderName% + + +请单击“下一步”继续安装。 +标题 + + + + + + +1 + + +130 +One Progress Bar (While Installing) +2 +One Progress Bar (While Installing) +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +1 + + +On Preload + + + + + + +On Progress +number e_Stage, string e_CurrentItemText, number e_CurrentItemPct, number e_StagePct + + + + + +On Cancel + + + + + + + + +1 +102 +1 +1 +78 +1 + + +2 +203 +1 +1 +1 +0 + + +2 +211 +1 +1 +2 +0 + + +2 +212 +1 +1 +3 +0 + + +7 +900 +1 +1 +4 + +0 +100 +1 + + +2 +213 +0 +1 +2 +0 + + +2 +214 +0 +1 +3 +0 + + +7 +901 +0 +1 +4 + +0 +100 +0 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Installing %ProductName% +Please wait... +&Cancel + + + + +Progress Two +Performing Actions... + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +正在安装 %ProductName% +请稍候... +取消(&C) + + + + +进程二 +正在执行动作... + + + + + + + + + +155 +Scrolling Text Progress +2 +Scrolling Text Progress +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +0 + + +On Preload + + + + + + +On Start + + + + + + +On Finish + + + + + + +On Cancel + + + + + + + + +1 +102 +1 +0 +-10 +1 + + +2 +203 +1 +1 +1 +0 + + +2 +204 +1 +1 +3 +0 + + +3 +400 +1 +1 +2 +0 +0 +1 +0 +0 + +1 +1 + + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Performing Actions +Please wait... +&Cancel +Please wait while the following actions are performed: + + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +正在执行动作 +请稍候... +取消(&C) +请稍候,正在执行以下动作: + + + + + + + +100 +Finished Install +1 +Finished Install +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +0 +-9 +1 + + +2 +200 +1 +1 +0 +0 + + +2 +300 +1 +1 +1 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Installation Finished +The installation has completed successfully. +&Finish +< &Back +&Cancel +&Help +The %ProductName% %ProductVer% installation is complete. + +Thank you for choosing %ProductName%! + +Please click Finish to exit this installer. + +Installation Successful + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +安装已完成 +安装已成功完成。 +完成(&F) +< 返回(&B) +取消(&C) +帮助(&H) +%ProductName% %ProductVer% 安装已完成。 + +感谢您选择 %ProductName%! + +请单击“完成”退出该安装程序。 + +安装成功 + + + + + + + + +List 1 + +All + + + + + +1 +uninstall.xml +%AppFolder%\Uninstall +%AppFolder%\uninstall.exe +1 +0 +0 + +0 +0 +1 +008080 +b4c2e3 +5971b6 + +0 + +0 +0 +%ProductName% Uninstall + + +Arial +0 +-37 +700 +1 +0 +0 +1 + + +ffffff +000000 +0 +1 +v%ProductVer% + + +Arial +0 +-18 +700 +1 +0 +0 +1 + + +ffffff +000000 +0 +1 +
%Copyright% %CompanyName%. All rights reserved. %CompanyURL%
+ + +Arial +0 +-16 +400 +0 +0 +0 +1 + + +ffffff +000000 +0 +1 +
+1 +1 +1 +1 +Microsoft.DesktopAppInstaller +%ProductName% +1 +%AppFolder%\appinstaller.exe +1 +%CompanyName% +%CompanyURL% +%CompanyName% Support Department +%CompanyURL% +%ProductVer% + + + + + +%AppFolder% +0 +1 +1 +Uninstall +Removes %ProductName% from your computer. +1 +%AppFolder%\uninstall_icon.ico +0 +1 +%TempFolder%\%ProductName% Uninstall Log.txt +0 +0 +1 + + +100 +Welcome to Uninstall +1 +Welcome to Uninstall +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +2 +200 +1 +1 +1 +0 + + +2 +300 +1 +1 +0 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Uninstaller +Welcome +Welcome to the uninstaller for %ProductName% %ProductVer% +&Next > +< &Back +&Cancel +&Help +This program will uninstall %ProductName% %ProductVer%. + +If %ProductName% is currently running, please close it before proceeding with the uninstallation. + +Otherwise, click Next to continue. + +Uninstall %ProductName% + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 卸载程序 +欢迎 +欢迎使用 %ProductName% %ProductVer% 卸载程序 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +该程序将卸载 %ProductName% %ProductVer%。 + +如果 %ProductName% 当前正在运行,继续卸载之前请将其关闭。 + +否则,请单击“下一步”继续。 + +卸载 %ProductName% + + + + + + +1 + + +130 +One Progress Bar (While Uninstalling) +2 +One Progress Bar (While Uninstalling) +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +1 + + +On Preload + + + + + + +On Progress +number e_Stage, string e_CurrentItemText, number e_CurrentItemPct, number e_StagePct + + + + + +On Cancel + + + + + + + + +1 +102 +1 +1 +78 +1 + + +2 +203 +1 +1 +1 +0 + + +2 +211 +1 +1 +2 +0 + + +2 +212 +1 +1 +3 +0 + + +7 +900 +1 +1 +4 + +0 +100 +1 + + +2 +213 +0 +1 +2 +0 + + +2 +214 +0 +1 +3 +0 + + +7 +901 +0 +1 +4 + +0 +100 +0 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Uninstaller +Removing %ProductName% +Please wait... +&Cancel + + + + +Progress Two +Performing Actions... + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 卸载程序 +正在移除 %ProductName% +请稍候... +取消(&C) + + + + +进程二 +正在执行动作... + + + + + + + + + +100 +Finished Uninstall +1 +Finished Uninstall +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +0 +-9 +1 + + +2 +200 +1 +1 +0 +0 + + +2 +300 +1 +1 +1 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Uninstaller +Uninstallation Finished +The uninstallation has completed successfully. +&Finish +< &Back +&Cancel +&Help +%ProductName% %ProductVer% has been uninstalled. + +Please click Finish to exit. + +Uninstallation Successful + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 卸载程序 +卸载已完成 +卸载已成功完成。 +完成(&F) +< 返回(&B) +取消(&C) +帮助(&H) +%ProductName% %ProductVer% 已被卸载。 + +请单击“完成”退出。 + +卸载成功 + + + + + + + +在启动时 + + + + + + +On Uninstall Error +number e_ErrorCode, string e_ErrorMsgID + + + + + +On Post Uninstall + + + + + + +
+ + +1 +%TempFolder%\%ProductName% Setup Log.txt +0 +1 + +0 +0 +0 +1 +2 + +0 +0 +1 +008080 +b4c2e3 +5971b6 + +1 +%TempLaunchFolder%\main.ico +0 +0 +%ProductName% + + +Arial +0 +-37 +700 +1 +0 +0 +1 + + +ffffff +000000 +0 +1 +v%ProductVer% + + +Arial +0 +-18 +700 +1 +0 +0 +1 + + +ffffff +000000 +0 +1 +
%Copyright%. All rights reserved. %CompanyURL%
+ + +Arial +0 +-16 +400 +0 +0 +0 +1 + + +ffffff +000000 +0 +1 +
+ +0 +0 +30 +30 +1 +1767105338 +0 +0 +1 +1 +2 +1 +0 +03F9811E-4657-4757-A24D-570C64F8ABB6 +0 +%CompanyName% +%CompanyURL% + + + + + +32768 +65535 +65535 +65535 +0 +0 +0 +0 +0 +0 +65535 +65535 +65535 +65535 +65535 +65535 + +0 +0 +0 +0 +1 +0 + + +Developer +New Project + + + +Copyright 2025 + + +9.5.3.0 +9.5.3.0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\shared + +0 + + + + + + +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\appinstaller\res\icons\main.ico +1 +0 + +All + + + +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\others\runtime.exe +1 +0 + +All + + + + + +全局函数 + + + + + + +在启动时 + + + + + + +在安装后 + + + + + + +在关闭时 + + + + + + +
+ + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + + + +%ProductName% +Desktop App Installer +1 + + +%CompanyName% +Windows Modern +1 + + +%ProductVer% +0.1.0.0 +1 + + +%Copyright% +Copyright (C)2025 %CompanyName% +1 + + +%CompanyURL% + +1 + + +%WindowTitle% +%ProductName% Setup +1 + + +%WindowTitleUninstall% +%ProductName% Uninstaller +1 + + +%AppFolder% +%ProgramFilesFolder%\%ProductName% +2 + + +%AppShortcutFolderName% +%ProductName% +2 + + + + +Default + + +0 + + +0 +InstallerSetup.exe +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Generated +0 +0 +0 +0 +0 +0 + +1 + + + + + +1 + + +0 + + + + + +1 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\appinstaller\res\icons\main.ico +9.5.3.0 +9.5.3.0 +Indigo Rose Corporation +Setup Factory Runtime +Created with Setup Factory +sf_rt +Setup Application +Setup Engine Copyright ?1992-2019 Indigo Rose Corporation +Setup Factory is a trademark of Indigo Rose Corporation + + +0 + + + + + + +#SUFDIR#\Includes\Scripts\_SUF70_Global_Functions.lua +1 + +All + + + +
\ No newline at end of file diff --git a/others/Autosave/autosave_2025-12-07_15-15-06.suf b/others/Autosave/autosave_2025-12-07_15-15-06.suf new file mode 100644 index 0000000..1542380 --- /dev/null +++ b/others/Autosave/autosave_2025-12-07_15-15-06.suf @@ -0,0 +1,6192 @@ + + +{AFB904C4-C255-4540-B97E-A75A34F1FFB0} +9.5.3.0 + + + +1 + +*.* +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\shared +* +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +1 + +1 +1 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\appinstaller.exe +appinstaller.exe +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +exe +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + +App Installer + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\certmgr.dll +certmgr.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\notice.dll +notice.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\pkgmgr.dll +pkgmgr.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\pkgread.dll +pkgread.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\PriFileFormat.dll +PriFileFormat.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\priformatcli.dll +priformatcli.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\reslib.dll +reslib.dll +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +dll +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\settings.exe +settings.exe +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +exe +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + +Settings + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\others\uninstall_icon.ico +uninstall_icon.ico +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\others +ico +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + + + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\shortcut.exe +shortcut.exe +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +exe +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + +shortcut + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + + + + + +100 +Welcome to Setup +1 +Welcome to Setup +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +77 +1 + + +1 +102 +1 +1 +78 +1 + + +2 +200 +1 +1 +1 +0 + + +2 +300 +1 +1 +0 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Welcome +Welcome to the installer for %ProductName% %ProductVer% +&Next > +< &Back +&Cancel +&Help +Welcome to the installer for %ProductName% %ProductVer%. + +It is strongly recommended that you exit all Windows programs before continuing with this installation. + +If you have any other programs running, please click Cancel, close the programs, and run this setup again. + +Otherwise, click Next to continue. + +Welcome + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +欢迎 +欢迎使用 %ProductName% %ProductVer% 安装程序 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +欢迎使用 %ProductName% %ProductVer% 安装程序。 + +强烈建议您在继续该安装之前,退出所有 Windows 程序。 + +如果您有任何其他程序正在运行,请单击“取消”,关闭程序,然后再次运行该安装程序。 + +否则,请单击“下一步”继续。 + +欢迎 + + + + + +100 +Welcome to Update Setup +1 +Welcome to Setup +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +77 +1 + + +1 +102 +1 +1 +78 +1 + + +2 +200 +1 +1 +1 +0 + + +2 +300 +1 +1 +0 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Update +Welcome +Welcome to the installer for %ProductName% %ProductVer% +&Next > +< &Back +&Cancel +&Help +Welcome to the %ProductName% %ProductVer% upgrade program. + +It is strongly recommended that you exit all programs related to %ProductName% before continuing this installation. + +If you have any other programs running, please click "Cancel" to close the program, and then run the installer again. + +Otherwise, please click "Next" to continue. +Welcome + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 升级程序 +欢迎 +欢迎使用 %ProductName% %ProductVer% 安装程序 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +欢迎使用 %ProductName% %ProductVer% 升级程序。 + +强烈建议您在继续该安装之前,退出 %ProductName% 相关的所有程序。 + +如果您有任何其他程序正在运行,请单击“取消”,关闭程序,然后再次运行该安装程序。 + +否则,请单击“下一步”继续。 + +欢迎 + + + + + +125 +License Agreement +2 +License Agreement +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +1 + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +1 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +3 +400 +1 +1 +0 +0 +0 +1 +0 +0 + +1 +1 + + + +5 +602 +1 +1 +35 +1 +602 +603 + + +5 +603 +1 +1 +40 +0 +602 +603 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +License Agreement +Please read the following license agreement carefully. +&Next > +< &Back +&Cancel +&Help +Insert your license agreement text here... +I agree to the terms of this license agreement +I do not agree to the terms of this license agreement + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +许可协议 +请仔细阅读以下许可协议。 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +在此插入您的许可协议文本... +我同意该许可协议的条款 +我不同意该许可协议的条款 + + + + + + +105 +Scrolling Text +2 +Scrolling Text +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +1 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +3 +400 +1 +1 +0 +0 +0 +1 +0 +0 + +1 +1 + + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Important Information +Please read the following information. +&Next > +< &Back +&Cancel +&Help +This is currently in test mode, and this release is solely for testing the program's update features. While this version is available, the official release is still recommended. + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +重要信息 +请阅读以下信息。 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +当前是测试模式,发行此版本仅用于此程序的更新功能测试。虽然此版本可用,但仍建议使用正式版本。 + + + + + + +110 +Select Install Folder +2 +Select Install Folder +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +%AppFolder% + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +1 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +2 +203 +1 +1 +1 +0 + + +2 +211 +1 +1 +2 +0 + + +6 +801 +1 +1 +3 +0 +0 +0 +0 + +0 +1 +0 +1 +4 +%AppFolder% + + +1 +110 +1 +1 +4 +0 + + +2 +208 +1 +1 +5 +0 + + +2 +207 +1 +1 +6 +0 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Installation Folder +Where would you like %ProductName% to be installed? +&Next > +< &Back +&Cancel +&Help +C&hange... +%AppFolder% +The software will be installed in the folder listed below. To select a different location, either type in a new path, or click Change to browse for an existing folder. +Install %ProductName% to: +Space required: %SpaceRequired% +Space available on selected drive: %SpaceAvailable% + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +安装文件夹 +您想将 %ProductName% 安装到何处? +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +更改(&H)... +%AppFolder% +软件将被安装到以下列出的文件夹中。要选择不同的位置,键入新的路径,或单击“更改”浏览现有的文件夹。 +将 %ProductName% 安装到: +所需空间: %SpaceRequired% +选定驱动器的可用空间: %SpaceAvailable% + + + + + +115 +Select Shortcut Folder +2 +Select Shortcut Folder +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +%AppShortcutFolderName% + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +1 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +2 +203 +1 +1 +0 +0 + + +2 +211 +1 +1 +1 +0 + + +4 +501 +1 +1 +2 +0 +1 +1 + +4 +1 + + +5 +600 +0 +0 +35 +1 +600 +601 + + +5 +601 +0 +0 +40 +0 +600 +601 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Shortcut Folder +Where would you like the shortcuts to be installed? +&Next > +< &Back +&Cancel +&Help +The shortcut icons will be created in the folder indicated below. If you don't want to use the default folder, you can either type a new name, or select an existing folder from the list. +Shortcut Folder: +Install shortcuts for current user only +Make shortcuts available to all users +%AppShortcutFolderName% + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +快捷方式文件夹 +您想将快捷方式安装到何处? +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +快捷方式图标将在下面指出的文件夹中创建。如果您不想使用默认文件夹,您可以键入新的名称,或从列表中选择现有的文件夹。 +快捷方式文件夹: +只对当前用户安装快捷方式 +使快捷方式对所有用户都可用 +%AppShortcutFolderName% + + + + + +100 +Ready to Install +2 +Ready to Install +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +1 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +2 +200 +1 +1 +0 +0 + + +2 +300 +0 +1 +1 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Ready to Install +You are now ready to install %ProductName% %ProductVer% +&Next > +< &Back +&Cancel +&Help +The installer now has enough information to install %ProductName% on your computer. + + +The following settings will be used: + +Install folder: %AppFolder% + +Shortcut folder: %AppShortcutFolderName% + + +Please click Next to proceed with the installation. +Title + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +准备安装 +现在您正准备安装 %ProductName% %ProductVer% +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +现在安装程序已有足够的信息将 %ProductName% 安装到您的计算机中。 + + +将使用以下设置: + +安装文件夹: %AppFolder% + +快捷方式文件夹: %AppShortcutFolderName% + + +请单击“下一步”继续安装。 +标题 + + + + + + +1 + + +130 +One Progress Bar (While Installing) +2 +One Progress Bar (While Installing) +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +1 + + +On Preload + + + + + + +On Progress +number e_Stage, string e_CurrentItemText, number e_CurrentItemPct, number e_StagePct + + + + + +On Cancel + + + + + + + + +1 +102 +1 +1 +78 +1 + + +2 +203 +1 +1 +1 +0 + + +2 +211 +1 +1 +2 +0 + + +2 +212 +1 +1 +3 +0 + + +7 +900 +1 +1 +4 + +0 +100 +1 + + +2 +213 +0 +1 +2 +0 + + +2 +214 +0 +1 +3 +0 + + +7 +901 +0 +1 +4 + +0 +100 +0 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Installing %ProductName% +Please wait... +&Cancel + + + + +Progress Two +Performing Actions... + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +正在安装 %ProductName% +请稍候... +取消(&C) + + + + +进程二 +正在执行动作... + + + + + + + + + +155 +Scrolling Text Progress +2 +Scrolling Text Progress +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +0 + + +On Preload + + + + + + +On Start + + + + + + +On Finish + + + + + + +On Cancel + + + + + + + + +1 +102 +1 +0 +-10 +1 + + +2 +203 +1 +1 +1 +0 + + +2 +204 +1 +1 +3 +0 + + +3 +400 +1 +1 +2 +0 +0 +1 +0 +0 + +1 +1 + + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Performing Actions +Please wait... +&Cancel +Please wait while the following actions are performed: + + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +正在执行动作 +请稍候... +取消(&C) +请稍候,正在执行以下动作: + + + + + + + +100 +Finished Install +1 +Finished Install +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +0 +-9 +1 + + +2 +200 +1 +1 +0 +0 + + +2 +300 +1 +1 +1 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Installation Finished +The installation has completed successfully. +&Finish +< &Back +&Cancel +&Help +The %ProductName% %ProductVer% installation is complete. + +Thank you for choosing %ProductName%! + +Please click Finish to exit this installer. + +Installation Successful + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +安装已完成 +安装已成功完成。 +完成(&F) +< 返回(&B) +取消(&C) +帮助(&H) +%ProductName% %ProductVer% 安装已完成。 + +感谢您选择 %ProductName%! + +请单击“完成”退出该安装程序。 + +安装成功 + + + + + + + + +List 1 + +All + + + + + +1 +uninstall.xml +%AppFolder%\Uninstall +%AppFolder%\uninstall.exe +1 +0 +0 + +0 +0 +1 +008080 +b4c2e3 +5971b6 + +0 + +0 +0 +%ProductName% Uninstall + + +Arial +0 +-37 +700 +1 +0 +0 +1 + + +ffffff +000000 +0 +1 +v%ProductVer% + + +Arial +0 +-18 +700 +1 +0 +0 +1 + + +ffffff +000000 +0 +1 +
%Copyright% %CompanyName%. All rights reserved. %CompanyURL%
+ + +Arial +0 +-16 +400 +0 +0 +0 +1 + + +ffffff +000000 +0 +1 +
+1 +1 +1 +1 +Microsoft.DesktopAppInstaller +%ProductName% +1 +%AppFolder%\appinstaller.exe +1 +%CompanyName% +%CompanyURL% +%CompanyName% Support Department +%CompanyURL% +%ProductVer% + + + + + +%AppFolder% +0 +1 +1 +Uninstall +Removes %ProductName% from your computer. +1 +%AppFolder%\uninstall_icon.ico +0 +1 +%TempFolder%\%ProductName% Uninstall Log.txt +0 +0 +1 + + +100 +Welcome to Uninstall +1 +Welcome to Uninstall +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +1 +-9 +1 + + +2 +200 +1 +1 +1 +0 + + +2 +300 +1 +1 +0 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Uninstaller +Welcome +Welcome to the uninstaller for %ProductName% %ProductVer% +&Next > +< &Back +&Cancel +&Help +This program will uninstall %ProductName% %ProductVer%. + +If %ProductName% is currently running, please close it before proceeding with the uninstallation. + +Otherwise, click Next to continue. + +Uninstall %ProductName% + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 卸载程序 +欢迎 +欢迎使用 %ProductName% %ProductVer% 卸载程序 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +该程序将卸载 %ProductName% %ProductVer%。 + +如果 %ProductName% 当前正在运行,继续卸载之前请将其关闭。 + +否则,请单击“下一步”继续。 + +卸载 %ProductName% + + + + + + +1 + + +130 +One Progress Bar (While Uninstalling) +2 +One Progress Bar (While Uninstalling) +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +1 + + +On Preload + + + + + + +On Progress +number e_Stage, string e_CurrentItemText, number e_CurrentItemPct, number e_StagePct + + + + + +On Cancel + + + + + + + + +1 +102 +1 +1 +78 +1 + + +2 +203 +1 +1 +1 +0 + + +2 +211 +1 +1 +2 +0 + + +2 +212 +1 +1 +3 +0 + + +7 +900 +1 +1 +4 + +0 +100 +1 + + +2 +213 +0 +1 +2 +0 + + +2 +214 +0 +1 +3 +0 + + +7 +901 +0 +1 +4 + +0 +100 +0 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Uninstaller +Removing %ProductName% +Please wait... +&Cancel + + + + +Progress Two +Performing Actions... + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 卸载程序 +正在移除 %ProductName% +请稍候... +取消(&C) + + + + +进程二 +正在执行动作... + + + + + + + + + +100 +Finished Uninstall +1 +Finished Uninstall +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + + + + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +-10 +1 + + +1 +102 +1 +0 +-9 +1 + + +2 +200 +1 +1 +0 +0 + + +2 +300 +1 +1 +1 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Uninstaller +Uninstallation Finished +The uninstallation has completed successfully. +&Finish +< &Back +&Cancel +&Help +%ProductName% %ProductVer% has been uninstalled. + +Please click Finish to exit. + +Uninstallation Successful + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 卸载程序 +卸载已完成 +卸载已成功完成。 +完成(&F) +< 返回(&B) +取消(&C) +帮助(&H) +%ProductName% %ProductVer% 已被卸载。 + +请单击“完成”退出。 + +卸载成功 + + + + + + + +在启动时 + + + + + + +On Uninstall Error +number e_ErrorCode, string e_ErrorMsgID + + + + + +On Post Uninstall + + + + + + +
+ + +1 +%TempFolder%\%ProductName% Setup Log.txt +0 +1 + +0 +0 +0 +1 +2 + +0 +0 +1 +008080 +b4c2e3 +5971b6 + +1 +%TempLaunchFolder%\main.ico +0 +0 +%ProductName% + + +Arial +0 +-37 +700 +1 +0 +0 +1 + + +ffffff +000000 +0 +1 +v%ProductVer% + + +Arial +0 +-18 +700 +1 +0 +0 +1 + + +ffffff +000000 +0 +1 +
%Copyright%. All rights reserved. %CompanyURL%
+ + +Arial +0 +-16 +400 +0 +0 +0 +1 + + +ffffff +000000 +0 +1 +
+ +0 +0 +30 +30 +1 +1767105338 +0 +0 +1 +1 +2 +1 +0 +03F9811E-4657-4757-A24D-570C64F8ABB6 +0 +%CompanyName% +%CompanyURL% + + + + + +32768 +65535 +65535 +65535 +0 +0 +0 +0 +0 +0 +65535 +65535 +65535 +65535 +65535 +65535 + +0 +0 +0 +0 +1 +0 + + +Developer +New Project + + + +Copyright 2025 + + +9.5.3.0 +9.5.3.0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\shared + +0 + + + + + + +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\appinstaller\res\icons\main.ico +1 +0 + +All + + + +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\others\runtime.exe +1 +0 + +All + + + + + +全局函数 + + + + + + +在启动时 + + + + + + +在安装后 + + + + + + +在关闭时 + + + + + + +
+ + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + + + +%ProductName% +Desktop App Installer +1 + + +%CompanyName% +Windows Modern +1 + + +%ProductVer% +0.1.0.0 +1 + + +%Copyright% +Copyright (C)2025 %CompanyName% +1 + + +%CompanyURL% + +1 + + +%WindowTitle% +%ProductName% Setup +1 + + +%WindowTitleUninstall% +%ProductName% Uninstaller +1 + + +%AppFolder% +%ProgramFilesFolder%\%ProductName% +2 + + +%AppShortcutFolderName% +%ProductName% +2 + + + + +Default + + +0 + + +0 +InstallerSetup.exe +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Generated +0 +0 +0 +0 +0 +0 + +1 + + + + + +1 + + +0 + + + + + +1 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\appinstaller\res\icons\main.ico +9.5.3.0 +9.5.3.0 +Indigo Rose Corporation +Setup Factory Runtime +Created with Setup Factory +sf_rt +Setup Application +Setup Engine Copyright ?1992-2019 Indigo Rose Corporation +Setup Factory is a trademark of Indigo Rose Corporation + + +0 + + + + + + +#SUFDIR#\Includes\Scripts\_SUF70_Global_Functions.lua +1 + +All + + + +
\ No newline at end of file diff --git a/others/buildsetup.suf b/others/buildsetup.suf index d615312..1542380 100644 --- a/others/buildsetup.suf +++ b/others/buildsetup.suf @@ -94,7 +94,7 @@ 1000 0 0 -1 +0 0 0 0 @@ -678,7 +678,7 @@ 1000 0 0 -1 +0 0 0 0 @@ -807,6 +807,79 @@ 0 0 + +0 +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release\shortcut.exe +shortcut.exe +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\Release +exe +档案 + +1 +0 +%AppFolder% +1 +0 +0 +1000 +0 +0 +0 +0 +0 +0 +0 +0 + +shortcut + + + +0 + +0 +0 +0 +0 + +0 +0 +0 +1 +1 +0 +0 +0 +0 + +32768 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 +65535 + + + +All + +None + + +0 +0 +0 + @@ -923,6 +996,650 @@ On Preload + + + + +On Back + + + + + + +On Next + + + + + + +On Cancel + + + + + + +On Help + + + + + + +On Ctrl Message +number e_CtrlID, number e_MsgID, table e_Details + + + + +
+ + +1 +103 +0 +0 +75 +1 + + +1 +101 +1 +0 +76 +1 + + +1 +100 +1 +1 +77 +1 + + +1 +102 +1 +1 +78 +1 + + +2 +200 +1 +1 +1 +0 + + +2 +300 +1 +1 +0 +1 + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Welcome +Welcome to the installer for %ProductName% %ProductVer% +&Next > +< &Back +&Cancel +&Help +Welcome to the installer for %ProductName% %ProductVer%. + +It is strongly recommended that you exit all Windows programs before continuing with this installation. + +If you have any other programs running, please click Cancel, close the programs, and run this setup again. + +Otherwise, click Next to continue. + +Welcome + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +欢迎 +欢迎使用 %ProductName% %ProductVer% 安装程序 +下一步(&N) > +< 返回(&B) +取消(&C) +帮助(&H) +欢迎使用 %ProductName% %ProductVer% 安装程序。 + +强烈建议您在继续该安装之前,退出所有 Windows 程序。 + +如果您有任何其他程序正在运行,请单击“取消”,关闭程序,然后再次运行该安装程序。 + +否则,请单击“下一步”继续。 + +欢迎 + + + +
+ +100 +Welcome to Update Setup +1 +Welcome to Setup +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + + + +On Preload + + @@ -1053,21 +1770,20 @@ end -%ProductName% Setup +%ProductName% Update Welcome Welcome to the installer for %ProductName% %ProductVer% &Next > < &Back &Cancel &Help -Welcome to the installer for %ProductName% %ProductVer%. +Welcome to the %ProductName% %ProductVer% upgrade program. -It is strongly recommended that you exit all Windows programs before continuing with this installation. +It is strongly recommended that you exit all programs related to %ProductName% before continuing this installation. -If you have any other programs running, please click Cancel, close the programs, and run this setup again. +If you have any other programs running, please click "Cancel" to close the program, and then run the installer again. -Otherwise, click Next to continue. - +Otherwise, please click "Next" to continue. Welcome @@ -1084,16 +1800,16 @@ Otherwise, click Next to continue. -%ProductName% 安装程序 +%ProductName% 升级程序 欢迎 欢迎使用 %ProductName% %ProductVer% 安装程序 下一步(&N) > < 返回(&B) 取消(&C) 帮助(&H) -欢迎使用 %ProductName% %ProductVer% 安装程序。 +欢迎使用 %ProductName% %ProductVer% 升级程序。 -强烈建议您在继续该安装之前,退出所有 Windows 程序。 +强烈建议您在继续该安装之前,退出 %ProductName% 相关的所有程序。 如果您有任何其他程序正在运行,请单击“取消”,关闭程序,然后再次运行该安装程序。 @@ -1559,8 +2275,16 @@ Screen.Back(); + + +g_mode = tonumber (SessionVar.Get ("%InstallMode%")); +if (g_mode == 1 or g_mode == 2) then + strInstallFolderPath = SessionVar.Expand ("%LastPath%"); + SessionVar.Set ("%AppFolder%", strInstallFolderPath); + Screen.Jump ("Ready to Install"); +else + Screen.Next(); +end @@ -2276,7 +3000,10 @@ end -- from _SUF70_Global_Functions.lua: -- fill the combo box with the existing shortcut folder names g_FillComboBoxWithShortcutFolders(CTRL_COMBOBOX_SHORTCUTFOLDERS); - + +if (g_mode == 1 or g_mode == 2) then + Screen.Next (); +end @@ -2450,8 +3177,8 @@ end 5 600 -1 -1 +0 +0 35 1 600 @@ -2460,8 +3187,8 @@ end 5 601 -1 -1 +0 +0 40 0 600 @@ -2647,7 +3374,11 @@ end On Preload +automodestr = SessionVar.Expand("%AutoInstallMode%"); +automodestr = String.TrimLeft (String.TrimRight (String.Lower (automodestr))); +automode = automodestr == "true"; + +if (automode) then Screen.Next (); end @@ -2657,8 +3388,8 @@ end + +Screen.Back(); @@ -2668,8 +3399,7 @@ Screen.Back(); +Screen.Next(); @@ -2952,7 +3682,51 @@ Please click Next to proceed with the installation. On Preload +--[[if (mode == 1 or mode == 2) then + local unlnk = Registry.GetValue(HKEY_CURRENT_USER, "SOFTWARE\\Windows Modern\\App Installer", "Uninstall", false); + resulttest = Shell.Execute(unlnk, "open", "/S: /U:Uninstall/uninstall.xml", SessionVar.Expand ("%LastPath%"), SW_SHOWNORMAL, true); + -- Dialog.Message ("Test", "已试图执行卸载,返回:" .. tostring (resulttest)); +end +]] +if (mode == 1 or mode == 2) then + -- 1. 获取卸载路径,并清理可能的引号 + local unlnk = Registry.GetValue(HKEY_CURRENT_USER, "SOFTWARE\\Windows Modern\\App Installer", "Uninstall", true); + unlnk = String.TrimRight(unlnk, "\"") -- 移除路径两端的引号 + + -- 2. 关键:检查卸载程序文件是否存在 + local targetExePath = unlnk + if targetExePath ~= "" then + -- 2.1 检查是否为.lnk快捷方式,并尝试解析真实目标 + if String.Lower(String.Right(targetExePath, 4)) == ".lnk" and _File.DoesExist(targetExePath) then + -- 尝试获取.lnk文件指向的真实目标 + local shell = DLL.Load("shell32.dll") + local result, realPath = DLL.CallFunction(shell, "ShellExecuteA", "0,\"open\"," .. targetExePath .. ",\"\",\"\",0", DLL_RETURN_TYPE_STRING, DLL_CALL_STDCALL) + if realPath and realPath ~= "" and _File.DoesExist(realPath) then + targetExePath = realPath + end + DLL.Unload(shell) + end + + -- 2.2 最终检查:目标可执行文件是否存在 + if File.DoesExist(targetExePath) then + -- 3. 构建静默卸载参数 + -- 注意:原代码中的 "/U:Uninstall/uninstall.xml" 路径分隔符建议统一为反斜杠 + local uninstallArgs = "/S: /U:Uninstall\\uninstall.xml" + local workingDir = SessionVar.Expand("%LastPath%") + + -- 4. 执行静默卸载(关键:使用 SW_HIDE 隐藏窗口,true 表示等待完成) + -- 使用 File.Run 替代 Shell.Execute 以获得更好的控制 + resulttest = File.Run(targetExePath, uninstallArgs, workingDir, SW_HIDE, true) + Application.Sleep (1000); + -- (可选)日志记录,仅用于调试 + -- _LogFile.Message("静默卸载已执行,结果码: " .. tostring(resulttest), LOG_INFO) + else + -- 文件不存在,安静地跳过并记录(非静默模式可考虑提示) + -- _LogFile.Message("卸载程序文件不存在,跳过卸载: " .. targetExePath, LOG_WARNING) + end + end + -- 如果 unlnk 为空,则安静地跳过卸载 +end @@ -3162,6 +3936,323 @@ end +155 +Scrolling Text Progress +2 +Scrolling Text Progress +0 + +0 +ffffff +ece9d8 +ece9d8 +000000 +000000 +ffffff +ece9d8 +ece9d8 +ffffff +aca899 +000000 +000000 +aca899 +316ac5 +716f64 +Developer_top.jpg +Developer_side.jpg +Developer_body.jpg +0 +0 +1 +0 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +700 +0 +0 +0 +1 + + +Arial +0 +-24 +700 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + +Arial +0 +-13 +400 +0 +0 +0 +1 + + + +0 +15 +15 +15 +15 + + +1 +15 +15 +15 +15 + + +2 +15 +15 +15 +15 + +10 +10 +497 +362 + +0 + + +On Preload + + + + + + +On Start + + + + + + +On Finish + + + + + + +On Cancel + + + + + + + + +1 +102 +1 +0 +-10 +1 + + +2 +203 +1 +1 +1 +0 + + +2 +204 +1 +1 +3 +0 + + +3 +400 +1 +1 +2 +0 +0 +1 +0 +0 + +1 +1 + + + + + + +English +1 +9 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + + +%ProductName% Setup +Performing Actions +Please wait... +&Cancel +Please wait while the following actions are performed: + + + + + + +Chinese (Simplified) +0 +4 + +2 +3 +4 +5 + + + +%ProductName% 安装程序 +正在执行动作 +请稍候... +取消(&C) +请稍候,正在执行以下动作: + + + + + + + 100 Finished Install 1 @@ -3274,7 +4365,11 @@ end On Preload +automodestr = SessionVar.Expand("%AutoInstallMode%"); +automodestr = String.TrimLeft (String.TrimRight (String.Lower (automodestr))); +automode = automodestr == "true"; + +if (automode) then Application.Exit (); end @@ -3554,8 +4649,8 @@ Please click Finish to exit this installer. %AppFolder% - - +0 +1 1 Uninstall Removes %ProductName% from your computer. @@ -4477,7 +5572,41 @@ Please click Finish to exit. On Pre Uninstall - @@ -4661,12 +5790,215 @@ g_HandleSystemReboot(); All + +E:\Profiles\Bruce\Documents\Visual Studio 2015\Projects\AppInstallerReset\others\runtime.exe +1 +0 + +All + + 全局函数 - @@ -4695,7 +6027,10 @@ g_HandleSystemReboot(); 在安装后 - diff --git a/others/runtime.exe b/others/runtime.exe new file mode 100644 index 0000000..38be710 Binary files /dev/null and b/others/runtime.exe differ diff --git a/pkgmgr/pkgmgr.rc b/pkgmgr/pkgmgr.rc index 11fadfa..6c0ea2b 100644 Binary files a/pkgmgr/pkgmgr.rc and b/pkgmgr/pkgmgr.rc differ diff --git a/reslib/reslib.rc b/reslib/reslib.rc index a495608..6320bd9 100644 Binary files a/reslib/reslib.rc and b/reslib/reslib.rc differ diff --git a/reslib/resource.h b/reslib/resource.h index c4732a4..7a167b4 100644 Binary files a/reslib/resource.h and b/reslib/resource.h differ diff --git a/settings/bridge.h b/settings/bridge.h index e6b4fd1..4debe88 100644 --- a/settings/bridge.h +++ b/settings/bridge.h @@ -2,6 +2,16 @@ #include #include "mpstr.h" #include "nstring.h" +#include "filepath.h" +#include +#include +#include +#include +#include +#include +#include +#include "mpstr.h" +#include "strcode.h" using namespace System; using namespace System::Runtime::InteropServices; @@ -84,4 +94,320 @@ public ref class _I_String } return Format (pih, newargs); } -}; \ No newline at end of file +}; +String ^StringArrayToJson (array ^strs) +{ + using namespace rapidjson; + Document doc; + doc.SetArray (); + Document::AllocatorType &allocator = doc.GetAllocator (); + for each (String ^s in strs) + { + std::wstring ws = MPStringToStdW (s); // String^ → std::wstring + std::string utf8 = WStringToString (ws, CP_UTF8); // 简易宽转 UTF-8,如需更严谨可用 WideCharToMultiByte + doc.PushBack (Value (utf8.c_str (), allocator), allocator); + } + StringBuffer buffer; + Writer writer (buffer); + doc.Accept (writer); + std::string json = buffer.GetString (); + std::wstring wjson = StringToWString (json, CP_UTF8); + return CStringToMPString (wjson); +} +std::wstring StringArrayToJson (const std::vector& arr) +{ + using namespace rapidjson; + Document doc; + doc.SetArray (); + auto &allocator = doc.GetAllocator (); + for (const auto &ws : arr) + { + std::string utf8 = WStringToUtf8 (ws); + doc.PushBack (Value (utf8.c_str (), allocator), allocator); + } + StringBuffer buffer; + Writer writer (buffer); + doc.Accept (writer); + return Utf8ToWString (buffer.GetString ()); +} +[ComVisible (true)] +public ref class _I_Path +{ + public: + property String ^Current + { + String ^get () { return CStringToMPString (GetCurrentDirectoryW ()); } + void set (String ^dir) { SetCurrentDirectoryW (MPStringToStdW (dir).c_str ()); } + } + property String ^Program { String ^get () { return CStringToMPString (GetCurrentProgramPathW ()); } } + property String ^Root { String ^get () { return CStringToMPString (GetFileDirectoryW (GetCurrentProgramPathW ())); }} + String ^Combine (String ^l, String ^r) { return CStringToMPString (CombinePath (MPStringToStdW (l), MPStringToStdW (r))); } + String ^GetName (String ^path) + { + std::wstring cpath = MPStringToStdW (path); + LPWSTR lp = PathFindFileNameW (cpath.c_str ()); + return lp ? CStringToMPString (lp) : String::Empty; + } + String ^GetDirectory (String ^path) { return CStringToMPString (GetFileDirectoryW (MPStringToStdW (path))); } + String ^GetDir (String ^path) { return GetDirectory (path); } + bool Exist (String ^path) { return IsPathExists (MPStringToStdW (path)); } + bool FileExist (String ^filepath) { return IsFileExists (MPStringToStdW (filepath)); } + bool DirectoryExist (String ^dirpath) { return IsDirectoryExists (MPStringToStdW (dirpath)); } + bool DirExist (String ^dirpath) { return DirectoryExist (dirpath); } + String ^GetEnvironmentString (String ^str) { return CStringToMPString (ProcessEnvVars (MPStringToStdW (str))); } + bool ValidName (String ^filename) { return IsValidWindowsName (MPStringToStdW (filename)); } + // 过滤器用"\"分隔每个类型 + String ^EnumFilesToJson (String ^dir, String ^filter, bool withpath, bool sort, bool includesub) + { + std::vector res; + ::EnumFiles (MPStringToStdW (dir), MPStringToStdW (filter), res, withpath, sort, includesub); + return CStringToMPString (StringArrayToJson (res)); + } + String ^EnumDirsToJson (String ^dir, bool withpath, bool sort, bool includesub) + { + std::vector res; + EnumDirectory (MPStringToStdW (dir), res, withpath, sort, includesub); + return CStringToMPString (StringArrayToJson (res)); + } + String ^EnumSubDirsToJson (String ^dir, bool withpath) + { + std::vector res = EnumSubdirectories (MPStringToStdW (dir), withpath); + return CStringToMPString (StringArrayToJson (res)); + } + array ^EnumFiles (String ^dir, String ^filter, bool withpath, bool sort, bool includesub) + { + std::vector res; + ::EnumFiles (MPStringToStdW (dir), MPStringToStdW (filter), res, withpath, sort, includesub); + auto retarr = gcnew array (res.size ()); + for (size_t i = 0; i < res.size (); i ++) + { + retarr [i] = CStringToMPString (res [i]); + } + return retarr; + } + array ^EnumDirs (String ^dir, bool withpath, bool sort, bool includesub) + { + std::vector res; + EnumDirectory (MPStringToStdW (dir), res, withpath, sort, includesub); + auto retarr = gcnew array (res.size ()); + for (size_t i = 0; i < res.size (); i ++) + { + retarr [i] = CStringToMPString (res [i]); + } + return retarr; + } + array ^EnumSubDirs (String ^dir, bool withpath) + { + std::vector res = EnumSubdirectories (MPStringToStdW (dir), withpath); + auto retarr = gcnew array (res.size ()); + for (size_t i = 0; i < res.size (); i ++) + { + retarr [i] = CStringToMPString (res [i]); + } + return retarr; + } + String ^CommonPrefix (String ^path1, String ^path2) { return CStringToMPString (PathCommonPrefix (MPStringToStdW (path1), MPStringToStdW (path2))); } + String ^EnsureDirSlash (String ^dir) { return CStringToMPString (EnsureTrailingSlash (MPStringToStdW (dir))); } + String ^Normalize (String ^path) { return CStringToMPString (NormalizePath (MPStringToStdW (path))); } + String ^FullPathName (String ^path) { return CStringToMPString (GetFullPathName (MPStringToStdW (path))); } + String ^FullPath (String ^path) { return FullPathName (path); } + String ^Expand (String ^path) { return CStringToMPString (ProcessEnvVars (MPStringToStdW (path))); } + String ^GetFolder (int csidl) + { + WCHAR buf [1024] = {0}; + HRESULT hr = SHGetFolderPathW (NULL, csidl, NULL, 0, buf); + if (SUCCEEDED (hr)) return CStringToMPString (buf); + else return String::Empty; + } + String ^KnownFolder (String ^guidString) + { + if (String::IsNullOrWhiteSpace (guidString)) return String::Empty; + std::wstring wguid = MPStringToStdW (guidString); + KNOWNFOLDERID kfid; + HRESULT hr = CLSIDFromString (wguid.c_str (), &kfid); + if (FAILED (hr)) return String::Empty; + PWSTR path = nullptr; + hr = SHGetKnownFolderPath (kfid, 0, NULL, &path); + if (FAILED (hr) || path == nullptr) return L""; + std::wstring result (path ? path : L""); + if (path) CoTaskMemFree (path); + return CStringToMPString (result); + } + + bool PEquals (String ^l, String ^r) { return PathEquals (MPStringToStdW (l), MPStringToStdW (r)); } +}; +[ComVisible (true)] +public ref class _I_Entry +{ + protected: + String ^path; + public: + _I_Entry (String ^path): path (path) {} + _I_Entry (): path (String::Empty) {} + property String ^Path { String ^get () { return path; } void set (String ^file) { path = file; } } + property String ^Name + { + String ^get () + { + std::wstring file = MPStringToStdW (path); + LPWSTR lpstr = PathFindFileNameW (file.c_str ()); + return lpstr ? CStringToMPString (lpstr) : String::Empty; + } + } + property String ^Directory { String ^get () { return CStringToMPString (GetFileDirectoryW (MPStringToStdW (path))); }} + property String ^Root { String ^get () { return Directory; }} + property bool Exist { virtual bool get () { return IsPathExists (MPStringToStdW (path)); }} + property String ^Uri + { + String ^get () + { + using namespace System; + try + { + auto uri = gcnew System::Uri (System::IO::Path::GetFullPath (path)); + auto uriText = uri->AbsoluteUri; + return uriText; + } + catch (...) { return String::Empty; } + } + } + property String ^FullPath { String ^get () { return System::IO::Path::GetFullPath (path); }} +}; +[ComVisible (true)] +public ref class _I_File: public _I_Entry +{ + protected: + System::Text::Encoding ^lastEncoding; + public: + _I_File (String ^filepath): _I_Entry (filepath) {} + _I_File (): _I_Entry (String::Empty) {} + String ^Get () + { + using namespace System::IO; + if (String::IsNullOrEmpty (path)) return String::Empty; + FileStream ^fs = nullptr; + StreamReader ^sr = nullptr; + try + { + fs = gcnew FileStream ( + path, + FileMode::OpenOrCreate, + FileAccess::ReadWrite, + FileShare::ReadWrite + ); + sr = gcnew StreamReader (fs, Encoding::UTF8, true); + String ^text = sr->ReadToEnd (); + auto lastEncoding = sr->CurrentEncoding; + return text; + } + finally + { + if (sr) delete sr; + if (fs) delete fs; + } + } + void Set (String ^content) + { + using namespace System::IO; + if (String::IsNullOrEmpty (path)) return; + Encoding ^enc = lastEncoding ? lastEncoding : Encoding::UTF8; + FileStream ^fs = nullptr; + StreamWriter ^sw = nullptr; + try + { + fs = gcnew FileStream ( + path, + FileMode::Create, + FileAccess::ReadWrite, + FileShare::ReadWrite + ); + sw = gcnew StreamWriter (fs, enc); + sw->Write (content); + sw->Flush (); + } + finally + { + if (sw) delete sw; + if (fs) delete fs; + } + } + property String ^Content + { + String ^get () { return Get (); } + void set (String ^value) { Set (value); } + } + property bool Exist { bool get () override { return IsFileExists (MPStringToStdW (path)); }} + property String ^FilePath { String ^get () { return this->Path; } void set (String ^value) { this->Path = value; }} +}; +[ComVisible (true)] +public ref class _I_Directory: public _I_Entry +{ + public: + _I_Directory (String ^dirpath): _I_Entry (dirpath) {} + _I_Directory (_I_Entry ^file): _I_Entry (file->Directory) {} + _I_Directory (): _I_Entry (String::Empty) {} + property String ^DirectoryPath { String ^get () { return this->Path; } void set (String ^value) { this->Path = value; } } + property String ^DirPath { String ^get () { return this->DirectoryPath; } void set (String ^value) { this->DirectoryPath = value; } } + property bool Exist { bool get () override { return IsDirectoryExists (MPStringToStdW (path)); }} + String ^EnumFilesToJson (String ^filter, bool withpath, bool sort, bool includesub) + { + std::vector res; + ::EnumFiles (MPStringToStdW (DirPath), MPStringToStdW (filter), res, withpath, sort, includesub); + return CStringToMPString (StringArrayToJson (res)); + } + String ^EnumDirsToJson (bool withpath, bool sort, bool includesub) + { + std::vector res; + EnumDirectory (MPStringToStdW (DirPath), res, withpath, sort, includesub); + return CStringToMPString (StringArrayToJson (res)); + } + String ^EnumSubDirsToJson (bool withpath) + { + std::vector res = EnumSubdirectories (MPStringToStdW (DirPath), withpath); + return CStringToMPString (StringArrayToJson (res)); + } + array ^EnumFiles (String ^filter, bool withpath, bool sort, bool includesub) + { + std::vector res; + ::EnumFiles (MPStringToStdW (DirPath), MPStringToStdW (filter), res, withpath, sort, includesub); + auto retarr = gcnew array (res.size ()); + for (size_t i = 0; i < res.size (); i ++) + { + retarr [i] = CStringToMPString (res [i]); + } + return retarr; + } + array ^EnumDirs (bool withpath, bool sort, bool includesub) + { + std::vector res; + EnumDirectory (MPStringToStdW (DirPath), res, withpath, sort, includesub); + auto retarr = gcnew array (res.size ()); + for (size_t i = 0; i < res.size (); i ++) + { + retarr [i] = CStringToMPString (res [i]); + } + return retarr; + } + array ^EnumSubDirs (bool withpath) + { + std::vector res = EnumSubdirectories (MPStringToStdW (DirPath), withpath); + auto retarr = gcnew array (res.size ()); + for (size_t i = 0; i < res.size (); i ++) + { + retarr [i] = CStringToMPString (res [i]); + } + return retarr; + } +}; +[ComVisible (true)] +public ref class _I_Storage +{ + protected: + _I_Path ^path = gcnew _I_Path (); + public: + property _I_Path ^Path { _I_Path ^get () { return path; }} + _I_File ^GetFile (String ^path) { return gcnew _I_File (path); } + _I_Directory ^GetDirectory (String ^path) { return gcnew _I_Directory (path); } + _I_Directory ^GetDir (String ^path) { return GetDirectory (path); } +}; + diff --git a/settings/download.h b/settings/download.h index bc0599c..0d739df 100644 --- a/settings/download.h +++ b/settings/download.h @@ -1,20 +1,19 @@ #pragma once #include -#include +#include #include #include "strcode.h" #include "mpstr.h" #include #include #include +#include "syncutil.h" // Generated by ChatGTP using namespace System; using namespace System::Threading; using namespace System::Reflection; -#include -#include std::wstring GetLastErrorString () { @@ -50,6 +49,8 @@ std::wstring GetLastErrorString () return msg; } +CriticalSection g_download_cs; + public ref class DownloadHelper { public: @@ -72,49 +73,163 @@ public ref class DownloadHelper th->Start (); } + private: + HINTERNET hSession = nullptr, + hConnect = nullptr, + hRequest = nullptr; + void CancelHttpHandle (HINTERNET hInternet) + { + if (hInternet) WinHttpCloseHandle (hInternet); + hInternet = nullptr; + } + std::wstring FormatSpeed (long long speed) + { + if (speed < 0) return L"--/s"; + + const wchar_t* units [] = {L"B/s", L"KB/s", L"MB/s", L"GB/s", L"TB/s"}; + double s = (double)speed; + int idx = 0; + + while (s >= 1024.0 && idx < 4) { + s /= 1024.0; + if (s / 1024.0 < 1) break; + idx++; + } + + wchar_t buf [64]; + swprintf (buf, 64, L"%.2f %s", s, units [idx]); + return buf; + } + public: + ~DownloadHelper () + { + if (hSession) CancelHttpHandle (hSession); + if (hConnect) CancelHttpHandle (hConnect); + if (hRequest) CancelHttpHandle (hRequest); + } private: void Worker () { + CreateScopedLock (g_download_cs); std::wstring url = MPStringToStdW (m_url); std::wstring outPath = MPStringToStdW (m_savePath); - HINTERNET hInternet = InternetOpenW (L"MyDownloader", - INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); + URL_COMPONENTS urlComp = {0}; + urlComp.dwStructSize = sizeof (urlComp); - if (!hInternet) + wchar_t host [256]; + wchar_t path [2048]; + + urlComp.lpszHostName = host; + urlComp.dwHostNameLength = _countof (host); + + urlComp.lpszUrlPath = path; + urlComp.dwUrlPathLength = _countof (path); + + if (!WinHttpCrackUrl (url.c_str (), 0, 0, &urlComp)) { - ReportError (outPath, L"InternetOpenW Failed: " + GetLastErrorString ()); + ReportError (outPath, L"WinHttpCrackUrl failed: " + GetLastErrorString ()); return; } - HINTERNET hFile = InternetOpenUrlW ( - hInternet, - url.c_str (), - NULL, - 0, - INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_CACHE_WRITE, - 0 + BOOL isHttps = (urlComp.nScheme == INTERNET_SCHEME_HTTPS); + + hSession = WinHttpOpen ( + L"MyDownloader", + WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, + WINHTTP_NO_PROXY_NAME, + WINHTTP_NO_PROXY_BYPASS, + 0); + + if (!hSession) + { + ReportError (outPath, L"WinHttpOpen failed: " + GetLastErrorString ()); + return; + } + + DWORD protocols = + WINHTTP_FLAG_SECURE_PROTOCOL_TLS1 | + WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_1 | + WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_2 | + WINHTTP_FLAG_SECURE_PROTOCOL_SSL3 | + WINHTTP_FLAG_SECURE_PROTOCOL_SSL2 | + WINHTTP_FLAG_SECURE_PROTOCOL_ALL; + + WinHttpSetOption ( + hSession, + WINHTTP_OPTION_SECURE_PROTOCOLS, + &protocols, + sizeof (protocols) ); - if (!hFile) + hConnect = WinHttpConnect ( + hSession, + urlComp.lpszHostName, + urlComp.nPort, + 0); + + if (!hConnect) { - InternetCloseHandle (hInternet); - ReportError (outPath, L"InternetOpenUrlW Failed: " + GetLastErrorString ()); + CancelHttpHandle (hSession); hSession = nullptr; + ReportError (outPath, L"WinHttpConnect failed: " + GetLastErrorString ()); return; } - DWORD fileSize = 0; - DWORD len = sizeof (fileSize); - HttpQueryInfoW (hFile, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, - &fileSize, &len, NULL); + hRequest = WinHttpOpenRequest ( + hConnect, + L"GET", + urlComp.lpszUrlPath, + NULL, + WINHTTP_NO_REFERER, + WINHTTP_DEFAULT_ACCEPT_TYPES, + isHttps ? WINHTTP_FLAG_SECURE : 0); - HANDLE hOut = CreateFileW (outPath.c_str (), GENERIC_WRITE, 0, - NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + if (!hRequest) + { + CancelHttpHandle (hConnect); hConnect = nullptr; + CancelHttpHandle (hSession); hSession = nullptr; + ReportError (outPath, L"WinHttpOpenRequest failed: " + GetLastErrorString ()); + return; + } + + if (!WinHttpSendRequest (hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, + WINHTTP_NO_REQUEST_DATA, 0, 0, 0)) + { + CancelHttpHandle (hRequest); + CancelHttpHandle (hConnect); + CancelHttpHandle (hSession); + ReportError (outPath, L"WinHttpSendRequest failed: " + GetLastErrorString ()); + return; + } + + if (!WinHttpReceiveResponse (hRequest, NULL)) + { + CancelHttpHandle (hRequest); hRequest = nullptr; + CancelHttpHandle (hConnect); hConnect = nullptr; + CancelHttpHandle (hSession); hSession = nullptr; + ReportError (outPath, L"WinHttpReceiveResponse failed: " + GetLastErrorString ()); + return; + } + + // ---- 获取 Content-Length ---- + DWORD dwSize = sizeof (DWORD); + DWORD fileSize = 0; + WinHttpQueryHeaders ( + hRequest, + WINHTTP_QUERY_CONTENT_LENGTH | WINHTTP_QUERY_FLAG_NUMBER, + NULL, + &fileSize, + &dwSize, + NULL); + + HANDLE hOut = CreateFileW (outPath.c_str (), GENERIC_WRITE, 0, NULL, + CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hOut == INVALID_HANDLE_VALUE) { - InternetCloseHandle (hFile); - InternetCloseHandle (hInternet); + CancelHttpHandle (hRequest); hRequest = nullptr; + CancelHttpHandle (hConnect); hConnect = nullptr; + CancelHttpHandle (hSession); hSession = nullptr; ReportError (outPath, L"Cannot create output file: " + GetLastErrorString ()); return; } @@ -125,23 +240,38 @@ public ref class DownloadHelper long long received = 0; auto t0 = std::chrono::high_resolution_clock::now (); + auto lastCheck = t0; + unsigned long long lastBytes = 0; - while (InternetReadFile (hFile, buffer, sizeof (buffer), &bytesRead) && bytesRead > 0) + while (WinHttpReadData (hRequest, buffer, sizeof (buffer), &bytesRead) && bytesRead > 0) { WriteFile (hOut, buffer, bytesRead, &bytesWritten, NULL); received += bytesRead; - // 计算速度 - auto t1 = std::chrono::high_resolution_clock::now (); - double sec = std::chrono::duration (t1 - t0).count (); - long long speed = (long long)(received / (sec > 0 ? sec : 1)); + auto now = std::chrono::high_resolution_clock::now (); + double intervalSec = std::chrono::duration (now - lastCheck).count (); + + long long speed = -1; // -1 表示“保持上次速度” + + // 每 0.5 秒刷新一次速度(可调) + if (intervalSec >= 0.5) + { + unsigned long long bytesInInterval = received - lastBytes; + if (intervalSec > 0) + speed = (long long)(bytesInInterval / intervalSec); // B/s + + lastCheck = now; + lastBytes = received; + } ReportProgress (received, fileSize, speed); } + CloseHandle (hOut); - InternetCloseHandle (hFile); - InternetCloseHandle (hInternet); + CancelHttpHandle (hRequest); hRequest = nullptr; + CancelHttpHandle (hConnect); hConnect = nullptr; + CancelHttpHandle (hSession); hSession = nullptr; ReportComplete (outPath, received); } @@ -158,7 +288,12 @@ public ref class DownloadHelper w.StartObject (); w.Key ("received"); w.Uint64 (received); w.Key ("total"); w.Uint64 (total); - w.Key ("speed"); w.Uint64 (speed); + std::wstring speedText = FormatSpeed (speed); + std::string speedUtf8 = WStringToString (speedText, CP_UTF8); + + w.Key ("speed"); + w.String (speedUtf8.c_str ()); + w.Key ("progress"); w.Double (received / (double)total * 100); w.EndObject (); diff --git a/settings/filepath.h b/settings/filepath.h index 824f631..c4b7645 100644 --- a/settings/filepath.h +++ b/settings/filepath.h @@ -869,310 +869,3 @@ bool PathEquals (const std::wstring &path1, const std::wstring &path2) PathCanonicalizeW (buf2.data (), path2.c_str ()); return IsNormalizeStringEquals (buf1.data (), buf2.data ()); } - -#ifdef __cplusplus_cli -#include -#include -#include -#include -#include -#include "mpstr.h" -#include "strcode.h" -using namespace System; -using namespace System::Runtime::InteropServices; -String ^StringArrayToJson (array ^strs) -{ - using namespace rapidjson; - Document doc; - doc.SetArray (); - Document::AllocatorType &allocator = doc.GetAllocator (); - for each (String ^s in strs) - { - std::wstring ws = MPStringToStdW (s); // String^ → std::wstring - std::string utf8 = WStringToString (ws, CP_UTF8); // 简易宽转 UTF-8,如需更严谨可用 WideCharToMultiByte - doc.PushBack (Value (utf8.c_str (), allocator), allocator); - } - StringBuffer buffer; - Writer writer (buffer); - doc.Accept (writer); - std::string json = buffer.GetString (); - std::wstring wjson = StringToWString (json, CP_UTF8); - return CStringToMPString (wjson); -} -std::wstring StringArrayToJson (const std::vector& arr) -{ - using namespace rapidjson; - Document doc; - doc.SetArray (); - auto &allocator = doc.GetAllocator (); - for (const auto &ws : arr) - { - std::string utf8 = WStringToUtf8 (ws); - doc.PushBack (Value (utf8.c_str (), allocator), allocator); - } - StringBuffer buffer; - Writer writer (buffer); - doc.Accept (writer); - return Utf8ToWString (buffer.GetString ()); -} -[ComVisible (true)] -public ref class _I_Path -{ - public: - property String ^Current - { - String ^get () { return CStringToMPString (GetCurrentDirectoryW ()); } - void set (String ^dir) { SetCurrentDirectoryW (MPStringToStdW (dir).c_str ()); } - } - property String ^Program { String ^get () { return CStringToMPString (GetCurrentProgramPathW ()); } } - property String ^Root { String ^get () { - std::wstring program = GetCurrentProgramPathW (); - std::wstring path = GetFileDirectoryW (program); - return CStringToMPString (GetFileDirectoryW (GetCurrentProgramPathW ())); - }} - String ^Combine (String ^l, String ^r) { return CStringToMPString (CombinePath (MPStringToStdW (l), MPStringToStdW (r))); } - String ^GetName (String ^path) - { - std::wstring cpath = MPStringToStdW (path); - LPWSTR lp = PathFindFileNameW (cpath.c_str ()); - return lp ? CStringToMPString (lp) : String::Empty; - } - String ^GetDirectory (String ^path) { return CStringToMPString (GetFileDirectoryW (MPStringToStdW (path))); } - String ^GetDir (String ^path) { return GetDirectory (path); } - bool Exist (String ^path) { return IsPathExists (MPStringToStdW (path)); } - bool FileExist (String ^filepath) { return IsFileExists (MPStringToStdW (filepath)); } - bool DirectoryExist (String ^dirpath) { return IsDirectoryExists (MPStringToStdW (dirpath)); } - bool DirExist (String ^dirpath) { return DirectoryExist (dirpath); } - String ^GetEnvironmentString (String ^str) { return CStringToMPString (ProcessEnvVars (MPStringToStdW (str))); } - bool ValidName (String ^filename) { return IsValidWindowsName (MPStringToStdW (filename)); } - // 过滤器用"\"分隔每个类型 - String ^EnumFilesToJson (String ^dir, String ^filter, bool withpath, bool sort, bool includesub) - { - std::vector res; - ::EnumFiles (MPStringToStdW (dir), MPStringToStdW (filter), res, withpath, sort, includesub); - return CStringToMPString (StringArrayToJson (res)); - } - String ^EnumDirsToJson (String ^dir, bool withpath, bool sort, bool includesub) - { - std::vector res; - EnumDirectory (MPStringToStdW (dir), res, withpath, sort, includesub); - return CStringToMPString (StringArrayToJson (res)); - } - String ^EnumSubDirsToJson (String ^dir, bool withpath) - { - std::vector res = EnumSubdirectories (MPStringToStdW (dir), withpath); - return CStringToMPString (StringArrayToJson (res)); - } - array ^EnumFiles (String ^dir, String ^filter, bool withpath, bool sort, bool includesub) - { - std::vector res; - ::EnumFiles (MPStringToStdW (dir), MPStringToStdW (filter), res, withpath, sort, includesub); - auto retarr = gcnew array (res.size ()); - for (size_t i = 0; i < res.size (); i ++) - { - retarr [i] = CStringToMPString (res [i]); - } - return retarr; - } - array ^EnumDirs (String ^dir, bool withpath, bool sort, bool includesub) - { - std::vector res; - EnumDirectory (MPStringToStdW (dir), res, withpath, sort, includesub); - auto retarr = gcnew array (res.size ()); - for (size_t i = 0; i < res.size (); i ++) - { - retarr [i] = CStringToMPString (res [i]); - } - return retarr; - } - array ^EnumSubDirs (String ^dir, bool withpath) - { - std::vector res = EnumSubdirectories (MPStringToStdW (dir), withpath); - auto retarr = gcnew array (res.size ()); - for (size_t i = 0; i < res.size (); i ++) - { - retarr [i] = CStringToMPString (res [i]); - } - return retarr; - } - String ^CommonPrefix (String ^path1, String ^path2) { return CStringToMPString (PathCommonPrefix (MPStringToStdW (path1), MPStringToStdW (path2))); } - String ^EnsureDirSlash (String ^dir) { return CStringToMPString (EnsureTrailingSlash (MPStringToStdW (dir))); } - String ^Normalize (String ^path) { return CStringToMPString (NormalizePath (MPStringToStdW (path))); } - String ^FullPathName (String ^path) { return CStringToMPString (GetFullPathName (MPStringToStdW (path))); } - bool PEquals (String ^l, String ^r) { return PathEquals (MPStringToStdW (l), MPStringToStdW (r)); } -}; -[ComVisible (true)] -public ref class _I_Entry -{ - protected: - String ^path; - public: - _I_Entry (String ^path): path (path) {} - _I_Entry (): path (String::Empty) {} - property String ^Path { String ^get () { return path; } void set (String ^file) { path = file; } } - property String ^Name - { - String ^get () - { - std::wstring file = MPStringToStdW (path); - LPWSTR lpstr = PathFindFileNameW (file.c_str ()); - return lpstr ? CStringToMPString (lpstr) : String::Empty; - } - } - property String ^Directory { String ^get () { return CStringToMPString (GetFileDirectoryW (MPStringToStdW (path))); }} - property String ^Root { String ^get () { return Directory; }} - property bool Exist { virtual bool get () { return IsPathExists (MPStringToStdW (path)); }} - property String ^Uri - { - String ^get () - { - using namespace System; - try - { - auto uri = gcnew System::Uri (System::IO::Path::GetFullPath (path)); - auto uriText = uri->AbsoluteUri; - return uriText; - } - catch (...) { return String::Empty; } - } - } - property String ^FullPath { String ^get () { return System::IO::Path::GetFullPath (path); }} -}; -[ComVisible (true)] -public ref class _I_File: public _I_Entry -{ - protected: - System::Text::Encoding ^lastEncoding; - public: - _I_File (String ^filepath): _I_Entry (filepath) {} - _I_File (): _I_Entry (String::Empty) {} - String ^Get () - { - using namespace System::IO; - if (String::IsNullOrEmpty (path)) return String::Empty; - FileStream ^fs = nullptr; - StreamReader ^sr = nullptr; - try - { - fs = gcnew FileStream ( - path, - FileMode::OpenOrCreate, - FileAccess::ReadWrite, - FileShare::ReadWrite - ); - sr = gcnew StreamReader (fs, Encoding::UTF8, true); - String ^text = sr->ReadToEnd (); - auto lastEncoding = sr->CurrentEncoding; - return text; - } - finally - { - if (sr) delete sr; - if (fs) delete fs; - } - } - void Set (String ^content) - { - using namespace System::IO; - if (String::IsNullOrEmpty (path)) return; - Encoding ^enc = lastEncoding ? lastEncoding : Encoding::UTF8; - FileStream ^fs = nullptr; - StreamWriter ^sw = nullptr; - try - { - fs = gcnew FileStream ( - path, - FileMode::Create, - FileAccess::ReadWrite, - FileShare::ReadWrite - ); - sw = gcnew StreamWriter (fs, enc); - sw->Write (content); - sw->Flush (); - } - finally - { - if (sw) delete sw; - if (fs) delete fs; - } - } - property String ^Content - { - String ^get () { return Get (); } - void set (String ^value) { Set (value); } - } - property bool Exist { bool get () override { return IsFileExists (MPStringToStdW (path)); }} - property String ^FilePath { String ^get () { return this->Path; } void set (String ^value) { this->Path = value; }} -}; -[ComVisible (true)] -public ref class _I_Directory: public _I_Entry -{ - public: - _I_Directory (String ^dirpath): _I_Entry (dirpath) {} - _I_Directory (_I_Entry ^file): _I_Entry (file->Directory) {} - _I_Directory (): _I_Entry (String::Empty) {} - property String ^DirectoryPath { String ^get () { return this->Path; } void set (String ^value) { this->Path = value; } } - property String ^DirPath { String ^get () { return this->DirectoryPath; } void set (String ^value) { this->DirectoryPath = value; } } - property bool Exist { bool get () override { return IsDirectoryExists (MPStringToStdW (path)); }} - String ^EnumFilesToJson (String ^filter, bool withpath, bool sort, bool includesub) - { - std::vector res; - ::EnumFiles (MPStringToStdW (DirPath), MPStringToStdW (filter), res, withpath, sort, includesub); - return CStringToMPString (StringArrayToJson (res)); - } - String ^EnumDirsToJson (bool withpath, bool sort, bool includesub) - { - std::vector res; - EnumDirectory (MPStringToStdW (DirPath), res, withpath, sort, includesub); - return CStringToMPString (StringArrayToJson (res)); - } - String ^EnumSubDirsToJson (bool withpath) - { - std::vector res = EnumSubdirectories (MPStringToStdW (DirPath), withpath); - return CStringToMPString (StringArrayToJson (res)); - } - array ^EnumFiles (String ^filter, bool withpath, bool sort, bool includesub) - { - std::vector res; - ::EnumFiles (MPStringToStdW (DirPath), MPStringToStdW (filter), res, withpath, sort, includesub); - auto retarr = gcnew array (res.size ()); - for (size_t i = 0; i < res.size (); i ++) - { - retarr [i] = CStringToMPString (res [i]); - } - return retarr; - } - array ^EnumDirs (bool withpath, bool sort, bool includesub) - { - std::vector res; - EnumDirectory (MPStringToStdW (DirPath), res, withpath, sort, includesub); - auto retarr = gcnew array (res.size ()); - for (size_t i = 0; i < res.size (); i ++) - { - retarr [i] = CStringToMPString (res [i]); - } - return retarr; - } - array ^EnumSubDirs (bool withpath) - { - std::vector res = EnumSubdirectories (MPStringToStdW (DirPath), withpath); - auto retarr = gcnew array (res.size ()); - for (size_t i = 0; i < res.size (); i ++) - { - retarr [i] = CStringToMPString (res [i]); - } - return retarr; - } -}; -[ComVisible (true)] -public ref class _I_Storage -{ - protected: - _I_Path ^path = gcnew _I_Path (); - public: - property _I_Path ^Path { _I_Path ^get () { return path; }} - _I_File ^GetFile (String ^path) { return gcnew _I_File (path); } - _I_Directory ^GetDirectory (String ^path) { return gcnew _I_Directory (path); } - _I_Directory ^GetDir (String ^path) { return GetDirectory (path); } -}; -#endif \ No newline at end of file diff --git a/settings/main.cpp b/settings/main.cpp index 2ae70cf..3f662d1 100644 --- a/settings/main.cpp +++ b/settings/main.cpp @@ -2,6 +2,10 @@ #include #include #include +#include // KNOWNFOLDERID, SHGetKnownFolderPath +#include // OPENFILENAME +#include // _com_error +#include // WinHTTP #include #include #include @@ -9,10 +13,12 @@ #include #include #include +#include #include #include #include -#include "download.h" +#include +#include #include "module.h" #include "themeinfo.h" #include "mpstr.h" @@ -20,6 +26,7 @@ #include "vemani.h" #include "ieshell.h" #include "localeex.h" +#include "download.h" #include "bridge.h" #include "rctools.h" #include "nstring.h" @@ -45,6 +52,7 @@ struct iconhandle LPCWSTR g_lpAppId = L"WindowsModern.PracticalToolsProject!Settings"; LPCWSTR g_idInVe = L"Settings"; +LPCWSTR g_wndclass = L"Win32_WebUI_WindowsModern"; iconhandle g_hIconMain (LoadRCIcon (IDI_ICON_MAIN)); initfile g_initfile (CombinePath (GetProgramRootDirectoryW (), L"config.ini")); vemanifest g_vemani ( @@ -61,6 +69,73 @@ ref class MainHtmlWnd; msclr::gcroot g_mainwnd; std::wstring g_lastfile; inline std::wstring ToStdWString (const std::wstring &str) { return str; } +std::string GetSuitableLanguageValue (const std::map &map, const std::nstring &localename) +{ + for (auto &it : map) if (it.first == localename) return it.second; + for (auto &it : map) if (LocaleNameCompare (pugi::as_wide (it.first), pugi::as_wide (localename))) return it.second; + for (auto &it : map) if (IsNormalizeStringEquals (GetLocaleRestrictedCodeA (it.first), GetLocaleRestrictedCodeA (localename))) return it.second; + for (auto &it : map) if (LocaleNameCompare (pugi::as_wide (GetLocaleRestrictedCodeA (it.first)), pugi::as_wide (GetLocaleRestrictedCodeA (localename)))) return it.second; + return ""; +} +std::string GetSuitableLanguageValue (const std::map &map) +{ + if (map.empty ()) return ""; + std::string ret = GetSuitableLanguageValue (map, pugi::as_utf8 (GetComputerLocaleCodeW ())); + if (ret.empty ()) ret = GetSuitableLanguageValue (map, "en-US"); + if (ret.empty ()) ret = map.begin ()->second; + return ret; +} +struct xmlstrres +{ + pugi::xml_document doc; + bool isvalid = false; + void destroy () + { + if (isvalid) doc.reset (); + isvalid = false; + } + bool create (const std::wstring &filepath) + { + destroy (); + auto res = doc.load_file (filepath.c_str ()); + return isvalid = res; + } + xmlstrres (const std::wstring &filepath) { create (filepath); } + ~xmlstrres () { destroy (); } + std::string get (const std::string &id) const + { + auto root = doc.first_child (); + auto nodes = root.children (); + for (auto &it : nodes) + { + if (IsNormalizeStringEquals (std::string (it.attribute ("id").as_string ()), id)) + { + auto strings = it.children (); + std::map lang_value; + for (auto &sub : strings) + { + std::nstring lang = sub.attribute ("name").as_string (); + if (!lang.empty ()) lang_value [lang] = sub.text ().get (); + } + return GetSuitableLanguageValue (lang_value); + } + } + return ""; + } + std::wstring get (const std::wstring &id) const { return pugi::as_wide (get (pugi::as_utf8 (id))); } + std::wstring operator [] (const std::wstring &id) const { return get (id); } + std::wstring operator [] (const std::wstring &id) { return get (id); } + std::string operator [] (const std::string &id) const { return get (id); } + std::string operator [] (const std::string &id) { return get (id); } +}; +xmlstrres g_winjspri (CombinePath (GetProgramRootDirectoryW (), L"locale\\resources.xml")); +struct +{ + bool jump = false; + std::wstring section = L""; + std::wstring item = L""; + std::wstring arg = L""; +}; size_t ExploreFile (HWND hParent, std::vector &results, LPWSTR lpFilter = L"Windows Store App Package (*.appx; *.appxbundle)\0*.appx;*.appxbundle", DWORD dwFlags = OFN_EXPLORER | OFN_ALLOWMULTISELECT | OFN_PATHMUSTEXIST, const std::wstring &swWndTitle = std::wstring (L"Please select the file(-s): "), const std::wstring &swInitDir = GetFileDirectoryW (g_lastfile)) { @@ -407,6 +482,104 @@ public ref class _I_IEFrame_Base return "{}"; } }; +int ExecuteProgram ( + const std::wstring &cmdline, + const std::wstring &file, + int wndshowmode, + bool wait, + const std::wstring &execdir = L"") +{ + STARTUPINFOW si; + PROCESS_INFORMATION pi; + ZeroMemory (&si, sizeof (si)); + ZeroMemory (&pi, sizeof (pi)); + si.cb = sizeof (si); + si.dwFlags = STARTF_USESHOWWINDOW; + si.wShowWindow = static_cast (wndshowmode); + std::vector buf (cmdline.capacity () + 1); + wcscpy (buf.data (), cmdline.c_str ()); + LPCWSTR workdir = IsNormalizeStringEmpty (execdir) ? NULL : execdir.c_str (); + BOOL ok = CreateProcessW ( + IsNormalizeStringEmpty (file) ? NULL : file.c_str (), // 应用程序路径 + IsNormalizeStringEmpty (cmdline) ? NULL : buf.data (), // 命令行必须可写 + NULL, // 进程安全属性 + NULL, // 线程安全属性 + FALSE, // 不继承句柄 + 0, // 创建标志 + NULL, // 使用父进程环境变量 + workdir, // 工作目录 + &si, + &pi + ); + if (!ok) return static_cast (GetLastError ()); + if (wait) WaitForSingleObject (pi.hProcess, INFINITE); + CloseHandle (pi.hThread); + CloseHandle (pi.hProcess); + return 0; +} +bool KillProcessByFilePath ( + const std::wstring &filepath, + bool multiple = false, + bool isonlyname = false +) +{ + if (filepath.empty ()) return false; + std::wstring targetPath = filepath; + std::wstring targetName; + if (isonlyname) + { + size_t pos = filepath.find_last_of (L"\\/"); + if (pos != std::wstring::npos) targetName = filepath.substr (pos + 1); + else targetName = filepath; // 直接是文件名 + } + HANDLE hSnap = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0); + if (hSnap == INVALID_HANDLE_VALUE) return false; + PROCESSENTRY32W pe; + pe.dwSize = sizeof (pe); + bool killed = false; + if (Process32FirstW (hSnap, &pe)) + { + do + { + bool match = false; + if (isonlyname) + { + if (PathEquals (pe.szExeFile, targetName.c_str ())) match = true; + } + else + { + // 比较完整路径,需要 QueryFullProcessImageNameW + HANDLE hProc = OpenProcess (PROCESS_QUERY_INFORMATION | PROCESS_TERMINATE, FALSE, pe.th32ProcessID); + if (hProc) + { + wchar_t exePath [MAX_PATH] = {0}; + DWORD sz = MAX_PATH; + + if (QueryFullProcessImageNameW (hProc, 0, exePath, &sz)) + { + if (_wcsicmp (exePath, targetPath.c_str ()) == 0) + match = true; + } + CloseHandle (hProc); + } + } + if (match) + { + HANDLE hProc = OpenProcess (PROCESS_TERMINATE, FALSE, pe.th32ProcessID); + if (hProc) + { + TerminateProcess (hProc, 1); + CloseHandle (hProc); + killed = true; + } + if (!multiple) break; + } + + } while (Process32NextW (hSnap, &pe)); + } + CloseHandle (hSnap); + return killed; +} [ComVisible (true)] public ref class SplashForm: public System::Windows::Forms::Form @@ -679,11 +852,85 @@ public ref class MainHtmlWnd: public System::Windows::Forms::Form, public IScrip } property _I_UI2 ^UI { _I_UI2 ^get () { return ui2; } } }; + [ComVisible (true)] + ref class _I_Process + { + public: + using String = System::String; + ref class ProcessWorker + { + _I_Process ^parent; + public: + ProcessWorker (_I_Process ^parent): parent (parent) {} + ProcessWorker (): parent (gcnew _I_Process ()) {} + String ^cmdline = String::Empty; + String ^filepath = String::Empty; + int wndtype = SW_NORMAL; + String ^runpath = String::Empty; + Object ^callback = nullptr; + void Work () + { + int ret = parent->Run (cmdline, filepath, wndtype, true, runpath); + if (callback) + { + try + { + callback->GetType ()->InvokeMember ( + "call", + BindingFlags::InvokeMethod, + nullptr, + callback, + gcnew array{ 1, ret } + ); + } + catch (...) {} + } + } + }; + public: + int Run (String ^cmdline, String ^filepath, int wndtype, bool wait, String ^runpath) + { + return ExecuteProgram ( + MPStringToStdW (cmdline), + MPStringToStdW (filepath), + wndtype, + wait, + MPStringToStdW (runpath) + ); + } + void RunAsync (String ^cmdline, String ^filepath, int wndtype, String ^runpath, Object ^callback) + { + auto worker = gcnew ProcessWorker (this); + worker->cmdline = cmdline; + worker->filepath = filepath; + worker->wndtype = wndtype; + worker->runpath = runpath; + worker->callback = callback; + Thread^ th = gcnew Thread (gcnew ThreadStart (worker, &ProcessWorker::Work)); + th->IsBackground = true; + th->Start (); + } + bool Kill (String ^filename, bool allproc, bool onlyname) { return KillProcessByFilePath (MPStringToStdW (filename), allproc, onlyname); } + }; + [ComVisible (true)] + ref class _I_ResourcePri + { + public: + using String = System::String; + String ^GetString (String ^uri) + { + auto ret = g_winjspri.get (MPStringToStdW (uri)); + auto retstr = CStringToMPString (ret); + return retstr; + } + }; private: _I_IEFrame ^ieframe; _I_System3 ^sys; _I_VisualElements2 ^ve; _I_Download ^download; + _I_Process ^proc; + _I_ResourcePri ^winjs_res; public: IBridge (MainHtmlWnd ^wnd): wndinst (wnd), _I_Bridge_Base2 (wnd) { @@ -692,17 +939,30 @@ public ref class MainHtmlWnd: public System::Windows::Forms::Form, public IScrip storage = gcnew _I_Storage (); ve = gcnew _I_VisualElements2 (); download = gcnew _I_Download (); + proc = gcnew _I_Process (); + winjs_res = gcnew _I_ResourcePri (); } property _I_IEFrame ^IEFrame { _I_IEFrame ^get () { return ieframe; }} property _I_System3 ^System { _I_System3 ^get () { return sys; }} property _I_VisualElements2 ^VisualElements { _I_VisualElements2 ^get () { return ve; } } property _I_Download ^Download { _I_Download ^get () { return download; }} + property _I_Process ^Process { _I_Process ^get () { return proc; }} + property _I_ResourcePri ^WinJsStringRes { _I_ResourcePri ^get () { return winjs_res; }} + void CloseWindow () + { + if (wndinst && wndinst->IsHandleCreated) wndinst->Close (); + } }; protected: property WebBrowser ^WebUI { WebBrowser ^get () { return this->webui; } } property SplashForm ^SplashScreen { SplashForm ^get () { return this->splash; } } property int DPIPercent { int get () { return GetDPI (); }} property double DPI { double get () { return DPIPercent * 0.01; }} + virtual void OnHandleCreated (EventArgs ^e) override + { + ::SetClassLongPtrW ((HWND)this->Handle.ToPointer (), GCLP_HBRBACKGROUND, (LONG_PTR)g_wndclass); + Form::OnHandleCreated (e); + } void InitSize () { unsigned ww = 0, wh = 0; @@ -1009,10 +1269,71 @@ HRESULT SetCurrentAppUserModelID (PCWSTR appID) catch (...) { return E_FAIL; } return E_FAIL; } + +void SetProgramSingleInstance ( + const std::wstring &mutexName, + std::function repeatCallback = nullptr, + bool focusMain = true) +{ + HANDLE hMutex = CreateMutexW (NULL, TRUE, mutexName.c_str ()); + if (hMutex == NULL) return; + destruct _mutexFree ([&] () { CloseHandle (hMutex); }); + if (GetLastError () != ERROR_ALREADY_EXISTS) return; + if (repeatCallback) repeatCallback (); + wchar_t pathBuf [MAX_PATH] = {0}; + GetModuleFileNameW (NULL, pathBuf, MAX_PATH); + std::wstring exeName = pathBuf; + exeName = exeName.substr (exeName.find_last_of (L"\\/") + 1); + DWORD existingPid = 0; + HANDLE snap = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0); + if (snap != INVALID_HANDLE_VALUE) + { + PROCESSENTRY32W pe = {sizeof (pe)}; + if (Process32FirstW (snap, &pe)) + { + do { + if (_wcsicmp (pe.szExeFile, exeName.c_str ()) == 0 && + pe.th32ProcessID != GetCurrentProcessId ()) + { + existingPid = pe.th32ProcessID; + break; + } + } while (Process32NextW (snap, &pe)); + } + CloseHandle (snap); + } + HWND targetHwnd = NULL; + if (existingPid) + { + EnumWindows ([] (HWND hwnd, LPARAM lParam) -> BOOL { + DWORD pid = 0; + GetWindowThreadProcessId (hwnd, &pid); + if (pid == (DWORD)lParam && IsWindowVisible (hwnd)) + { + *((HWND *)(&lParam)) = hwnd; + return FALSE; + } + return TRUE; + }, (LPARAM)&targetHwnd); + } + if (focusMain && targetHwnd) + { + if (IsIconic (targetHwnd)) ShowWindow (targetHwnd, SW_RESTORE); + DWORD thisThread = GetCurrentThreadId (); + DWORD wndThread = GetWindowThreadProcessId (targetHwnd, NULL); + AttachThreadInput (thisThread, wndThread, TRUE); + SetActiveWindow (targetHwnd); + SetForegroundWindow (targetHwnd); + AttachThreadInput (thisThread, wndThread, FALSE); + BringWindowToTop (targetHwnd); + } + ExitProcess (0); +} [STAThread] int APIENTRY wWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) { SetCurrentProcessExplicitAppUserModelID (g_lpAppId); + SetProgramSingleInstance (g_lpAppId); SetProcessDPIAware (); { // 设置当前目录为程序所在目录 diff --git a/settings/settings.vcxproj b/settings/settings.vcxproj index c4a1de0..a41d370 100644 --- a/settings/settings.vcxproj +++ b/settings/settings.vcxproj @@ -23,6 +23,7 @@ Win32Proj settings 8.1 + v4.5 @@ -97,7 +98,8 @@ Windows true - shlwapi.lib;version.lib;dwmapi.lib;wininet.lib;%(AdditionalDependencies) + shlwapi.lib;version.lib;dwmapi.lib;winhttp.lib;Psapi.lib;%(AdditionalDependencies) + RequireAdministrator @@ -130,7 +132,8 @@ true true true - shlwapi.lib;version.lib;dwmapi.lib;wininet.lib;%(AdditionalDependencies) + shlwapi.lib;version.lib;dwmapi.lib;winhttp.lib;Psapi.lib;%(AdditionalDependencies) + RequireAdministrator @@ -155,21 +158,7 @@ - - C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.dll - - - C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Drawing.dll - - - C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Windows.Forms.dll - - - - - - @@ -184,9 +173,12 @@ + + + @@ -199,6 +191,22 @@ + + + + C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Drawing.dll + + + C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Net.dll + + + C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Net.Http.dll + + + + C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.XML.dll + + diff --git a/settings/settings.vcxproj.filters b/settings/settings.vcxproj.filters index 8934623..f3b59d4 100644 --- a/settings/settings.vcxproj.filters +++ b/settings/settings.vcxproj.filters @@ -20,15 +20,9 @@ - - 澶存枃浠 - 澶存枃浠 - - 澶存枃浠 - 澶存枃浠 @@ -80,6 +74,15 @@ 澶存枃浠 + + 澶存枃浠 + + + 澶存枃浠 + + + 澶存枃浠 + diff --git a/settings/syncutil.h b/settings/syncutil.h new file mode 100644 index 0000000..5352fc0 --- /dev/null +++ b/settings/syncutil.h @@ -0,0 +1,124 @@ +#pragma once +#pragma once +#include +class CriticalSection +{ + private: + CRITICAL_SECTION m_csection; + public: + CriticalSection (DWORD spinCount = 4000) { InitializeCriticalSectionAndSpinCount (&m_csection, spinCount); } + CriticalSection (const CriticalSection &) = delete; + CriticalSection &operator = (const CriticalSection &) = delete; + ~CriticalSection () { DeleteCriticalSection (&m_csection); } + void Lock () { EnterCriticalSection (&m_csection); } + void Unlock () { LeaveCriticalSection (&m_csection); } + bool TryLock () { return TryEnterCriticalSection (&m_csection) != 0; } + class ScopedLock + { + public: + explicit ScopedLock (CriticalSection &cs): m_cs (cs) { m_cs.Lock (); } + ~ScopedLock () { m_cs.Unlock (); } + ScopedLock (const ScopedLock &) = delete; + ScopedLock &operator = (const ScopedLock &) = delete; + private: + CriticalSection& m_cs; + }; +}; + +#define CreateScopedLock(_obj_cs_) CriticalSection::ScopedLock _obj_cs_##sl (_obj_cs_) + +#ifdef __cplusplus_cli +ref struct TaskStructEvent +{ + typedef array args; + typedef void (*eventfunc) (... args ^args); + eventfunc post; + args ^postargs; + public: + TaskStructEvent ( + eventfunc prefunc, + args ^preargs, + eventfunc postfunc, + args ^postargs + ): post (postfunc), postargs (postargs) + { + if (prefunc == nullptr) { + #pragma message("警告:预处理函数指针为空,可能跳过初始化操作") + } + if (prefunc) + { + if (preargs) + { + #pragma region 参数验证示例 + /* + 实际项目中应添加具体类型检查,例如: + ValidateArgsType(preargs); + */ + #pragma endregion + prefunc (preargs); + } + else prefunc (gcnew args {}); + } + } + ~TaskStructEvent () + { + if (post == nullptr) + { + #pragma message("警告:后处理函数指针为空,资源可能无法正确释放") + return; + } + try + { + if (postargs) { post (postargs); } + else { post (gcnew args {}); } + } + catch (Exception ^e) + { + #pragma message("注意:后处理中的异常需手动处理") + } + } +}; +#define CreateStructEvent(_varname_taskname_, _func_construct_, _args_construct_, _func_destruct_, _args_destruct_) \ +TaskStructEvent _varname_taskname_ ( \ + _func_construct_, \ + _args_construct_, \ + _func_destruct_, \ + _args_destruct_ \ +) +#endif + +#ifdef __cplusplus +#include +#include +template class ScopedEvent +{ + public: + ScopedEvent (PreCallback &&pre, PostCallback &&post) + : m_post (std::forward (post)) + { + static_assert ( + std::is_constructible , PreCallback>::value, + "预处理回调必须可转换为 void () 类型" + ); + + if (pre) { pre (); } + } + ~ScopedEvent () noexcept + { + if (m_post) { m_post (); } + } + ScopedEvent (const ScopedEvent &) = delete; + ScopedEvent &operator = (const ScopedEvent &) = delete; + ScopedEvent (ScopedEvent &&) = default; + ScopedEvent &operator =(ScopedEvent &&) = default; + private: + PostCallback m_post; +}; +template auto make_scoped_event (PreFunc &&pre, PostFunc &&post) +{ + return ScopedEvent ( + std::forward (pre), + std::forward (post) + ); +} +#endif \ No newline at end of file diff --git a/shared/config.ini b/shared/config.ini index f8ba521..07b794e 100644 Binary files a/shared/config.ini and b/shared/config.ini differ diff --git a/shared/html/css/pages.css b/shared/html/css/pages.css index 8822592..dd1af48 100644 --- a/shared/html/css/pages.css +++ b/shared/html/css/pages.css @@ -1,16 +1,3 @@ -body { - margin: 0; - width: 100%; - height: 100%; - -ms-overflow-style: -ms-autohiding-scrollbar; - user-select: none; - -ms-user-select: none; -} - -body * { - -ms-overflow-style: -ms-autohiding-scrollbar; -} - *, button, input, @@ -45,10 +32,26 @@ video, canvas, form, fieldset, -legend { +legend, +.win-type-x-large, +.win-type-xx-large, +.font-fix { font-family: "Microsoft YaHei", "Segoe UI", "Ebrima", "Nirmala", "Gadugi", "Segoe UI Emoji", "Segoe UI Symbol", "Meiryo", "Leelawadee", "Microsoft JhengHei", "Malgun Gothic", "Estrangelo Edessa", "Microsoft Himalaya", "Microsoft New Tai Lue", "Microsoft PhagsPa", "Microsoft Tai Le", "Microsoft Yi Baiti", "Mongolian Baiti", "MV Boli", "Myanmar Text", "Javanese Text", "Cambria Math"; } +body { + margin: 0; + width: 100%; + height: 100%; + -ms-overflow-style: -ms-autohiding-scrollbar; + user-select: none; + -ms-user-select: none; +} + +body * { + -ms-overflow-style: -ms-autohiding-scrollbar; +} + .pagecontainer { padding: 0px; position: absolute; diff --git a/shared/html/js/event.js b/shared/html/js/event.js index 2effc83..22ade4f 100644 --- a/shared/html/js/event.js +++ b/shared/html/js/event.js @@ -357,4 +357,47 @@ Windows.UI.Event.Util.removeEvent(window, "resize", handler); }; } module.exports = { debounce: debounce }; +})(this); + +(function(global) { + "use strict"; + + var eToEvent = {}; // 瀛樺偍鍏冪礌鍜屽洖璋 + var lastContent = {}; // 瀛樺偍涓婁竴娆$殑 textContent + + // 娉ㄥ唽鏂囨湰鍙樺寲浜嬩欢 + global.setTextChangeEvent = function(el, fn) { + if (!el || typeof fn !== "function") return; + + var id = el.__textChangeId; + if (!id) { + id = Math.random().toString(36).substr(2, 9); + el.__textChangeId = id; + lastContent[id] = el.textContent; + } + + eToEvent[id] = { el: el, callback: fn }; + }; + + // 瀹氭椂杞 + setInterval(function() { + var keys = Object.keys(eToEvent); + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var obj = eToEvent[key]; + var el = obj.el; + var currentText = el.textContent; + + if (currentText !== lastContent[key]) { + lastContent[key] = currentText; + try { + obj.callback.call(el, currentText); + } catch (e) { + // 蹇界暐鍥炶皟閿欒 + if (typeof console !== "undefined") console.error(e); + } + } + } + }, 20); + })(this); \ No newline at end of file diff --git a/shared/html/js/polyfill-ie.js b/shared/html/js/polyfill-ie.js index 6f5df17..03843c4 100644 --- a/shared/html/js/polyfill-ie.js +++ b/shared/html/js/polyfill-ie.js @@ -127,4 +127,64 @@ }; } } -})(this); \ No newline at end of file +})(this); +// attachEvent / detachEvent polyfill for IE11+ +(function() { + if (!Element.prototype.attachEvent) { + Element.prototype.attachEvent = function(eventName, handler) { + // IE attachEvent 鐨勪簨浠跺悕闇瑕 "on" 鍓嶇紑 + eventName = eventName.toLowerCase(); + + // 鍖呰鍑芥暟锛屾ā浠挎棫 IE 鐨 event 瀵硅薄 + var wrapper = function(e) { + e = e || window.event; + + // 鍏煎 IE 椋庢牸 event 灞炴 + e.srcElement = e.target || this; + e.returnValue = true; + e.cancelBubble = false; + + // 妯℃嫙 IE 鐨勯槻姝㈤粯璁よ涓 + Object.defineProperty(e, "cancelBubble", { + set: function(val) { + if (val) e.stopPropagation(); + } + }); + Object.defineProperty(e, "returnValue", { + set: function(val) { + if (val === false) e.preventDefault(); + } + }); + + // 璋冪敤鍘熶簨浠跺鐞嗗嚱鏁 + return handler.call(this, e); + }; + + // 瀛樺偍 handler 鏄犲皠锛屼緵 detachEvent 鐢 + if (!this._attachEventWrappers) this._attachEventWrappers = {}; + if (!this._attachEventWrappers[eventName]) this._attachEventWrappers[eventName] = []; + + this._attachEventWrappers[eventName].push({ + original: handler, + wrapped: wrapper + }); + + this.addEventListener(eventName.replace(/^on/, ""), wrapper, false); + }; + + Element.prototype.detachEvent = function(eventName, handler) { + eventName = eventName.toLowerCase(); + if (!this._attachEventWrappers || !this._attachEventWrappers[eventName]) return; + + var list = this._attachEventWrappers[eventName]; + + for (var i = 0; i < list.length; i++) { + if (list[i].original === handler) { + this.removeEventListener(eventName.replace(/^on/, ""), list[i].wrapped, false); + list.splice(i, 1); + break; + } + } + }; + } +})(); \ No newline at end of file diff --git a/shared/html/libs/toggle/toggle.css b/shared/html/libs/toggle/toggle.css new file mode 100644 index 0000000..e266d3a --- /dev/null +++ b/shared/html/libs/toggle/toggle.css @@ -0,0 +1,209 @@ +.toggle-switch { + box-sizing: border-box; + border: 2px solid rgb(166, 166, 166); + width: 50px; + height: 19px; + max-width: 50px !important; + max-height: 19px !important; + position: relative; + display: block; +} + +.toggle-switch>input[type="checkbox"] { + position: absolute; + opacity: 0; + width: 100%; + height: 100%; + margin: 0; + z-index: 2; + cursor: pointer; +} + +.toggle-background { + background-color: rgb(166, 166, 166); + position: absolute; + top: 1px; + left: 1px; + right: 1px; + bottom: 1px; + z-index: 1; + transition: all 0.25s cubic-bezier(0.1, 0.9, 0.2, 1); +} + +.toggle-switch>input[type="checkbox"]:disabled { + cursor: not-allowed; +} + +.toggle-switch>input[type="checkbox"]:disabled+.toggle-background { + background-color: rgb(224, 224, 224); +} + +.toggle-switch>input[type="checkbox"]:disabled~.toggle-switch-border { + border-color: rgb(204, 204, 204); +} + +.toggle-switch>input[type="checkbox"]:disabled~.toggle-switch { + border-color: rgb(204, 204, 204); +} + +.toggle-switch:hover>input[type="checkbox"]:not(:disabled):not(:checked)+.toggle-background { + background-color: rgb(181, 181, 181); +} + +.toggle-switch:active>input[type="checkbox"]:not(:disabled):not(:checked)+.toggle-background { + background-color: rgb(189, 189, 189); +} + +.toggle-switch-border { + position: absolute; + top: -2px; + left: -2px; + right: -2px; + bottom: -2px; + border: 2px solid rgb(166, 166, 166); + pointer-events: none; + z-index: 0; +} + +.toggle-background:after { + position: absolute; + content: ""; + height: 19px; + width: 12px; + background-color: black; + transition: transform 0.25s cubic-bezier(0.1, 0.9, 0.2, 1); + top: -3px; + left: -3px; +} + +.toggle-switch>input[type="checkbox"]:checked+.toggle-background:after { + transform: translateX(38px); +} + +.toggle-background:before { + position: absolute; + content: ""; + width: 0; + height: 100%; + background-color: rgb(70, 23, 181); + transition: all 0.25s cubic-bezier(0.1, 0.9, 0.2, 1); + top: 0px; + left: 0px; +} + +.toggle-switch>input[type="checkbox"]:checked+.toggle-background:before { + width: 100%; +} + +.toggle-switch:hover>input:checked:not(:disabled)+.toggle-background:before { + background-color: rgb(90, 43, 202); +} + +.toggle-switch:active>input:checked:not(:disabled)+.toggle-background:before { + background-color: rgb(143, 100, 244); +} + +.toggle-showstatus { + margin-left: 90px; +} + +.toggle-status { + position: absolute; + z-index: 4; + height: 100%; + width: 0px; +} + +.toggle-status:before { + content: "Off"; + position: absolute; + left: -92px; + top: 50%; + transform: translateY(-50%); + font-weight: bold; + color: black; + font-family: "Microsoft YaHei", "Segoe UI", "Ebrima", "Nirmala", "Gadugi", "Segoe UI Emoji", "Segoe UI Symbol", "Meiryo", "Leelawadee", "Microsoft JhengHei", "Malgun Gothic", "Estrangelo Edessa", "Microsoft Himalaya", "Microsoft New Tai Lue", "Microsoft PhagsPa", "Microsoft Tai Le", "Microsoft Yi Baiti", "Mongolian Baiti", "MV Boli", "Myanmar Text", "Javanese Text", "Cambria Math"; +} + +label.toggle-status:has(input:checked)::before { + content: "On"; +} + +.toggle-switch>input:checked~.toggle-status::before { + content: "On"; +} + + +/* Dark Mode */ + +.toggle-switch-dark { + border: 2px solid rgb(87, 29, 222); +} + +.toggle-background-dark { + background-color: rgb(94, 43, 213); +} + +.toggle-switch-dark>input[type="checkbox"]:disabled:not(:checked)+.toggle-background-dark { + background-color: rgb(97, 69, 160); +} + +.toggle-switch-dark>input[type="checkbox"]:disabled:checked+.toggle-background-dark { + background-color: rgb(81, 81, 81); +} + +.toggle-switch-dark>input[type="checkbox"]:disabled~.toggle-switch-border-dark { + border-color: rgb(79, 26, 204); +} + +.toggle-switch-dark>input[type="checkbox"]:disabled~.toggle-switch-dark { + border-color: rgb(79, 26, 204); +} + +.toggle-switch-dark:hover>input[type="checkbox"]:not(:disabled):not(:checked)+.toggle-background-dark { + background-color: rgb(120, 83, 207); +} + +.toggle-switch-dark:active>input[type="checkbox"]:not(:disabled):not(:checked)+.toggle-background-dark { + background-color: rgb(143, 100, 244); +} + +.toggle-switch-border-dark { + border: 2px solid rgb(87, 29, 222); +} + +.toggle-background-dark:after { + background-color: white; +} + +.toggle-switch-dark>input:disabled+.toggle-background:after { + background-color: rgb(87, 29, 222); +} + +.toggle-background-dark:before { + background-color: rgb(70, 23, 181); +} + +.toggle-switch-dark:hover>input:checked:not(:disabled)+.toggle-background:before { + background-color: rgb(90, 43, 202); +} + +.toggle-switch-dark:active>input:checked:not(:disabled)+.toggle-background:before { + background-color: rgb(143, 100, 244); +} + +.toggle-switch-dark>input:checked:disabled+.toggle-background:before { + background-color: rgb(81, 81, 81); +} + +.toggle-switch-dark:hover>input:checked:disabled+.toggle-background:before { + background-color: rgb(81, 81, 81); +} + +.toggle-switch-dark:active>input:checked:disabled+.toggle-background:before { + background-color: rgb(81, 81, 81); +} + +.toggle-status-dark:before { + color: white; +} \ No newline at end of file diff --git a/shared/html/libs/toggle/toggle.js b/shared/html/libs/toggle/toggle.js new file mode 100644 index 0000000..5e59bfe --- /dev/null +++ b/shared/html/libs/toggle/toggle.js @@ -0,0 +1,888 @@ +(function(global) { + /** + * 妫鏌 CSS 閫夋嫨鍣ㄦ槸鍚﹂噸澶嶏紙绮剧‘鍖归厤锛 + * @param {string} targetSelector 瑕佹鏌ョ殑鐩爣閫夋嫨鍣紙濡 ".toggle-switch>input[type="checkbox"]"锛 + * @returns {number} 杩斿洖璇ラ夋嫨鍣ㄥ湪鏍峰紡琛ㄤ腑鐨勫嚭鐜版鏁 + */ + function checkSelectorDuplicate(targetSelector) { + var count = 0; + + function traverseRules(rules) { + for (var i = 0; i < rules.length; i++) { + var rule = rules[i]; + if (rule.type === 1) { + if (normalizeSelector(rule.selectorText) === normalizeSelector(targetSelector)) { + count++; + } + } else if (rule.type === 4 || rule.type === 12) { + var nestedRules = rule.cssRules || rule.rules; + if (nestedRules) traverseRules(nestedRules); + } + } + } + var sheets = document.styleSheets; + for (var i = 0; i < sheets.length; i++) { + try { + var rules = sheets[i].cssRules || sheets[i].rules; + if (rules) traverseRules(rules); + } catch (e) { + console.warn('鏃犳硶璇诲彇璺ㄥ煙鏍峰紡琛:', e); + } + } + return count; + } + + function normalizeSelector(selector) { + return selector + .replace(/\s*([>+~])\s*/g, '$1') + .replace(/\s{2,}/g, ' ') + .trim(); + } + /** + * 閫氳繃閫夋嫨鍣ㄧЩ闄ゅ尮閰嶇殑 CSS 瑙勫垯 + * @param {string} targetSelector 瑕佺Щ闄ょ殑鐩爣閫夋嫨鍣紙濡 ".toggle-switch>input[type="checkbox"]"锛 + * @returns {number} 杩斿洖瀹為檯绉婚櫎鐨勮鍒欐暟閲 + */ + function removeCSSRulesBySelector(targetSelector) { + var removedCount = 0; + + function traverseAndRemove(rules) { + for (var i = rules.length - 1; i >= 0; i--) { + var rule = rules[i]; + if (rule.type === 1) { + if (rule.selectorText === targetSelector) { + if (rules.removeRule) { + rules.removeRule(i); + } else { + rules.deleteRule(i); + } + removedCount++; + } + } else if (rule.type === 4 || rule.type === 12) { + var nestedRules = rule.cssRules || rule.rules; + if (nestedRules) { + traverseAndRemove(nestedRules); + if (nestedRules.length === 0) { + if (rules.removeRule) { + rules.removeRule(i); + } else { + rules.deleteRule(i); + } + } + } + } + } + } + var sheets = document.styleSheets; + for (var i = 0; i < sheets.length; i++) { + try { + var rules = sheets[i].cssRules || sheets[i].rules; + if (rules) traverseAndRemove(rules); + } catch (e) { + console.warn('鏃犳硶鎿嶄綔璺ㄥ煙鏍峰紡琛:', e); + } + } + return removedCount; + } + + var cssPool = {}; + + var strutil = Bridge.External.String; + var nstrutil = Bridge.NString; + var boolTrue = ["true", "1", "yes", "on", "y", "t", "zhen", "鐪"]; + var boolFalse = ["false", "0", "no", "off", "n", "f", "jia", "鍋"]; + + function Toggle() { + this.element = null; + Object.defineProperty(this, "value", { + get: function() { + return this.getValue(); + }, + set: function(value) { + this.setValue(value); + } + }); + Object.defineProperty(this, "checked", { + get: function() { + return this.getValue(); + }, + set: function(value) { + this.setValue(value); + } + }); + Object.defineProperty(this, "disabled", { + get: function() { + return this.getDisabled(); + }, + set: function(value) { + this.setDisabled(value); + } + }); + Object.defineProperty(this, "showlabel", { + get: function() { + return this.isShowStatus(); + }, + set: function(value) { + this.showStatus(value); + } + }); + Object.defineProperty(this, "darkMode", { + get: function() { + return this.isDarkMode(); + }, + set: function(value) { + this.setDarkMode(value); + } + }); + Object.defineProperty(this, "id", { + get: function() { + return this.getElementId(); + }, + set: function(value) { + this.setElementId(value); + } + }); + Object.defineProperty(this, "inputId", { + get: function() { + return this.getElementInputElementId(); + }, + set: function(value) { + this.setElementInputElementId(value); + } + }); + Object.defineProperty(this, "status", { + get: function() { + return this.getElementStatus(); + } + }); + Object.defineProperty(this, "parent", { + get: function() { + return this.getParent(); + }, + set: function(value) { + this.setParent(value); + } + }); + } + + Toggle.prototype.create = function() { + this.element = document.createElement("label"); + this.element.tabIndex = 0; + this.element.classList.add("toggle-switch"); + this.element.id = "toggle-switch" + (new Date()).getTime() + Math.floor(Math.random() * 1000); + var input = document.createElement("input"); + input.type = "checkbox"; + input.id = this.element.id + "-input"; + this.element.addEventListener("keydown", function(event) { + if (event.keyCode == 13) { + input.click(); + } + }); + var back = document.createElement("div"); + back.classList.add("toggle-background"); + var border = document.createElement("div"); + border.classList.add("toggle-switch-border"); + this.element.appendChild(input); + this.element.appendChild(back); + this.element.appendChild(border); + var status = document.createElement("span"); + status.classList.add("toggle-status"); + this.element.appendChild(status); + status.style.display = "none"; + this.element.objController = this; + return this.element; + } + + Toggle.prototype.addEventListener = function(type, listener) { + this.element.addEventListener(type, listener); + } + + Toggle.prototype.setParent = function(parent) { + if (parent == null) { + return; + } + var parentNode = null; + if (parent instanceof HTMLElement) { + parentNode = parent; + } else if (typeof parent === "string" || parent instanceof String) { + parentNode = document.getElementById(parent); + if (!parentNode) { + return; + } + } else { + console.error("Invalid parent type:", parent); + return; + } + if (!(this.element instanceof Node)) { + console.error("this.element is not a Node:", this.element); + return; + } + parentNode.appendChild(this.element); + } + + Toggle.prototype.setValue = function(value) { + var input = this.element.getElementsByTagName("input")[0]; + if (input === null) { + return; + } + + parseBool = function(str) { + str = "" + str; + for (var i = 0; i < boolTrue.length; i++) { + if (nstrutil.equals(str, boolTrue[i])) { + return true; + } + } + for (var i = 0; i < boolFalse.length; i++) { + if (nstrutil.equals(str, boolFalse[i])) { + return false; + } + } + return null; + }; + input.checked = parseBool(value); + } + + Toggle.prototype.getValue = function() { + var input = this.element.getElementsByTagName("input")[0]; + if (input === null) { + return false; + } + return input.checked; + } + + Toggle.prototype.setDisabled = function(disabled) { + var input = this.element.querySelector("input"); + if (input === null) { + return; + } + input.disabled = disabled; + } + + Toggle.prototype.getDisabled = function() { + var input = this.element.querySelector("input"); + if (input === null) { + return false; + } + return input.disabled; + } + + Toggle.prototype.isAvailable = function() { + return this.element !== null; + } + Toggle.prototype.destroy = function() { + if (this.element !== null) { + if (this.element.remove) { + this.element.remove(); + } else { + this.element.removeNode(true); + } + this.element = null; + } + } + Toggle.prototype.getElementId = function() { + if (this.element === null) { + return null; + } + return this.element.id; + } + Toggle.prototype.setElementId = function(elementId) { + if (this.element === null) { + return false; + } + this.element.id = elementId; + return true; + } + Toggle.prototype.getElement = function() { + return this.element; + } + Toggle.prototype.getElementInput = function() { + if (this.element === null) { + return null; + } + return this.element.getElementsByTagName("input")[0]; + } + Toggle.prototype.getElementInputElementId = function() { + var input = this.getElementInput(); + if (input === null) { + return null; + } + return input.id; + } + Toggle.prototype.setElementInputElementId = function(elementId) { + var input = this.getElementInput(); + if (input === null) { + return false; + } + input.id = elementId; + return true; + } + Toggle.prototype.getElementStatus = function() { + if (this.element === null) { + return null; + } + return this.element.querySelector(".toggle-status"); + } + Toggle.prototype.showStatus = function(show) { + var status = this.element.querySelector(".toggle-status"); + if (status === null) { + return; + } + if (show) { + status.style.display = ""; + if (this.element) { + if (this.element.classList.contains("toggle-showstatus")) { + return; + } + this.element.classList.add("toggle-showstatus"); + } + } else { + status.style.display = "none"; + if (this.element) { + if (!this.element.classList.contains("toggle-showstatus")) { + return; + } + this.element.classList.remove("toggle-showstatus"); + } + } + } + Toggle.prototype.isShowStatus = function() { + return this.element.classList.contains("toggle-showstatus"); + } + + Toggle.prototype.setDarkMode = function(isDark) { + if (this.element === null) { + return; + } + var element = this.element; + var background = element.querySelector(".toggle-background"); + var border = element.querySelector(".toggle-switch-border"); + var status = element.querySelector(".toggle-status"); + if (isDark) { + element.classList.add("toggle-switch-dark"); + background.classList.add("toggle-background-dark"); + border.classList.add("toggle-switch-border-dark"); + status.classList.add("toggle-status-dark"); + } else { + element.classList.remove("toggle-dark"); + background.classList.remove("toggle-background-dark"); + border.classList.remove("toggle-switch-border-dark"); + status.classList.remove("toggle-status-dark"); + } + } + + Toggle.prototype.isDarkMode = function() { + if (this.element === null) { + return false; + } + return this.element.classList.contains("toggle-switch-dark"); + } + + function ColorStringToRGBA(input) { + var str = input.replace(/\s+/g, '').toLowerCase(); + + function hexToRgba(hex) { + hex = hex.slice(1); + if (hex.length === 3 || hex.length === 4) { + hex = hex.split('').map(function(c) { return c + c; }).join(''); + } + var r = parseInt(hex.substr(0, 2), 16); + var g = parseInt(hex.substr(2, 2), 16); + var b = parseInt(hex.substr(4, 2), 16); + var a = hex.length === 8 ? parseInt(hex.substr(6, 2), 16) / 255 : 1; + return { r: r, g: g, b: b, a: a }; + } + + function hslToRgb(h, s, l) { + h = (h % 360 + 360) % 360 / 360; + s = Math.max(0, Math.min(1, s)); + l = Math.max(0, Math.min(1, l)); + var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; + var m1 = 2 * l - m2; + + function hueToRgb(m1, m2, hK) { + if (hK < 0) hK += 1; + if (hK > 1) hK -= 1; + if (hK * 6 < 1) return m1 + (m2 - m1) * 6 * hK; + if (hK * 2 < 1) return m2; + if (hK * 3 < 2) return m1 + (m2 - m1) * (2 / 3 - hK) * 6; + return m1; + } + return { + r: Math.round(hueToRgb(m1, m2, h + 1 / 3) * 255), + g: Math.round(hueToRgb(m1, m2, h) * 255), + b: Math.round(hueToRgb(m1, m2, h - 1 / 3) * 255), + a: 1 + }; + } + + function parseFunc(func, vals) { + var arr = vals.split(','); + if (/^hsl/.test(func)) { + var h = parseFloat(arr[0]); + var s = parseFloat(arr[1]) / 100; + var l = parseFloat(arr[2]) / 100; + var alpha = arr[3] !== undefined ? (arr[3].indexOf('%') > -1 ? parseFloat(arr[3]) / 100 : parseFloat(arr[3])) : 1; + var rgb = hslToRgb(h, s, l); + rgb.a = alpha; + return rgb; + } + var out = arr.slice(0, 3).map(function(v, i) { + if (v.indexOf('%') > -1) return Math.round(parseFloat(v) / 100 * 255); + return Math.round(parseFloat(v)); + }); + return { + r: out[0], + g: out[1], + b: out[2], + a: arr[3] !== undefined ? (arr[3].indexOf('%') > -1 ? parseFloat(arr[3]) / 100 : parseFloat(arr[3])) : 1 + }; + } + + function hwbToRgb(h, w, b, a) { + var rgb = hslToRgb(h, 1, 0.5); + w = Math.max(0, Math.min(1, w)); + b = Math.max(0, Math.min(1, b)); + var sum = w + b; + if (sum > 1) { + var gray = w / sum; + return { r: Math.round(gray * 255), g: Math.round(gray * 255), b: Math.round(gray * 255), a: a }; + } + var factor = 1 - w - b; + return { + r: Math.round((rgb.r / 255 * factor + w) * 255), + g: Math.round((rgb.g / 255 * factor + w) * 255), + b: Math.round((rgb.b / 255 * factor + w) * 255), + a: a + }; + } + + function parseRGBString(rgbString) { + var m = /rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d*\.?\d+))?\)/.exec(rgbString); + if (m) { + return { r: +m[1], g: +m[2], b: +m[3], a: m[4] !== undefined ? +m[4] : 1 }; + } + return { r: 0, g: 0, b: 0, a: 0 }; + } + var m; + if ((m = /^#([0-9a-f]{3,8})$/.exec(str))) { + return hexToRgba(m[0]); + } + if ((m = /^(rgba?|hsla?)\((.+)\)$/.exec(str))) { + return parseFunc(m[1], m[2]); + } + if ((m = /^(hwb)a?\((.+)\)$/.exec(str))) { + var parts = m[2].split(','); + var h = parseFloat(parts[0]); + var w0 = parseFloat(parts[1]) / 100; + var b0 = parseFloat(parts[2]) / 100; + var a0 = parts[3] !== undefined ? (parts[3].indexOf('%') > -1 ? parseFloat(parts[3]) / 100 : parseFloat(parts[3])) : 1; + return hwbToRgb(h, w0, b0, a0); + } + try { + var div = document.createElement('div'); + div.style.color = input; + document.body.appendChild(div); + var css = window.getComputedStyle(div).color; + document.body.removeChild(div); + return parseRGBString(css); + } catch (e) { + return { r: 0, g: 0, b: 0, a: 0 }; + } + return { r: 0, g: 0, b: 0, a: 0 }; + } + + function ColorRGBToString(color) { + return "#" + ((1 << 24) + (color.r << 16) + (color.g << 8) + color.b).toString(16).slice(1); + } + + function ColorRGBToHex(color) { + return "" + ((1 << 24) + (color.r << 16) + (color.g << 8) + color.b).toString(16).slice(1); + } + + function CalcLightHoverColor(_obj_rgb_) { + function rgbToHsl(r, g, b) { + r /= 255, g /= 255, b /= 255; + var max = Math.max(r, g, b), + min = Math.min(r, g, b); + var h, s, l = (max + min) / 2; + if (max == min) { + h = s = 0; + } else { + var d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + switch (max) { + case r: + h = (g - b) / d + (g < b ? 6 : 0); + break; + case g: + h = (b - r) / d + 2; + break; + case b: + h = (r - g) / d + 4; + break; + } + h /= 6; + } + return [h * 360, s * 100, l * 100]; + } + + function hslToRgb(h, s, l) { + h = (h % 360) / 360; + s /= 100; + l /= 100; + var r, g, b; + if (s == 0) { + r = g = b = l; + } else { + function hue2rgb(p, q, t) { + if (t < 0) t += 1; + if (t > 1) t -= 1; + if (t < 1 / 6) return p + (q - p) * 6 * t; + if (t < 1 / 2) return q; + if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; + return p; + } + var q = l < 0.5 ? l * (1 + s) : l + s - l * s; + var p = 2 * l - q; + r = hue2rgb(p, q, h + 1 / 3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1 / 3); + } + return [ + Math.round(r * 255), + Math.round(g * 255), + Math.round(b * 255) + ]; + } + var hsl = rgbToHsl(_obj_rgb_.r, _obj_rgb_.g, _obj_rgb_.b); + hsl[2] = Math.min(98, hsl[2] + 12); + var rgb = hslToRgb(hsl[0], hsl[1], hsl[2]); + + return { + r: rgb[0], + g: rgb[1], + b: rgb[2] + }; + } + + function CalcLightActiveColor(_obj_rgb_) { + function rgbToHsl(r, g, b) { + r /= 255, g /= 255, b /= 255; + var max = Math.max(r, g, b), + min = Math.min(r, g, b); + var h, s, l = (max + min) / 2; + if (max === min) { + h = s = 0; + } else { + var d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + switch (max) { + case r: + h = (g - b) / d + (g < b ? 6 : 0); + break; + case g: + h = (b - r) / d + 2; + break; + case b: + h = (r - g) / d + 4; + break; + } + h /= 6; + } + return [h * 360, s * 100, l * 100]; + } + + function hslToRgb(h, s, l) { + h = (h % 360) / 360; + s /= 100; + l /= 100; + var r, g, b; + if (s === 0) { + r = g = b = l; + } else { + function hue2rgb(p, q, t) { + if (t < 0) t += 1; + if (t > 1) t -= 1; + if (t < 1 / 6) return p + (q - p) * 6 * t; + if (t < 1 / 2) return q; + if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; + return p; + } + var q = l < 0.5 ? l * (1 + s) : l + s - l * s; + var p = 2 * l - q; + r = hue2rgb(p, q, h + 1 / 3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1 / 3); + } + return [ + Math.round(r * 255), + Math.round(g * 255), + Math.round(b * 255) + ]; + } + var hsl = rgbToHsl(_obj_rgb_.r, _obj_rgb_.g, _obj_rgb_.b); + hsl[2] = hsl[2] < 50 ? + hsl[2] * 1.6 : + hsl[2] + (100 - hsl[2]) * 0.3; + hsl[1] = hsl[1] < 80 ? + hsl[1] * 1.3 : + Math.min(100, hsl[1] + 15); + hsl[2] = Math.min(95, Math.max(5, hsl[2])); + hsl[1] = Math.min(100, Math.max(0, hsl[1])); + var rgb = hslToRgb(hsl[0], hsl[1], hsl[2]); + return { r: rgb[0], g: rgb[1], b: rgb[2] }; + } + + function GetLightCSSString(_string_selector_, _obj_rgb_) { + var hover = CalcLightHoverColor(_obj_rgb_); + var active = CalcLightActiveColor(_obj_rgb_); + var background = _string_selector_ + "-background"; + var css = ""; + css += "." + background + ":before" + " {" + + "background-color: " + ColorRGBToString(_obj_rgb_) + ";" + + "}\n"; + css += ".toggle-switch:hover>input:checked:not(:disabled)+." + background + ":before {" + + "background-color: " + ColorRGBToString(hover) + ";" + + "}\n"; + css += ".toggle-switch:active>input:checked:not(:disabled)+." + background + ":before {" + + "background-color: " + ColorRGBToString(active) + ";" + + "}\n"; + return css; + } + + function GetDarkCSSString(_string_selector_, _obj_rgb_) { + function rgbToHsl(r, g, b) { + r /= 255; + g /= 255; + b /= 255; + var max = Math.max(r, g, b), + min = Math.min(r, g, b), + h, s, l = (max + min) / 2; + if (max === min) { + h = s = 0; + } else { + var d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + switch (max) { + case r: + h = ((g - b) / d + (g < b ? 6 : 0)); + break; + case g: + h = ((b - r) / d + 2); + break; + case b: + h = ((r - g) / d + 4); + break; + } + h /= 6; + } + return { h: h * 360, s: s * 100, l: l * 100 }; + } + + function hslToRgb(h, s, l) { + s /= 100; + l /= 100; + h /= 360; + + function hue2rgb(p, q, t) { + if (t < 0) t += 1; + if (t > 1) t -= 1; + if (t < 1 / 6) return p + (q - p) * 6 * t; + if (t < 1 / 2) return q; + if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; + return p; + } + var r, g, b; + if (!s) { + r = g = b = l; + } else { + var q = l < 0.5 ? l * (1 + s) : l + s - l * s; + var p = 2 * l - q; + r = hue2rgb(p, q, h + 1 / 3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1 / 3); + } + return { r: Math.round(r * 255), g: Math.round(g * 255), b: Math.round(b * 255) }; + } + + function clamp(v, min, max) { + return v < min ? min : (v > max ? max : v); + } + + function ColorRGBToString(c) { + return "rgb(" + c.r + ", " + c.g + ", " + c.b + ")"; + } + var hsl = rgbToHsl(_obj_rgb_.r, _obj_rgb_.g, _obj_rgb_.b); + var borderRGB = hslToRgb(hsl.h, hsl.s, clamp(hsl.l + 15, 0, 100)); + var backgroundRGB = hslToRgb(hsl.h, clamp(hsl.s * 0.9, 0, 100), clamp(hsl.l + 12, 0, 100)); + var disabledBgRGB = hslToRgb(hsl.h, clamp(hsl.s * 0.6, 0, 100), clamp(hsl.l + 5, 0, 100)); + var disabledBrdRGB = hslToRgb(hsl.h, hsl.s, clamp(hsl.l + 5, 0, 100)); + var hoverBgRGB = hslToRgb(hsl.h, clamp(hsl.s * 0.8, 0, 100), clamp(hsl.l + 25, 0, 100)); + var activeBgRGB = hslToRgb(hsl.h, clamp(hsl.s * 1.1, 0, 100), clamp(hsl.l + 35, 0, 100)); + var hoverChecked = CalcLightHoverColor(_obj_rgb_); + var activeChecked = CalcLightActiveColor(_obj_rgb_); + var base = _string_selector_; + var bgClass = base + "-background"; + var brClass = base + "-border"; + var css = ""; + css += "." + base + " { border-color: " + ColorRGBToString(borderRGB) + "; }\n"; + css += "." + bgClass + " { background-color: " + ColorRGBToString(backgroundRGB) + "; }\n"; + css += "." + base + ">input[type=\"checkbox\"]:disabled:not(:checked)+." + bgClass + + " { background-color: " + ColorRGBToString(disabledBgRGB) + "; }\n"; + css += "." + base + ">input[type=\"checkbox\"]:disabled~." + brClass + "," + + "." + base + ">input[type=\"checkbox\"]:disabled~." + base + "-switch" + + " { border-color: " + ColorRGBToString(disabledBrdRGB) + "; }\n"; + css += "." + base + ":hover>input[type=\"checkbox\"]:not(:disabled):not(:checked)+." + bgClass + + " { background-color: " + ColorRGBToString(hoverBgRGB) + "; }\n"; + css += "." + base + ":active>input[type=\"checkbox\"]:not(:disabled):not(:checked)+." + bgClass + + " { background-color: " + ColorRGBToString(activeBgRGB) + "; }\n"; + css += "." + brClass + " { border-color:" + ColorRGBToString(borderRGB) + "; }\n"; + css += "." + base + ">input:disabled+." + base + "-background:after" + + " { background-color: " + ColorRGBToString(borderRGB) + "; }\n"; + css += "." + bgClass + ":before { background-color: " + ColorRGBToString(_obj_rgb_) + "; }\n"; + css += "." + base + ":hover>input:checked:not(:disabled)+." + bgClass + ":before" + + " { background-color: " + ColorRGBToString(hoverChecked) + "; }\n"; + css += "." + base + ":active>input:checked:not(:disabled)+." + bgClass + ":before" + + " { background-color: " + ColorRGBToString(activeChecked) + "; }\n"; + return css; + } + + Toggle.prototype.setDarkMode = function(dark) { + var element = this.element; + if (this.isDarkMode === dark) { + return; + } + var background = element.querySelector(".toggle-background"); + var border = element.querySelector(".toggle-switch-border"); + var status = element.querySelector(".toggle-status"); + if (this.color) { + var label = ColorRGBToHex(this.color); + var uniid = "toggle-theme-" + label; + var uniidlight = uniid + "-light"; + var uniiddark = uniid + "-dark"; + } + if (this.element === null) { + return; + } + if (dark) { + element.classList.add("toggle-switch-dark"); + background.classList.add("toggle-background-dark"); + border.classList.add("toggle-switch-border-dark"); + status.classList.add("toggle-status-dark"); + if (this.color) { + element.classList.add(uniiddark); + background.classList.add(uniiddark + "-background"); + border.classList.add(uniiddark + "-border"); + element.classList.remove(uniidlight); + background.classList.remove(uniidlight + "-background"); + border.classList.remove(uniidlight + "-border"); + } + } else { + element.classList.remove("toggle-dark"); + background.classList.remove("toggle-background-dark"); + border.classList.remove("toggle-switch-border-dark"); + status.classList.remove("toggle-status-dark"); + if (this.color) { + element.classList.remove(uniiddark); + background.classList.remove(uniiddark + "-background"); + border.classList.remove(uniiddark + "-border"); + element.classList.add(uniidlight); + background.classList.add(uniidlight + "-background"); + border.classList.add(uniidlight + "-border"); + } + } + } + + Toggle.prototype.setColor = function(color) { + var rgb = ColorStringToRGBA(color); + this.color = rgb; + var label = ColorRGBToHex(rgb); + var uniid = "toggle-theme-" + label; + var uniidlight = uniid + "-light"; + var uniiddark = uniid + "-dark"; + if (cssPool[uniid] === undefined || cssPool[uniid] === null) { + cssPool[uniid] = { + light: uniidlight, + dark: uniiddark, + count: 1, + } + var lightCSS = GetLightCSSString(uniidlight, rgb); + var darkCSS = GetDarkCSSString(uniiddark, rgb); + var style = document.createElement("style"); + style.type = "text/css"; + style.id = uniid; + style.innerHTML = "/* Light Theme */\n" + lightCSS + "\n/* Dark Theme */\n" + darkCSS; + document.head.appendChild(style); + cssPool[uniid].style = style; + } else { + cssPool[uniid].count++; + } + var dark = this.isDarkMode(); + this.setDarkMode(!dark); + this.setDarkMode(dark); + } + + Toggle.prototype.dispose = function() { + if (this.element) { + removeElement(this.element); + this.element = null; + } + if (this.color) { + var label = ColorRGBToHex(this.color); + var uniid = "toggle-theme-" + label; + var ucss = cssPool[uniid]; + if (ucss) { + ucss.count--; + if (ucss.count <= 0) { + removeElement(ucss.style); + delete cssPool[uniid]; + } + } + this.color = null; + } + }; + + Toggle.prototype.destroy = Toggle.prototype.dispose; + + Toggle.prototype.setStatusText = function(onText, offText) { + /** + * 鍔ㄦ佹彃鍏ヤ竴娈 CSS 鏂囨湰鍒伴〉闈 涓 + * @param {string} cssText - 瑕佹彃鍏ョ殑瀹屾暣 CSS 鏂囨湰锛屽 "body{background:red;}" + * @param {string} [id] - 鍙夛紝涓