Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(30)

Side by Side Diff: chrome/app/google_update_client.cc

Issue 345036: Rewrite of chrome.exe startup code... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/app/google_update_client.h ('k') | chrome/browser/google_update.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2006-2008 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 "chrome/app/google_update_client.h"
6
7 #include <shlobj.h>
8 #include <strsafe.h>
9
10 #include "chrome/app/client_util.h"
11 #include "chrome/installer/util/google_update_constants.h"
12 #include "chrome/installer/util/install_util.h"
13
14 namespace {
15 // Allocates the out param on success.
16 bool GoogleUpdateEnvQueryStr(const wchar_t* key_name, wchar_t** out) {
17 DWORD count = ::GetEnvironmentVariableW(key_name, NULL, 0);
18 if (!count) {
19 return false;
20 }
21 wchar_t* value = new wchar_t[count + 1];
22 if (!::GetEnvironmentVariableW(key_name, value, count)) {
23 delete[] value;
24 return false;
25 }
26 *out = value;
27 return true;
28 }
29 } // anonymous namespace
30
31 namespace google_update {
32
33 GoogleUpdateClient::GoogleUpdateClient() : version_(NULL) {
34 }
35
36 GoogleUpdateClient::~GoogleUpdateClient() {
37 delete[] version_;
38 }
39
40 std::wstring GoogleUpdateClient::GetDLLFullPath() {
41 return client_util::GetDLLPath(dll_, dll_path_);
42 }
43
44 std::wstring GoogleUpdateClient::GetDLLPath() {
45 return dll_path_;
46 }
47
48 const wchar_t* GoogleUpdateClient::GetVersion() const {
49 return version_;
50 }
51
52 bool GoogleUpdateClient::Launch(HINSTANCE instance,
53 sandbox::SandboxInterfaceInfo* sandbox,
54 wchar_t* command_line,
55 const char* entry_name,
56 int* ret) {
57 if (client_util::FileExists(dll_path_)) {
58 // Setting the version on the environment block is a 'best effort' deal.
59 // It enables Google Update running on a child to load the same DLL version.
60 ::SetEnvironmentVariableW(google_update::kEnvProductVersionKey, version_);
61 }
62
63 // The dll can be in the exe's directory or in the current directory.
64 // Use the alternate search path to be sure that it's not trying to load it
65 // calling application's directory.
66 HINSTANCE dll_handle = ::LoadLibraryEx(dll_.c_str(), NULL,
67 LOAD_WITH_ALTERED_SEARCH_PATH);
68 if (NULL == dll_handle) {
69 unsigned long err = GetLastError();
70 if (err) {
71 WCHAR message[500] = {0};
72 FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0,
73 reinterpret_cast<LPWSTR>(&message), 500, NULL);
74 ::OutputDebugStringW(message);
75 }
76 return false;
77 }
78
79 bool did_launch = false;
80 client_util::DLL_MAIN entry = reinterpret_cast<client_util::DLL_MAIN>(
81 ::GetProcAddress(dll_handle, entry_name));
82 if (NULL != entry) {
83 // record did_run "dr" in client state
84 std::wstring key_path(google_update::kRegPathClientState);
85 key_path.append(L"\\" + guid_);
86 HKEY reg_key;
87 if (::RegCreateKeyEx(HKEY_CURRENT_USER, key_path.c_str(), 0, NULL,
88 REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL,
89 &reg_key, NULL) == ERROR_SUCCESS) {
90 const wchar_t kVal[] = L"1";
91 ::RegSetValueEx(reg_key, google_update::kRegDidRunField, 0, REG_SZ,
92 reinterpret_cast<const BYTE *>(kVal), sizeof(kVal));
93 ::RegCloseKey(reg_key);
94 }
95
96 int rc = (entry)(instance, sandbox, command_line);
97 if (ret) {
98 *ret = rc;
99 }
100 did_launch = true;
101 }
102 #ifdef PURIFY
103 // We should never unload the dll. There is only risk and no gain from
104 // doing so. The singleton dtors have been already run by AtExitManager.
105 ::FreeLibrary(dll_handle);
106 #endif
107 return did_launch;
108 }
109
110 bool GoogleUpdateClient::Init(const wchar_t* client_guid,
111 const wchar_t* client_dll) {
112 dll_path_ = client_util::GetExecutablePath();
113 guid_.assign(client_guid);
114 dll_.assign(client_dll);
115 bool ret = false;
116 if (!guid_.empty()) {
117 if (GoogleUpdateEnvQueryStr(google_update::kEnvProductVersionKey,
118 &version_)) {
119 ret = true;
120 } else {
121 std::wstring key(google_update::kRegPathClients);
122 key.append(L"\\" + guid_);
123 if (client_util::GetChromiumVersion(dll_path_.c_str(),
124 key.c_str(),
125 &version_))
126 ret = true;
127 }
128 }
129
130 if (version_) {
131 dll_path_.append(version_);
132 }
133 return ret;
134 }
135 } // namespace google_update
OLDNEW
« no previous file with comments | « chrome/app/google_update_client.h ('k') | chrome/browser/google_update.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698