Index: scripts/setup.iss =================================================================== diff -u -r6b464cfe96c1828308331ff3731db364db830576 -rf84eecda89d8734da9790a2b8d4a54d344e40c46 --- scripts/setup.iss (.../setup.iss) (revision 6b464cfe96c1828308331ff3731db364db830576) +++ scripts/setup.iss (.../setup.iss) (revision f84eecda89d8734da9790a2b8d4a54d344e40c46) @@ -169,6 +169,8 @@ [Run] Filename: "{app}\{code:ExpandArch|ExeFilename}"; Flags: nowait postinstall skipifsilent; Description: "{cm:LaunchProgram,{#MyAppName}}" +Filename: "Reg.exe"; Parameters: "delete ""SOFTWARE\Microsoft\Windows\CurrentVersion\Run"" /v ""Copy Handler"" /f"; Flags: runasoriginaluser; +Filename: "Reg.exe"; Parameters: "add ""SOFTWARE\Microsoft\Windows\CurrentVersion\Run"" /v ""Copy Handler"" /t REG_SZ /d ""{app}\{code:ExpandArch|ExeFilename}"" /f"; Flags: runasoriginaluser postinstall; Tasks: startatboot [Registry] Root: "HKLM"; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\Run"; ValueType: none; ValueName: "Copy Handler"; Flags: deletevalue uninsdeletevalue @@ -188,6 +190,9 @@ [ThirdParty] CompileLogMethod=append +[UninstallRun] +Filename: "Reg.exe"; Parameters: "delete ""SOFTWARE\Microsoft\Windows\CurrentVersion\Run"" /v ""Copy Handler"" /f"; Flags: runasoriginaluser; + [Code] function ExpandArch(ConstantStr: String): String; begin @@ -206,16 +211,3 @@ end; end; end; - -procedure CurStepChanged(CurStep: TSetupStep); -var - ResultCode: Integer; -begin - if CurStep = ssPostInstall then - begin - if IsTaskSelected('startatboot') then - ExecAsOriginalUser(ExpandConstant('{app}\{code:ExpandArch|ExeFilename}'), '--EnableLaunchAtStartup=1', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) - else - ExecAsOriginalUser(ExpandConstant('{app}\{code:ExpandArch|ExeFilename}'), '--EnableLaunchAtStartup=0', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) - end; -end; Index: src/ch/AppHelper.cpp =================================================================== diff -u -rd9527df01ee91b35d9a5fdccb80ded25a9c8265f -rf84eecda89d8734da9790a2b8d4a54d344e40c46 --- src/ch/AppHelper.cpp (.../AppHelper.cpp) (revision d9527df01ee91b35d9a5fdccb80ded25a9c8265f) +++ src/ch/AppHelper.cpp (.../AppHelper.cpp) (revision f84eecda89d8734da9790a2b8d4a54d344e40c46) @@ -112,6 +112,14 @@ return m_pathProcessor.GetProgramPath(); } +CString CAppHelper::GetFullProgramPath() const +{ + CString strKey; + strKey.Format(_T("%s\\%s"), (PCTSTR)m_pathProcessor.GetProgramPath(), m_pszProgramName); + + return strKey; +} + bool CAppHelper::IsInPortableMode() { if(!m_optPortableMode.is_initialized()) @@ -126,66 +134,3 @@ return m_optPortableMode.get(); } - -bool CAppHelper::SetAutorun(bool bEnable) -{ - // check the current key value (to avoid irritating messages from some firewall software) - HKEY hkeyRun = nullptr; - CString strValue; - CString strKey; - DWORD dwType = REG_SZ; - DWORD dwCount = _MAX_PATH * sizeof(TCHAR); - - LSTATUS lStatus = RegOpenKeyEx(HKEY_CURRENT_USER, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"), 0, KEY_QUERY_VALUE, &hkeyRun); - if(lStatus != ERROR_SUCCESS) - return false; - - lStatus = RegQueryValueEx(hkeyRun, m_pszAppName, nullptr, &dwType, (BYTE*)strValue.GetBufferSetLength(_MAX_PATH), &dwCount); - RegCloseKey(hkeyRun); - - if(lStatus != ERROR_SUCCESS && lStatus != ERROR_FILE_NOT_FOUND) - { - strValue.ReleaseBuffer(0); - return false; - } - if(lStatus == ERROR_FILE_NOT_FOUND) - { - strValue.ReleaseBuffer(0); - - // if there is no key in registry and we don't want it, then return with ok status - if(!bEnable) - return true; - - // format the data to be written to registry - strKey.Format(_T("%s\\%s"), (PCTSTR)m_pathProcessor.GetProgramPath(), m_pszProgramName); - } - else - { - // key found - strValue.ReleaseBuffer(dwCount / sizeof(TCHAR)); - - if(bEnable) - { - // key exists in registry, check if the value is correct - strKey.Format(_T("%s\\%s"), (PCTSTR)m_pathProcessor.GetProgramPath(), m_pszProgramName); - - if(strValue.CompareNoCase(strKey) == 0) - return true; - } - } - - // we want to write information to the registry - // storing key in registry - lStatus = RegOpenKeyEx(HKEY_CURRENT_USER, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"), 0, KEY_ALL_ACCESS, &hkeyRun); - if(lStatus != ERROR_SUCCESS) - return false; - - if(bEnable) - lStatus = RegSetValueEx(hkeyRun, m_pszAppName, 0, REG_SZ, (BYTE*)(PCTSTR)strKey, (DWORD)(strKey.GetLength() + 1) * sizeof(TCHAR)); - else - lStatus = RegDeleteValue(hkeyRun, m_pszAppName); - - RegCloseKey(hkeyRun); - - return lStatus == ERROR_SUCCESS; -} Index: src/ch/AppHelper.h =================================================================== diff -u -r33b33baa373533d0cff8ea5d25154b370f2b2e05 -rf84eecda89d8734da9790a2b8d4a54d344e40c46 --- src/ch/AppHelper.h (.../AppHelper.h) (revision 33b33baa373533d0cff8ea5d25154b370f2b2e05) +++ src/ch/AppHelper.h (.../AppHelper.h) (revision f84eecda89d8734da9790a2b8d4a54d344e40c46) @@ -28,8 +28,6 @@ CAppHelper(); virtual ~CAppHelper(); - bool SetAutorun(bool bState); // changes state of "run with system" option - bool IsFirstInstance() const { return m_bFirstInstance; } PCTSTR GetAppName() const { return m_pszAppName; } @@ -42,6 +40,8 @@ CString ExpandPath(CString strPath); CString GetProgramPath() const; + CString GetFullProgramPath() const; + bool IsInPortableMode(); protected: Index: src/ch/CfgProperties.h =================================================================== diff -u -r0d5b67ee96b435d63f7bf075dc8e28603793b187 -rf84eecda89d8734da9790a2b8d4a54d344e40c46 --- src/ch/CfgProperties.h (.../CfgProperties.h) (revision 0d5b67ee96b435d63f7bf075dc8e28603793b187) +++ src/ch/CfgProperties.h (.../CfgProperties.h) (revision f84eecda89d8734da9790a2b8d4a54d344e40c46) @@ -29,7 +29,6 @@ { PP_PCLIPBOARDMONITORING = 0, PP_PMONITORSCANINTERVAL, - PP_PRELOADAFTERRESTART, PP_PCHECK_FOR_UPDATES_FREQUENCY, PP_PUPDATECHANNEL, @@ -200,7 +199,6 @@ // General settings PROPERTY(PP_PCLIPBOARDMONITORING, bool, _T("CHConfig.General.Program.EnableClipboardMonitoring"), false); PROPERTY_MINMAX(PP_PMONITORSCANINTERVAL, unsigned int, _T("CHConfig.General.Program.ClipboardMonitorScanInterval"), 1000, 0, 3600UL*1000UL); -PROPERTY(PP_PRELOADAFTERRESTART, bool, _T("CHConfig.General.Program.RunWithSystem"), false); PROPERTY_MINMAX(PP_PCHECK_FOR_UPDATES_FREQUENCY, unsigned int, _T("CHConfig.General.Program.Updates.Frequency"), eFreq_Weekly, eFreq_Never, eFreq_Max - 1); PROPERTY_MINMAX(PP_PUPDATECHANNEL, int, _T("CHConfig.General.Program.Updates.UpdateChannel"), UpdateVersionInfo::eReleaseCandidate, UpdateVersionInfo::eStable, UpdateVersionInfo::eMax - 1); Index: src/ch/MainWnd.cpp =================================================================== diff -u -r2e4eacb299f21d06196fe13140b4b0d095abdca9 -rf84eecda89d8734da9790a2b8d4a54d344e40c46 --- src/ch/MainWnd.cpp (.../MainWnd.cpp) (revision 2e4eacb299f21d06196fe13140b4b0d095abdca9) +++ src/ch/MainWnd.cpp (.../MainWnd.cpp) (revision f84eecda89d8734da9790a2b8d4a54d344e40c46) @@ -685,8 +685,6 @@ case WM_CONFIGNOTIFY: { - GetApp().SetAutorun(GetPropValue<PP_PRELOADAFTERRESTART>(GetConfig())); - // set this process class HANDLE hProcess=GetCurrentProcess(); ::SetPriorityClass(hProcess, (DWORD)GetPropValue<PP_PPROCESSPRIORITYCLASS>(GetConfig())); Index: src/ch/OptionsDlg.cpp =================================================================== diff -u -r0d5b67ee96b435d63f7bf075dc8e28603793b187 -rf84eecda89d8734da9790a2b8d4a54d344e40c46 --- src/ch/OptionsDlg.cpp (.../OptionsDlg.cpp) (revision 0d5b67ee96b435d63f7bf075dc8e28603793b187) +++ src/ch/OptionsDlg.cpp (.../OptionsDlg.cpp) (revision f84eecda89d8734da9790a2b8d4a54d344e40c46) @@ -41,7 +41,8 @@ COptionsDlg::COptionsDlg(CWnd* pParent /*=nullptr*/) :ictranslate::CLanguageDialog(IDD_OPTIONS_DIALOG, pParent, &m_bLock), - m_spLog(logger::MakeLogger(GetLogFileData(), L"OptionsDlg")) + m_spLog(logger::MakeLogger(GetLogFileData(), L"OptionsDlg")), + m_autoRun(GetApp().GetAppName(), chcore::PathFromString(GetApp().GetFullProgramPath())) { } @@ -237,8 +238,9 @@ PROP_SEPARATOR(IDS_PROGRAM_STRING); PROP_BOOL(IDS_CLIPBOARDMONITORING_STRING, GetPropValue<PP_PCLIPBOARDMONITORING>(GetConfig())); PROP_UINT(IDS_CLIPBOARDINTERVAL_STRING, GetPropValue<PP_PMONITORSCANINTERVAL>(GetConfig())); - PROP_BOOL(IDS_AUTORUNPROGRAM_STRING, GetPropValue<PP_PRELOADAFTERRESTART>(GetConfig())); + PROP_BOOL(IDS_AUTORUNPROGRAM_STRING, IsAutorunEnabled()); + PROP_COMBO(IDS_CFG_CHECK_FOR_UPDATES_FREQUENCY, IDS_UPDATE_FREQUENCIES, GetPropValue<PP_PCHECK_FOR_UPDATES_FREQUENCY>(GetConfig())); PROP_COMBO(IDS_CFG_UPDATECHANNEL, IDS_CFGUPDATECHANNELITEMS_STRING, GetPropValue<PP_PUPDATECHANNEL>(GetConfig())); PROP_COMBO(IDS_CFG_USE_SECURE_CONNECTION, IDS_SECURE_CONNECTION_TYPES, GetPropValue<PP_PUPDATE_USE_SECURE_CONNECTION>(GetConfig())); @@ -370,7 +372,7 @@ SKIP_SEPARATOR(iPosition); SetPropValue<PP_PCLIPBOARDMONITORING>(rConfig, GetBoolProp(iPosition++)); SetPropValue<PP_PMONITORSCANINTERVAL>(rConfig, GetUintProp(iPosition++)); - SetPropValue<PP_PRELOADAFTERRESTART>(rConfig, GetBoolProp(iPosition++)); + EnableAutorun(GetBoolProp(iPosition++)); SetPropValue<PP_PCHECK_FOR_UPDATES_FREQUENCY>(rConfig, GetIndexProp(iPosition++)); SetPropValue<PP_PUPDATECHANNEL>(rConfig, GetBoolProp(iPosition++)); @@ -533,6 +535,33 @@ return strText; } +bool COptionsDlg::IsAutorunEnabled() const +{ + try + { + return m_autoRun.IsAutorunEnabled(); + } + catch (const std::exception& e) + { + LOG_ERROR(m_spLog) << L"Failed to determine if autorun is enabled. Assuming it is not. Error: " << e.what(); + return false; + } +} + +bool COptionsDlg::EnableAutorun(bool bEnable) +{ + try + { + m_autoRun.SetAutorun(bEnable); + return true; + } + catch (const std::exception& e) + { + LOG_ERROR(m_spLog) << L"Failed to change autorun to '" << bEnable << "'. Error: " << e.what(); + return false; + } +} + bool COptionsDlg::GetBoolProp(int iPosition) { int iSel = 0; Index: src/ch/OptionsDlg.h =================================================================== diff -u -r19b135b50b55b75d008526a799344bda9a62dc22 -rf84eecda89d8734da9790a2b8d4a54d344e40c46 --- src/ch/OptionsDlg.h (.../OptionsDlg.h) (revision 19b135b50b55b75d008526a799344bda9a62dc22) +++ src/ch/OptionsDlg.h (.../OptionsDlg.h) (revision f84eecda89d8734da9790a2b8d4a54d344e40c46) @@ -20,6 +20,7 @@ #define __OPTIONSDLG_H__ #include "PropertyListCtrl.h" +#include "AppAutorun.h" #define WM_CONFIGNOTIFY WM_USER+13 @@ -52,6 +53,9 @@ bool GetBoolProp(int iPosition); CString MakeCompoundString(UINT uiBase, int iCount, LPCTSTR lpszSeparator); + bool IsAutorunEnabled() const; + bool EnableAutorun(bool bEnable); + // Generated message map functions BOOL OnInitDialog() override; void OnOK() override; @@ -62,6 +66,7 @@ private: logger::TLoggerPtr m_spLog; + AppAutorun m_autoRun; static bool m_bLock; // locker std::vector<CString> m_cvRecent; Index: src/ch/TCommandLineParser.cpp =================================================================== diff -u -rb165add706c4fab9d783f0564b1dd398492da491 -rf84eecda89d8734da9790a2b8d4a54d344e40c46 --- src/ch/TCommandLineParser.cpp (.../TCommandLineParser.cpp) (revision b165add706c4fab9d783f0564b1dd398492da491) +++ src/ch/TCommandLineParser.cpp (.../TCommandLineParser.cpp) (revision f84eecda89d8734da9790a2b8d4a54d344e40c46) @@ -43,8 +43,7 @@ po::options_description desc(""); desc.add_options() - ("ImportTaskDefinition", po::wvalue< std::vector<std::wstring> >(), "") - ("EnableLaunchAtStartup", po::wvalue<bool>(), ""); + ("ImportTaskDefinition", po::wvalue< std::vector<std::wstring> >(), ""); po::variables_map vm; po::store(po::wcommand_line_parser(args).options(desc).run(), m_mapVariables); @@ -74,14 +73,3 @@ } } } - -bool TCommandLineParser::HasSystemStartupOption() const -{ - return m_mapVariables.count("EnableLaunchAtStartup") == 1; -} - -bool TCommandLineParser::IsSystemStartupEnabled() const -{ - bool bValue = m_mapVariables["EnableLaunchAtStartup"].as<bool>(); - return bValue; -} Index: src/ch/TCommandLineParser.h =================================================================== diff -u -r694e362bf3ce049a7bbba8b4cf442d07e6741901 -rf84eecda89d8734da9790a2b8d4a54d344e40c46 --- src/ch/TCommandLineParser.h (.../TCommandLineParser.h) (revision 694e362bf3ce049a7bbba8b4cf442d07e6741901) +++ src/ch/TCommandLineParser.h (.../TCommandLineParser.h) (revision f84eecda89d8734da9790a2b8d4a54d344e40c46) @@ -43,10 +43,6 @@ bool HasTaskDefinitionPath() const; void GetTaskDefinitionPaths(chcore::TPathContainer& vPaths) const; - // enable run at system startup - bool HasSystemStartupOption() const; - bool IsSystemStartupEnabled() const; - private: boost::program_options::variables_map m_mapVariables; }; Index: src/ch/ch.cpp =================================================================== diff -u -r2e4eacb299f21d06196fe13140b4b0d095abdca9 -rf84eecda89d8734da9790a2b8d4a54d344e40c46 --- src/ch/ch.cpp (.../ch.cpp) (revision 2e4eacb299f21d06196fe13140b4b0d095abdca9) +++ src/ch/ch.cpp (.../ch.cpp) (revision f84eecda89d8734da9790a2b8d4a54d344e40c46) @@ -325,17 +325,6 @@ EnableHtmlHelp(); - // ================================= Handle early command line options ======================================== - if(m_cmdLineParser.HasCommandLineParams() && m_cmdLineParser.HasSystemStartupOption()) - { - SetPropValue<PP_PRELOADAFTERRESTART>(rCfg, m_cmdLineParser.IsSystemStartupEnabled()); - rCfg.Write(); - - SetAutorun(GetPropValue<PP_PRELOADAFTERRESTART>(rCfg)); - - return FALSE; - } - // ================================= Checking for running instances of CH ======================================== // check instance - return false if it's the second one LOG_INFO(m_spLog) << _T("Checking for other running instances of Copy Handler"); Index: src/ch/ch.vc140.vcxproj =================================================================== diff -u -rf981afc8ac2d761719c05ab88ebb32d7ca2db54a -rf84eecda89d8734da9790a2b8d4a54d344e40c46 --- src/ch/ch.vc140.vcxproj (.../ch.vc140.vcxproj) (revision f981afc8ac2d761719c05ab88ebb32d7ca2db54a) +++ src/ch/ch.vc140.vcxproj (.../ch.vc140.vcxproj) (revision f84eecda89d8734da9790a2b8d4a54d344e40c46) @@ -522,6 +522,7 @@ <ClInclude Include="..\common\TShellExtIpcConfigDataProvider.h" /> <ClInclude Include="..\common\TShellExtMenuConfig.h" /> <ClInclude Include="..\common\version.h" /> + <ClInclude Include="AppAutorun.h" /> <ClInclude Include="AsyncHttpFile.h" /> <ClInclude Include="CDragDropComboEx.h" /> <ClInclude Include="CDragDropListCtrl.h" /> @@ -776,6 +777,7 @@ <ClCompile Include="..\common\TRegistry.cpp" /> <ClCompile Include="..\common\TShellExtIpcConfigDataProvider.cpp" /> <ClCompile Include="..\common\TShellExtMenuConfig.cpp" /> + <ClCompile Include="AppAutorun.cpp" /> <ClCompile Include="AsyncHttpFile.cpp" /> <ClCompile Include="CDragDropComboEx.cpp" /> <ClCompile Include="CDragDropListCtrl.cpp" /> Index: src/ch/ch.vc140.vcxproj.filters =================================================================== diff -u -r6609ba39811176f4803f0556db3da30e9e457b9d -rf84eecda89d8734da9790a2b8d4a54d344e40c46 --- src/ch/ch.vc140.vcxproj.filters (.../ch.vc140.vcxproj.filters) (revision 6609ba39811176f4803f0556db3da30e9e457b9d) +++ src/ch/ch.vc140.vcxproj.filters (.../ch.vc140.vcxproj.filters) (revision f84eecda89d8734da9790a2b8d4a54d344e40c46) @@ -257,6 +257,9 @@ <ClInclude Include="..\common\TRegistry.h"> <Filter>Source Files\Shared</Filter> </ClInclude> + <ClInclude Include="AppAutorun.h"> + <Filter>Source Files\Tools</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <ClCompile Include="..\common\TShellExtMenuConfig.cpp"> @@ -436,6 +439,9 @@ <ClCompile Include="..\common\TRegistry.cpp"> <Filter>Source Files\Shared</Filter> </ClCompile> + <ClCompile Include="AppAutorun.cpp"> + <Filter>Source Files\Tools</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <None Include="res\ch.rc2">