diff options
22 files changed, 173 insertions, 164 deletions
diff --git a/base/win/scoped_comptr_unittest.cc b/base/win/scoped_comptr_unittest.cc index 54dcfc0..d8d12be8 100644 --- a/base/win/scoped_comptr_unittest.cc +++ b/base/win/scoped_comptr_unittest.cc @@ -7,6 +7,7 @@ #include <shlobj.h> #include "base/memory/scoped_ptr.h" +#include "base/win/scoped_com_initializer.h" #include "testing/gtest/include/gtest/gtest.h" namespace base { @@ -33,50 +34,47 @@ TEST(ScopedComPtrTest, ScopedComPtr) { EXPECT_TRUE(memcmp(&ScopedComPtr<IUnknown>::iid(), &IID_IUnknown, sizeof(IID)) == 0); - EXPECT_TRUE(SUCCEEDED(::CoInitialize(NULL))); - - { - ScopedComPtr<IUnknown> unk; - EXPECT_TRUE(SUCCEEDED(unk.CreateInstance(CLSID_ShellLink))); - ScopedComPtr<IUnknown> unk2; - unk2.Attach(unk.Detach()); - EXPECT_TRUE(unk == NULL); - EXPECT_TRUE(unk2 != NULL); - - ScopedComPtr<IMalloc> mem_alloc; - EXPECT_TRUE(SUCCEEDED(CoGetMalloc(1, mem_alloc.Receive()))); - - ScopedComPtr<IUnknown> qi_test; - EXPECT_HRESULT_SUCCEEDED(mem_alloc.QueryInterface(IID_IUnknown, - reinterpret_cast<void**>(qi_test.Receive()))); - EXPECT_TRUE(qi_test.get() != NULL); - qi_test.Release(); - - // test ScopedComPtr& constructor - ScopedComPtr<IMalloc> copy1(mem_alloc); - EXPECT_TRUE(copy1.IsSameObject(mem_alloc)); - EXPECT_FALSE(copy1.IsSameObject(unk2)); // unk2 is valid but different - EXPECT_FALSE(copy1.IsSameObject(unk)); // unk is NULL - - IMalloc* naked_copy = copy1.Detach(); - copy1 = naked_copy; // Test the =(T*) operator. - naked_copy->Release(); - - copy1.Release(); - EXPECT_FALSE(copy1.IsSameObject(unk2)); // unk2 is valid, copy1 is not - - // test Interface* constructor - ScopedComPtr<IMalloc> copy2(static_cast<IMalloc*>(mem_alloc)); - EXPECT_TRUE(copy2.IsSameObject(mem_alloc)); - - EXPECT_TRUE(SUCCEEDED(unk.QueryFrom(mem_alloc))); - EXPECT_TRUE(unk != NULL); - unk.Release(); - EXPECT_TRUE(unk == NULL); - EXPECT_TRUE(unk.IsSameObject(copy1)); // both are NULL - } - - ::CoUninitialize(); + base::win::ScopedCOMInitializer com_initializer; + EXPECT_TRUE(com_initializer.succeeded()); + + ScopedComPtr<IUnknown> unk; + EXPECT_TRUE(SUCCEEDED(unk.CreateInstance(CLSID_ShellLink))); + ScopedComPtr<IUnknown> unk2; + unk2.Attach(unk.Detach()); + EXPECT_TRUE(unk == NULL); + EXPECT_TRUE(unk2 != NULL); + + ScopedComPtr<IMalloc> mem_alloc; + EXPECT_TRUE(SUCCEEDED(CoGetMalloc(1, mem_alloc.Receive()))); + + ScopedComPtr<IUnknown> qi_test; + EXPECT_HRESULT_SUCCEEDED(mem_alloc.QueryInterface(IID_IUnknown, + reinterpret_cast<void**>(qi_test.Receive()))); + EXPECT_TRUE(qi_test.get() != NULL); + qi_test.Release(); + + // test ScopedComPtr& constructor + ScopedComPtr<IMalloc> copy1(mem_alloc); + EXPECT_TRUE(copy1.IsSameObject(mem_alloc)); + EXPECT_FALSE(copy1.IsSameObject(unk2)); // unk2 is valid but different + EXPECT_FALSE(copy1.IsSameObject(unk)); // unk is NULL + + IMalloc* naked_copy = copy1.Detach(); + copy1 = naked_copy; // Test the =(T*) operator. + naked_copy->Release(); + + copy1.Release(); + EXPECT_FALSE(copy1.IsSameObject(unk2)); // unk2 is valid, copy1 is not + + // test Interface* constructor + ScopedComPtr<IMalloc> copy2(static_cast<IMalloc*>(mem_alloc)); + EXPECT_TRUE(copy2.IsSameObject(mem_alloc)); + + EXPECT_TRUE(SUCCEEDED(unk.QueryFrom(mem_alloc))); + EXPECT_TRUE(unk != NULL); + unk.Release(); + EXPECT_TRUE(unk == NULL); + EXPECT_TRUE(unk.IsSameObject(copy1)); // both are NULL } TEST(ScopedComPtrTest, ScopedComPtrVector) { diff --git a/base/win/shortcut_unittest.cc b/base/win/shortcut_unittest.cc index e0e4387..e13bc28 100644 --- a/base/win/shortcut_unittest.cc +++ b/base/win/shortcut_unittest.cc @@ -4,9 +4,6 @@ #include "base/win/shortcut.h" -#include <windows.h> -#include <objbase.h> - #include <string> #include "base/file_path.h" @@ -14,6 +11,7 @@ #include "base/scoped_temp_dir.h" #include "base/test/test_file_util.h" #include "base/test/test_shortcut_win.h" +#include "base/win/scoped_com_initializer.h" #include "testing/gtest/include/gtest/gtest.h" namespace { @@ -27,8 +25,6 @@ class ShortcutTest : public testing::Test { ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); ASSERT_TRUE(temp_dir_2_.CreateUniqueTempDir()); - EXPECT_EQ(S_OK, CoInitialize(NULL)); - link_file_ = temp_dir_.path().Append(L"My Link.lnk"); // Shortcut 1's properties @@ -65,10 +61,7 @@ class ShortcutTest : public testing::Test { } } - virtual void TearDown() OVERRIDE { - CoUninitialize(); - } - + base::win::ScopedCOMInitializer com_initializer_; ScopedTempDir temp_dir_; ScopedTempDir temp_dir_2_; diff --git a/chrome/browser/history/history_publisher.h b/chrome/browser/history/history_publisher.h index 51d6504..5585290 100644 --- a/chrome/browser/history/history_publisher.h +++ b/chrome/browser/history/history_publisher.h @@ -11,6 +11,7 @@ #include "base/string16.h" #if defined(OS_WIN) +#include "base/win/scoped_com_initializer.h" #include "base/win/scoped_comptr.h" #include "history_indexer.h" #endif @@ -71,6 +72,8 @@ class HistoryPublisher { // The Registry key under HKCU where the indexers need to register their // CLSID. static const wchar_t* const kRegKeyRegisteredIndexersInfo; + + base::win::ScopedCOMInitializer com_initializer_; #endif // The format of the thumbnail we pass to indexers. diff --git a/chrome/browser/history/history_publisher_win.cc b/chrome/browser/history/history_publisher_win.cc index ac04a87..706b6e6 100644 --- a/chrome/browser/history/history_publisher_win.cc +++ b/chrome/browser/history/history_publisher_win.cc @@ -5,7 +5,6 @@ #include "chrome/browser/history/history_publisher.h" #include <atlsafe.h> -#include <objbase.h> #include <oleauto.h> #include <wtypes.h> @@ -70,11 +69,9 @@ double HistoryPublisher::TimeToUTCVariantTime(const base::Time& time) { } HistoryPublisher::HistoryPublisher() { - CoInitialize(NULL); } HistoryPublisher::~HistoryPublisher() { - CoUninitialize(); } bool HistoryPublisher::Init() { diff --git a/chrome/browser/ui/views/accessibility/browser_views_accessibility_browsertest.cc b/chrome/browser/ui/views/accessibility/browser_views_accessibility_browsertest.cc index b152c81..319cd91 100644 --- a/chrome/browser/ui/views/accessibility/browser_views_accessibility_browsertest.cc +++ b/chrome/browser/ui/views/accessibility/browser_views_accessibility_browsertest.cc @@ -5,6 +5,7 @@ #include <oleacc.h> #include "base/utf_string_conversions.h" +#include "base/win/scoped_com_initializer.h" #include "base/win/scoped_comptr.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_window.h" @@ -55,15 +56,18 @@ class BrowserViewsAccessibilityTest : public InProcessBrowserTest { void TestAccessibilityInfo(IAccessible* acc_obj, std::wstring name, int32 role); + + private: + base::win::ScopedCOMInitializer com_initializer_; + + DISALLOW_COPY_AND_ASSIGN(BrowserViewsAccessibilityTest); }; BrowserViewsAccessibilityTest::BrowserViewsAccessibilityTest() { ui::win::CreateATLModuleIfNeeded(); - ::CoInitialize(NULL); } BrowserViewsAccessibilityTest::~BrowserViewsAccessibilityTest() { - ::CoUninitialize(); } BrowserWindowTesting* BrowserViewsAccessibilityTest::GetBrowserWindowTesting() { diff --git a/chrome/installer/setup/setup_main.cc b/chrome/installer/setup/setup_main.cc index 9d621b5..2219e45 100644 --- a/chrome/installer/setup/setup_main.cc +++ b/chrome/installer/setup/setup_main.cc @@ -21,6 +21,7 @@ #include "base/utf_string_conversions.h" #include "base/values.h" #include "base/win/registry.h" +#include "base/win/scoped_com_initializer.h" #include "base/win/scoped_comptr.h" #include "base/win/scoped_handle.h" #include "base/win/win_util.h" @@ -1317,26 +1318,6 @@ bool ShowRebootDialog() { return true; } -// Class to manage COM initialization and uninitialization -class AutoCom { - public: - AutoCom() : initialized_(false) { } - ~AutoCom() { - if (initialized_) CoUninitialize(); - } - bool Init(bool system_install) { - if (CoInitializeEx(NULL, COINIT_APARTMENTTHREADED) != S_OK) { - LOG(ERROR) << "COM initialization failed."; - return false; - } - initialized_ = true; - return true; - } - - private: - bool initialized_; -}; - // Returns the Custom information for the client identified by the exe path // passed in. This information is used for crash reporting. google_breakpad::CustomClientInfo* GetCustomInfo(const wchar_t* exe_path) { @@ -1444,8 +1425,8 @@ int WINAPI wWinMain(HINSTANCE instance, HINSTANCE prev_instance, } // Initialize COM for use later. - AutoCom auto_com; - if (!auto_com.Init(system_install)) { + base::win::ScopedCOMInitializer com_initializer; + if (!com_initializer.succeeded()) { installer_state.WriteInstallerResult( installer::OS_ERROR, IDS_INSTALL_OS_ERROR_BASE, NULL); return installer::OS_ERROR; diff --git a/chrome/installer/util/run_all_unittests.cc b/chrome/installer/util/run_all_unittests.cc index 79a2e4b..faa57e62 100644 --- a/chrome/installer/util/run_all_unittests.cc +++ b/chrome/installer/util/run_all_unittests.cc @@ -2,9 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include <shlobj.h> - #include "base/test/test_suite.h" +#include "base/win/scoped_com_initializer.h" #include "chrome/common/chrome_paths.h" int main(int argc, char** argv) { @@ -13,10 +12,6 @@ int main(int argc, char** argv) { // Register Chrome Path provider so that we can get test data dir. chrome::RegisterPathProvider(); - if (CoInitializeEx(NULL, COINIT_APARTMENTTHREADED) != S_OK) - return -1; - - int ret = test_suite.Run(); - CoUninitialize(); - return ret; + base::win::ScopedCOMInitializer com_initializer; + return com_initializer.succeeded() ? test_suite.Run() : -1; } diff --git a/chrome/service/cloud_print/print_system_win.cc b/chrome/service/cloud_print/print_system_win.cc index 6e92465..adc20c7 100644 --- a/chrome/service/cloud_print/print_system_win.cc +++ b/chrome/service/cloud_print/print_system_win.cc @@ -15,6 +15,7 @@ #include "base/utf_string_conversions.h" #include "base/win/object_watcher.h" #include "base/win/scoped_bstr.h" +#include "base/win/scoped_com_initializer.h" #include "base/win/scoped_comptr.h" #include "base/win/scoped_hdc.h" #include "chrome/common/child_process_logging.h" @@ -389,8 +390,7 @@ class PrintSystemWin : public PrintSystem { : last_page_printed_(-1), job_id_(-1), delegate_(NULL), - saved_dc_(0), - should_couninit_(false) { + saved_dc_(0) { } ~Core() {} @@ -514,10 +514,8 @@ class PrintSystemWin : public PrintSystem { job_progress_watcher_.StopWatching(); job_progress_watcher_.StartWatching(job_progress_event_.Get(), this); } - if (done && should_couninit_) { - CoUninitialize(); - should_couninit_ = false; - } + if (done) + com_initializer_.reset(); } virtual void OnRenderPDFPagesToMetafileFailed() OVERRIDE { @@ -595,8 +593,9 @@ class PrintSystemWin : public PrintSystem { job_progress_event_.Set(CreateEvent(NULL, TRUE, FALSE, NULL)); if (!job_progress_event_.Get()) return false; - should_couninit_ = SUCCEEDED(CoInitializeEx(NULL, - COINIT_MULTITHREADED)); + scoped_ptr<base::win::ScopedCOMInitializer> com_initializer( + new base::win::ScopedCOMInitializer( + base::win::ScopedCOMInitializer::kMTA)); base::win::ScopedComPtr<IXpsPrintJobStream> doc_stream; base::win::ScopedComPtr<IXpsPrintJobStream> print_ticket_stream; bool ret = false; @@ -628,6 +627,7 @@ class PrintSystemWin : public PrintSystem { if (SUCCEEDED(doc_stream->Close())) { job_progress_watcher_.StartWatching(job_progress_event_.Get(), this); + com_initializer_.swap(com_initializer); ret = true; } } @@ -639,10 +639,6 @@ class PrintSystemWin : public PrintSystem { xps_print_job_->Cancel(); xps_print_job_.Release(); } - if (should_couninit_) { - CoUninitialize(); - should_couninit_ = false; - } } return ret; } @@ -662,7 +658,7 @@ class PrintSystemWin : public PrintSystem { base::win::ScopedHandle job_progress_event_; base::win::ObjectWatcher job_progress_watcher_; base::win::ScopedComPtr<IXpsPrintJob> xps_print_job_; - bool should_couninit_; + scoped_ptr<base::win::ScopedCOMInitializer> com_initializer_; DISALLOW_COPY_AND_ASSIGN(Core); }; diff --git a/chrome_frame/test/reliability/reliability_test_suite.h b/chrome_frame/test/reliability/reliability_test_suite.h index e245ba5..af58003 100644 --- a/chrome_frame/test/reliability/reliability_test_suite.h +++ b/chrome_frame/test/reliability/reliability_test_suite.h @@ -5,8 +5,7 @@ #ifndef CHROME_FRAME_TEST_RELIABILITY_RELIABILITY_TEST_SUITE_H_ #define CHROME_FRAME_TEST_RELIABILITY_RELIABILITY_TEST_SUITE_H_ -#include <objbase.h> - +#include "base/win/scoped_com_initializer.h" #include "chrome_frame/test/reliability/page_load_test.h" #include "chrome/test/ui/ui_test_suite.h" @@ -15,17 +14,22 @@ class ReliabilityTestSuite : public UITestSuite { ReliabilityTestSuite(int argc, char** argv) : UITestSuite(argc, argv) { } - protected: - virtual void Initialize() { - CoInitializeEx(NULL, COINIT_MULTITHREADED); + private: + virtual void Initialize() OVERRIDE { + com_initializer_.reset(new base::win::ScopedCOMInitializer( + base::win::ScopedCOMInitializer::kMTA)); SetPageRange(*CommandLine::ForCurrentProcess()); UITestSuite::Initialize(); } - virtual void Shutdown() { - CoUninitialize(); + virtual void Shutdown() OVERRIDE { UITestSuite::Shutdown(); + com_initializer_.reset(); } + + scoped_ptr<base::win::ScopedCOMInitializer> com_initializer_; + + DISALLOW_COPY_AND_ASSIGN(ReliabilityTestSuite); }; #endif // CHROME_FRAME_TEST_RELIABILITY_RELIABILITY_TEST_SUITE_H_ diff --git a/chrome_frame/update_launcher.cc b/chrome_frame/update_launcher.cc index b2d23123..439626d 100644 --- a/chrome_frame/update_launcher.cc +++ b/chrome_frame/update_launcher.cc @@ -7,6 +7,7 @@ #include <windows.h> #include <Shellapi.h> +#include "base/win/scoped_com_initializer.h" #include "google_update/google_update_idl.h" namespace { @@ -54,15 +55,14 @@ std::wstring GetUpdateCommandFromArguments(const wchar_t* command_line) { DWORD LaunchUpdateCommand(const std::wstring& command) { DWORD exit_code = kLaunchFailureExitCode; - HRESULT hr = ::CoInitialize(NULL); - - if (SUCCEEDED(hr)) { + base::win::ScopedCOMInitializer com_initializer; + if (com_initializer.succeeded()) { IProcessLauncher* ipl = NULL; HANDLE process = NULL; - hr = ::CoCreateInstance(__uuidof(ProcessLauncherClass), NULL, - CLSCTX_ALL, __uuidof(IProcessLauncher), - reinterpret_cast<void**>(&ipl)); + HRESULT hr = ::CoCreateInstance(__uuidof(ProcessLauncherClass), NULL, + CLSCTX_ALL, __uuidof(IProcessLauncher), + reinterpret_cast<void**>(&ipl)); if (SUCCEEDED(hr)) { ULONG_PTR phandle = NULL; @@ -80,8 +80,6 @@ DWORD LaunchUpdateCommand(const std::wstring& command) { ::CloseHandle(process); if (ipl) ipl->Release(); - - ::CoUninitialize(); } return exit_code; diff --git a/chrome_frame/urlmon_url_request.cc b/chrome_frame/urlmon_url_request.cc index bf441b3..535debb 100644 --- a/chrome_frame/urlmon_url_request.cc +++ b/chrome_frame/urlmon_url_request.cc @@ -1455,9 +1455,9 @@ UrlmonUrlRequestManager::ResourceFetcherThread::~ResourceFetcherThread() { } void UrlmonUrlRequestManager::ResourceFetcherThread::Init() { - CoInitialize(NULL); + com_initializer_.reset(new base::win::ScopedCOMInitializer()); } void UrlmonUrlRequestManager::ResourceFetcherThread::CleanUp() { - CoUninitialize(); + com_initializer_.reset(); } diff --git a/chrome_frame/urlmon_url_request.h b/chrome_frame/urlmon_url_request.h index b74b881..94027ff 100644 --- a/chrome_frame/urlmon_url_request.h +++ b/chrome_frame/urlmon_url_request.h @@ -16,6 +16,12 @@ #include "chrome_frame/urlmon_moniker.h" #include "chrome_frame/utils.h" +namespace base { +namespace win { +class ScopedCOMInitializer; +} +} + class UrlmonUrlRequest; class UrlmonUrlRequestManager @@ -30,6 +36,11 @@ class UrlmonUrlRequestManager virtual void Init(); virtual void CleanUp(); + + private: + scoped_ptr<base::win::ScopedCOMInitializer> com_initializer_; + + DISALLOW_COPY_AND_ASSIGN(ResourceFetcherThread); }; // Contains the privacy information for all requests issued by this instance. diff --git a/chrome_frame/utils.h b/chrome_frame/utils.h index a741b65..389a8f5 100644 --- a/chrome_frame/utils.h +++ b/chrome_frame/utils.h @@ -17,6 +17,7 @@ #include "base/metrics/histogram.h" #include "base/string16.h" #include "base/threading/thread.h" +#include "base/win/scoped_com_initializer.h" #include "base/win/scoped_comptr.h" #include "googleurl/src/gurl.h" #include "ui/gfx/rect.h" @@ -399,22 +400,26 @@ STDMETHODIMP QueryInterfaceIfDelegateSupports(void* obj, REFIID iid, class STAThread : public base::Thread { public: explicit STAThread(const char *name) : Thread(name) {} - ~STAThread() { + virtual ~STAThread() { Stop(); } + bool Start() { return StartWithOptions(Options(MessageLoop::TYPE_UI, 0)); } - protected: - // Called just prior to starting the message loop - virtual void Init() { - ::CoInitialize(0); + + private: + virtual void Init() OVERRIDE { + com_initializer_.reset(new base::win::ScopedCOMInitializer()); } - // Called just after the message loop ends - virtual void CleanUp() { - ::CoUninitialize(); + virtual void CleanUp() OVERRIDE { + com_initializer_.reset(); } + + scoped_ptr<base::win::ScopedCOMInitializer> com_initializer_; + + DISALLOW_COPY_AND_ASSIGN(STAThread); }; std::wstring GuidToString(const GUID& guid); diff --git a/content/browser/accessibility/browser_accessibility_win_unittest.cc b/content/browser/accessibility/browser_accessibility_win_unittest.cc index 264d8a2..bca0f99 100644 --- a/content/browser/accessibility/browser_accessibility_win_unittest.cc +++ b/content/browser/accessibility/browser_accessibility_win_unittest.cc @@ -3,6 +3,7 @@ // found in the LICENSE file. #include "base/memory/scoped_ptr.h" +#include "base/win/scoped_com_initializer.h" #include "base/win/scoped_comptr.h" #include "content/browser/accessibility/browser_accessibility_manager.h" #include "content/browser/accessibility/browser_accessibility_win.h" @@ -51,15 +52,17 @@ VARIANT CreateI4Variant(LONG value) { } class BrowserAccessibilityTest : public testing::Test { - protected: + public: + BrowserAccessibilityTest() {} + + private: virtual void SetUp() { ui::win::CreateATLModuleIfNeeded(); - ::CoInitialize(NULL); } - virtual void TearDown() { - ::CoUninitialize(); - } + base::win::ScopedCOMInitializer com_initializer_; + + DISALLOW_COPY_AND_ASSIGN(BrowserAccessibilityTest); }; // Test that BrowserAccessibilityManager correctly releases the tree of diff --git a/content/browser/accessibility/cross_platform_accessibility_browsertest.cc b/content/browser/accessibility/cross_platform_accessibility_browsertest.cc index 2b52e613..7135283 100644 --- a/content/browser/accessibility/cross_platform_accessibility_browsertest.cc +++ b/content/browser/accessibility/cross_platform_accessibility_browsertest.cc @@ -19,6 +19,7 @@ #if defined(OS_WIN) #include <atlbase.h> #include <atlcom.h> +#include "base/win/scoped_com_initializer.h" #include "ui/base/win/atl_module.h" #endif @@ -66,19 +67,26 @@ class CrossPlatformAccessibilityBrowserTest : public ContentBrowserTest { const AccessibilityNodeData::IntAttribute attr); bool GetBoolAttr(const AccessibilityNodeData& node, const AccessibilityNodeData::BoolAttribute attr); + + private: +#if defined(OS_WIN) + scoped_ptr<base::win::ScopedCOMInitializer> com_initializer_; +#endif + + DISALLOW_COPY_AND_ASSIGN(CrossPlatformAccessibilityBrowserTest); }; void CrossPlatformAccessibilityBrowserTest::SetUpInProcessBrowserTestFixture() { #if defined(OS_WIN) ui::win::CreateATLModuleIfNeeded(); - ::CoInitialize(NULL); + com_initializer_.reset(new base::win::ScopedCOMInitializer()); #endif } void CrossPlatformAccessibilityBrowserTest::TearDownInProcessBrowserTestFixture() { #if defined(OS_WIN) - ::CoUninitialize(); + com_initializer_.reset(); #endif } diff --git a/content/browser/browser_process_sub_thread.cc b/content/browser/browser_process_sub_thread.cc index 19a9e15..942ecd9 100644 --- a/content/browser/browser_process_sub_thread.cc +++ b/content/browser/browser_process_sub_thread.cc @@ -4,10 +4,6 @@ #include "content/browser/browser_process_sub_thread.h" -#if defined(OS_WIN) -#include <Objbase.h> -#endif - #include "base/debug/leak_tracker.h" #include "base/threading/thread_restrictions.h" #include "build/build_config.h" @@ -16,6 +12,10 @@ #include "net/url_request/url_fetcher.h" #include "net/url_request/url_request.h" +#if defined(OS_WIN) +#include "base/win/scoped_com_initializer.h" +#endif + namespace content { BrowserProcessSubThread::BrowserProcessSubThread(BrowserThread::ID identifier) @@ -28,8 +28,7 @@ BrowserProcessSubThread::~BrowserProcessSubThread() { void BrowserProcessSubThread::Init() { #if defined(OS_WIN) - // Initializes the COM library on the current thread. - CoInitialize(NULL); + com_initializer_.reset(new base::win::ScopedCOMInitializer()); #endif notification_service_.reset(new NotificationServiceImpl()); @@ -54,9 +53,7 @@ void BrowserProcessSubThread::CleanUp() { notification_service_.reset(); #if defined(OS_WIN) - // Closes the COM library on the current thread. CoInitialize must - // be balanced by a corresponding call to CoUninitialize. - CoUninitialize(); + com_initializer_.reset(); #endif } diff --git a/content/browser/browser_process_sub_thread.h b/content/browser/browser_process_sub_thread.h index 7efb8af..e006388 100644 --- a/content/browser/browser_process_sub_thread.h +++ b/content/browser/browser_process_sub_thread.h @@ -9,6 +9,14 @@ #include "content/browser/browser_thread_impl.h" #include "content/common/content_export.h" +#if defined(OS_WIN) +namespace base { +namespace win { +class ScopedCOMInitializer; +} +} +#endif + namespace content { class NotificationService; } @@ -38,6 +46,10 @@ class CONTENT_EXPORT BrowserProcessSubThread : public BrowserThreadImpl { // before we call the embedder's CleanUp function. void IOThreadPreCleanUp(); +#if defined (OS_WIN) + scoped_ptr<base::win::ScopedCOMInitializer> com_initializer_; +#endif + // Each specialized thread has its own notification service. scoped_ptr<NotificationService> notification_service_; diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index 8bc872e..912b382 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc @@ -7,10 +7,6 @@ #include "content/browser/renderer_host/render_process_host_impl.h" -#if defined(OS_WIN) -#include <objbase.h> // For CoInitialize/CoUninitialize. -#endif - #include <algorithm> #include <limits> #include <vector> @@ -122,6 +118,7 @@ #include "webkit/plugins/plugin_switches.h" #if defined(OS_WIN) +#include "base/win/scoped_com_initializer.h" #include "content/common/font_cache_dispatcher_win.h" #endif @@ -142,14 +139,14 @@ class RendererMainThread : public base::Thread { channel_id_(channel_id) { } - ~RendererMainThread() { + virtual ~RendererMainThread() { Stop(); } protected: virtual void Init() { #if defined(OS_WIN) - CoInitialize(NULL); + com_initializer_.reset(new base::win::ScopedCOMInitializer()); #endif render_process_.reset(new RenderProcessImpl()); @@ -160,7 +157,7 @@ class RendererMainThread : public base::Thread { render_process_.reset(); #if defined(OS_WIN) - CoUninitialize(); + com_initializer_.reset(); #endif // It's a little lame to manually set this flag. But the single process // RendererThread will receive the WM_QUIT. We don't need to assert on @@ -176,7 +173,12 @@ class RendererMainThread : public base::Thread { private: std::string channel_id_; +#if defined(OS_WIN) + scoped_ptr<base::win::ScopedCOMInitializer> com_initializer_; +#endif scoped_ptr<RenderProcess> render_process_; + + DISALLOW_COPY_AND_ASSIGN(RendererMainThread); }; namespace { diff --git a/content/plugin/plugin_main.cc b/content/plugin/plugin_main.cc index 696a5d6..d31f016 100644 --- a/content/plugin/plugin_main.cc +++ b/content/plugin/plugin_main.cc @@ -5,7 +5,6 @@ #include "build/build_config.h" #if defined(OS_WIN) -#include <objbase.h> #include <windows.h> #endif @@ -22,6 +21,7 @@ #include "content/public/common/main_function_params.h" #if defined(OS_WIN) +#include "base/win/scoped_com_initializer.h" #include "content/public/common/injection_test_win.h" #include "sandbox/win/src/sandbox.h" #elif defined(OS_POSIX) && !defined(OS_MACOSX) @@ -118,7 +118,8 @@ int PluginMain(const content::MainFunctionParams& parameters) { sandbox::TargetServices* target_services = parameters.sandbox_info->target_services; - CoInitialize(NULL); + base::win::ScopedCOMInitializer com_initializer; + DVLOG(1) << "Started plugin with " << parsed_command_line.GetCommandLineString(); @@ -183,7 +184,6 @@ int PluginMain(const content::MainFunctionParams& parameters) { #if defined(OS_WIN) DestroyIMEForFlash(); - CoUninitialize(); #endif return 0; diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc index d38c527..67779a0 100644 --- a/net/url_request/url_request_unittest.cc +++ b/net/url_request/url_request_unittest.cc @@ -64,6 +64,7 @@ #include "testing/platform_test.h" #if defined(OS_WIN) +#include "base/win/scoped_com_initializer.h" #include "base/win/windows_version.h" #endif @@ -702,7 +703,7 @@ TEST_F(URLRequestTest, ResolveShortcutTest) { std::wstring lnk_path = app_path.value() + L".lnk"; - CoInitialize(NULL); + base::win::ScopedCOMInitializer com_initializer; // Temporarily create a shortcut for test IShellLink* shell = NULL; @@ -751,7 +752,6 @@ TEST_F(URLRequestTest, ResolveShortcutTest) { // Clean the shortcut DeleteFile(lnk_path.c_str()); - CoUninitialize(); } #endif // defined(OS_WIN) diff --git a/remoting/host/setup/daemon_controller_win.cc b/remoting/host/setup/daemon_controller_win.cc index 814fa40..ca33966 100644 --- a/remoting/host/setup/daemon_controller_win.cc +++ b/remoting/host/setup/daemon_controller_win.cc @@ -22,6 +22,7 @@ #include "base/utf_string_conversions.h" #include "base/values.h" #include "base/win/scoped_bstr.h" +#include "base/win/scoped_com_initializer.h" #include "base/win/scoped_comptr.h" #include "base/win/windows_version.h" #include "remoting/base/scoped_sc_handle_win.h" @@ -71,10 +72,12 @@ class ComThread : public base::Thread { bool Start(); - protected: + private: virtual void Init() OVERRIDE; virtual void CleanUp() OVERRIDE; + scoped_ptr<base::win::ScopedCOMInitializer> com_initializer_; + DISALLOW_COPY_AND_ASSIGN(ComThread); }; @@ -183,11 +186,11 @@ bool ComThread::Start() { } void ComThread::Init() { - CoInitialize(NULL); + com_initializer_.reset(new base::win::ScopedCOMInitializer()); } void ComThread::CleanUp() { - CoUninitialize(); + com_initializer_.reset(); } DaemonControllerWin::DaemonControllerWin() diff --git a/ui/base/dialogs/base_shell_dialog_win.cc b/ui/base/dialogs/base_shell_dialog_win.cc index 8d6072d..fa339cb 100644 --- a/ui/base/dialogs/base_shell_dialog_win.cc +++ b/ui/base/dialogs/base_shell_dialog_win.cc @@ -7,6 +7,7 @@ #include <algorithm> #include "base/threading/thread.h" +#include "base/win/scoped_com_initializer.h" namespace { @@ -17,11 +18,12 @@ class ShellDialogThread : public base::Thread { ShellDialogThread() : base::Thread("Chrome_ShellDialogThread") { } ~ShellDialogThread(); - protected: + private: void Init(); void CleanUp(); - private: + scoped_ptr<base::win::ScopedCOMInitializer> com_initializer_; + DISALLOW_COPY_AND_ASSIGN(ShellDialogThread); }; @@ -30,14 +32,11 @@ ShellDialogThread::~ShellDialogThread() { } void ShellDialogThread::Init() { - // Initializes the COM library on the current thread. - CoInitialize(NULL); + com_initializer_.reset(new base::win::ScopedCOMInitializer()); } void ShellDialogThread::CleanUp() { - // Closes the COM library on the current thread. CoInitialize must - // be balanced by a corresponding call to CoUninitialize. - CoUninitialize(); + com_initializer_.reset(); } } // namespace |