|  | // 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/core_winrt_util.h" | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | FARPROC LoadComBaseFunction(const char* function_name) { | 
|  | static HMODULE const handle = ::LoadLibrary(L"combase.dll"); | 
|  | return handle ? ::GetProcAddress(handle, function_name) : nullptr; | 
|  | } | 
|  |  | 
|  | decltype(&::RoInitialize) GetRoInitializeFunction() { | 
|  | static decltype(&::RoInitialize) const function = | 
|  | reinterpret_cast<decltype(&::RoInitialize)>( | 
|  | LoadComBaseFunction("RoInitialize")); | 
|  | return function; | 
|  | } | 
|  |  | 
|  | decltype(&::RoUninitialize) GetRoUninitializeFunction() { | 
|  | static decltype(&::RoUninitialize) const function = | 
|  | reinterpret_cast<decltype(&::RoUninitialize)>( | 
|  | LoadComBaseFunction("RoUninitialize")); | 
|  | return function; | 
|  | } | 
|  |  | 
|  | decltype(&::RoActivateInstance) GetRoActivateInstanceFunction() { | 
|  | static decltype(&::RoActivateInstance) const function = | 
|  | reinterpret_cast<decltype(&::RoActivateInstance)>( | 
|  | LoadComBaseFunction("RoActivateInstance")); | 
|  | return function; | 
|  | } | 
|  |  | 
|  | decltype(&::RoGetActivationFactory) GetRoGetActivationFactoryFunction() { | 
|  | static decltype(&::RoGetActivationFactory) const function = | 
|  | reinterpret_cast<decltype(&::RoGetActivationFactory)>( | 
|  | LoadComBaseFunction("RoGetActivationFactory")); | 
|  | return function; | 
|  | } | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | namespace base { | 
|  | namespace win { | 
|  |  | 
|  | bool ResolveCoreWinRTDelayload() { | 
|  | // TODO(finnur): Add AssertIOAllowed once crbug.com/770193 is fixed. | 
|  | return GetRoInitializeFunction() && GetRoUninitializeFunction() && | 
|  | GetRoActivateInstanceFunction() && GetRoGetActivationFactoryFunction(); | 
|  | } | 
|  |  | 
|  | HRESULT RoInitialize(RO_INIT_TYPE init_type) { | 
|  | auto ro_initialize_func = GetRoInitializeFunction(); | 
|  | if (!ro_initialize_func) | 
|  | return E_FAIL; | 
|  | return ro_initialize_func(init_type); | 
|  | } | 
|  |  | 
|  | void RoUninitialize() { | 
|  | auto ro_uninitialize_func = GetRoUninitializeFunction(); | 
|  | if (ro_uninitialize_func) | 
|  | ro_uninitialize_func(); | 
|  | } | 
|  |  | 
|  | HRESULT RoGetActivationFactory(HSTRING class_id, | 
|  | const IID& iid, | 
|  | void** out_factory) { | 
|  | auto get_factory_func = GetRoGetActivationFactoryFunction(); | 
|  | if (!get_factory_func) | 
|  | return E_FAIL; | 
|  | return get_factory_func(class_id, iid, out_factory); | 
|  | } | 
|  |  | 
|  | HRESULT RoActivateInstance(HSTRING class_id, IInspectable** instance) { | 
|  | auto activate_instance_func = GetRoActivateInstanceFunction(); | 
|  | if (!activate_instance_func) | 
|  | return E_FAIL; | 
|  | return activate_instance_func(class_id, instance); | 
|  | } | 
|  |  | 
|  | }  // namespace win | 
|  | }  // namespace base |