1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2020 The WebRTC project authors. All Rights Reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/win/hstring.h" 12*d9f75844SAndroid Build Coastguard Worker 13*d9f75844SAndroid Build Coastguard Worker #include <libloaderapi.h> 14*d9f75844SAndroid Build Coastguard Worker #include <winstring.h> 15*d9f75844SAndroid Build Coastguard Worker 16*d9f75844SAndroid Build Coastguard Worker namespace { 17*d9f75844SAndroid Build Coastguard Worker LoadComBaseFunction(const char * function_name)18*d9f75844SAndroid Build Coastguard WorkerFARPROC LoadComBaseFunction(const char* function_name) { 19*d9f75844SAndroid Build Coastguard Worker static HMODULE const handle = 20*d9f75844SAndroid Build Coastguard Worker ::LoadLibraryExW(L"combase.dll", nullptr, LOAD_LIBRARY_SEARCH_SYSTEM32); 21*d9f75844SAndroid Build Coastguard Worker return handle ? ::GetProcAddress(handle, function_name) : nullptr; 22*d9f75844SAndroid Build Coastguard Worker } 23*d9f75844SAndroid Build Coastguard Worker GetWindowsCreateString()24*d9f75844SAndroid Build Coastguard Workerdecltype(&::WindowsCreateString) GetWindowsCreateString() { 25*d9f75844SAndroid Build Coastguard Worker static decltype(&::WindowsCreateString) const function = 26*d9f75844SAndroid Build Coastguard Worker reinterpret_cast<decltype(&::WindowsCreateString)>( 27*d9f75844SAndroid Build Coastguard Worker LoadComBaseFunction("WindowsCreateString")); 28*d9f75844SAndroid Build Coastguard Worker return function; 29*d9f75844SAndroid Build Coastguard Worker } 30*d9f75844SAndroid Build Coastguard Worker GetWindowsDeleteString()31*d9f75844SAndroid Build Coastguard Workerdecltype(&::WindowsDeleteString) GetWindowsDeleteString() { 32*d9f75844SAndroid Build Coastguard Worker static decltype(&::WindowsDeleteString) const function = 33*d9f75844SAndroid Build Coastguard Worker reinterpret_cast<decltype(&::WindowsDeleteString)>( 34*d9f75844SAndroid Build Coastguard Worker LoadComBaseFunction("WindowsDeleteString")); 35*d9f75844SAndroid Build Coastguard Worker return function; 36*d9f75844SAndroid Build Coastguard Worker } 37*d9f75844SAndroid Build Coastguard Worker 38*d9f75844SAndroid Build Coastguard Worker } // namespace 39*d9f75844SAndroid Build Coastguard Worker 40*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 41*d9f75844SAndroid Build Coastguard Worker ResolveCoreWinRTStringDelayload()42*d9f75844SAndroid Build Coastguard Workerbool ResolveCoreWinRTStringDelayload() { 43*d9f75844SAndroid Build Coastguard Worker return GetWindowsDeleteString() && GetWindowsCreateString(); 44*d9f75844SAndroid Build Coastguard Worker } 45*d9f75844SAndroid Build Coastguard Worker CreateHstring(const wchar_t * src,uint32_t len,HSTRING * out_hstr)46*d9f75844SAndroid Build Coastguard WorkerHRESULT CreateHstring(const wchar_t* src, uint32_t len, HSTRING* out_hstr) { 47*d9f75844SAndroid Build Coastguard Worker decltype(&::WindowsCreateString) create_string_func = 48*d9f75844SAndroid Build Coastguard Worker GetWindowsCreateString(); 49*d9f75844SAndroid Build Coastguard Worker if (!create_string_func) 50*d9f75844SAndroid Build Coastguard Worker return E_FAIL; 51*d9f75844SAndroid Build Coastguard Worker return create_string_func(src, len, out_hstr); 52*d9f75844SAndroid Build Coastguard Worker } 53*d9f75844SAndroid Build Coastguard Worker DeleteHstring(HSTRING hstr)54*d9f75844SAndroid Build Coastguard WorkerHRESULT DeleteHstring(HSTRING hstr) { 55*d9f75844SAndroid Build Coastguard Worker decltype(&::WindowsDeleteString) delete_string_func = 56*d9f75844SAndroid Build Coastguard Worker GetWindowsDeleteString(); 57*d9f75844SAndroid Build Coastguard Worker if (!delete_string_func) 58*d9f75844SAndroid Build Coastguard Worker return E_FAIL; 59*d9f75844SAndroid Build Coastguard Worker return delete_string_func(hstr); 60*d9f75844SAndroid Build Coastguard Worker } 61*d9f75844SAndroid Build Coastguard Worker 62*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc 63