1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include <windows.h> 6 7 #include "apps/app_host/binaries_installer.h" 8 #include "apps/app_host/update.h" 9 #include "base/at_exit.h" 10 #include "base/command_line.h" 11 #include "base/files/file_path.h" 12 #include "base/logging.h" 13 #include "base/process/launch.h" 14 #include "chrome/installer/launcher_support/chrome_launcher_support.h" 15 16 int APIENTRY wWinMain(HINSTANCE, HINSTANCE, wchar_t*, int) { 17 base::AtExitManager exit_manager; 18 19 // Initialize the commandline singleton from the environment. 20 CommandLine::Init(0, NULL); 21 22 base::FilePath chrome_exe(chrome_launcher_support::GetAnyChromePath()); 23 if (chrome_exe.empty()) { 24 LOG(INFO) << "No Chrome executable could be found. Let's install it."; 25 HRESULT hr = app_host::InstallBinaries(); 26 if (FAILED(hr)) { 27 LOG(ERROR) << "Failed to install the Chrome Binaries. Error: " << hr; 28 return 1; 29 } else { 30 chrome_exe = chrome_launcher_support::GetAnyChromePath(); 31 if (chrome_exe.empty()) { 32 LOG(ERROR) << "Failed to find the Chrome Binaries despite a " 33 << "'successful' installation."; 34 return 1; 35 } 36 } 37 } 38 39 CommandLine chrome_exe_command_line(chrome_exe); 40 chrome_exe_command_line.AppendArguments( 41 *CommandLine::ForCurrentProcess(), false); 42 // Launch Chrome before checking for update, for faster user experience. 43 bool launch_result = base::LaunchProcess(chrome_exe_command_line, 44 base::LaunchOptions(), NULL); 45 if (launch_result) 46 LOG(INFO) << "Delegated to Chrome executable at " << chrome_exe.value(); 47 else 48 LOG(INFO) << "Failed to launch Chrome executable at " << chrome_exe.value(); 49 50 app_host::EnsureAppHostUpToDate(); 51 52 return !launch_result; 53 } 54