|  | // Copyright 2017 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "base/win/scoped_com_initializer.h" | 
|  |  | 
|  | #include "base/logging.h" | 
|  |  | 
|  | namespace base { | 
|  | namespace win { | 
|  |  | 
|  | ScopedCOMInitializer::ScopedCOMInitializer() { | 
|  | Initialize(COINIT_APARTMENTTHREADED); | 
|  | } | 
|  |  | 
|  | ScopedCOMInitializer::ScopedCOMInitializer(SelectMTA mta) { | 
|  | Initialize(COINIT_MULTITHREADED); | 
|  | } | 
|  |  | 
|  | ScopedCOMInitializer::~ScopedCOMInitializer() { | 
|  | DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); | 
|  | if (Succeeded()) | 
|  | CoUninitialize(); | 
|  | } | 
|  |  | 
|  | bool ScopedCOMInitializer::Succeeded() const { | 
|  | return SUCCEEDED(hr_); | 
|  | } | 
|  |  | 
|  | void ScopedCOMInitializer::Initialize(COINIT init) { | 
|  | DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); | 
|  | hr_ = CoInitializeEx(NULL, init); | 
|  | DCHECK_NE(RPC_E_CHANGED_MODE, hr_) << "Invalid COM thread model change"; | 
|  | } | 
|  |  | 
|  | }  // namespace win | 
|  | }  // namespace base |