/* Return false if this program has been started from "Program Files" directory (which is an indicator that it has been installed) or from the last known location of a SumatraPDF installation: */ bool IsRunningInPortableMode() { // cache the result so that it will be consistent during the lifetime of the process static int sCacheIsPortable = -1; // -1 == uninitialized, 0 == installed, 1 == portable if (sCacheIsPortable != -1) return sCacheIsPortable != 0; sCacheIsPortable = 1; if (HasBeenInstalled()) { sCacheIsPortable = 0; return false; } ScopedMem<WCHAR> exePath(GetExePath()); ScopedMem<WCHAR> programFilesDir(GetSpecialFolder(CSIDL_PROGRAM_FILES)); // if we can't get a path, assume we're not running from "Program Files" if (!exePath || !programFilesDir) return true; // check if one of the exePath's parent directories is "Program Files" // (or a junction to it) WCHAR *baseName; while ((baseName = (WCHAR*)path::GetBaseName(exePath)) > exePath) { baseName[-1] = '\0'; if (path::IsSame(programFilesDir, exePath)) { sCacheIsPortable = 0; return false; } } return true; }
bool IsRunningInPortableMode() { // cache the result so that it will be consistent during the lifetime of the process static int sCacheIsPortable = -1; // -1 == uninitialized, 0 == installed, 1 == portable if (sCacheIsPortable != -1) return sCacheIsPortable != 0; sCacheIsPortable = 1; ScopedMem<WCHAR> exePath(GetExePath()); if (!exePath) return true; // if we can't get a path, assume we're not running from "Program Files" ScopedMem<WCHAR> installedPath; // cf. GetInstallationDir() in installer\Installer.cpp installedPath.Set(ReadRegStr(HKEY_CURRENT_USER, REG_PATH_UNINST, L"InstallLocation")); if (!installedPath) installedPath.Set(ReadRegStr(HKEY_LOCAL_MACHINE, REG_PATH_UNINST, L"InstallLocation")); if (installedPath) { if (!str::EndsWithI(installedPath.Get(), L".exe")) installedPath.Set(path::Join(installedPath.Get(), path::GetBaseName(exePath))); if (path::IsSame(installedPath, exePath)) { sCacheIsPortable = 0; return false; } } ScopedMem<WCHAR> programFilesDir(GetSpecialFolder(CSIDL_PROGRAM_FILES)); if (!programFilesDir) return true; // check if one of the exePath's parent directories is "Program Files" // (or a junction to it) WCHAR *baseName; while ((baseName = (WCHAR*)path::GetBaseName(exePath)) > exePath) { baseName[-1] = '\0'; if (path::IsSame(programFilesDir, exePath)) { sCacheIsPortable = 0; return false; } } return true; }