Skip to content

Commit

Permalink
Add RoInitialize and RoUninitialize to core_winrt_util
Browse files Browse the repository at this point in the history
This is required to get WinRT support into the task scheduler.

BUG=706479

Change-Id: I54943206beee8388f74b7404f289321cd060a7ba
Reviewed-on: https://chromium-review.googlesource.com/738921
Reviewed-by: Scott Graham <scottmg@chromium.org>
Commit-Queue: Robert Liao <robliao@chromium.org>
Cr-Commit-Position: refs/heads/master@{#511725}
  • Loading branch information
Robert Liao authored and Commit Bot committed Oct 26, 2017
1 parent 42f4117 commit 7e3ab4c
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 8 deletions.
36 changes: 30 additions & 6 deletions base/win/core_winrt_util.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

#include "base/win/core_winrt_util.h"

#include <roapi.h>
#include <robuffer.h>
#include <string.h>
#include <wrl/client.h>
Expand All @@ -19,6 +18,20 @@ void* LoadComBaseFunction(const char* function_name) {
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)>(
Expand All @@ -40,23 +53,34 @@ 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);
}

return GetRoActivateInstanceFunction() && GetRoGetActivationFactoryFunction();
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) {
decltype(&::RoGetActivationFactory) get_factory_func =
GetRoGetActivationFactoryFunction();
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) {
decltype(&::RoActivateInstance) activate_instance_func =
GetRoActivateInstanceFunction();
auto activate_instance_func = GetRoActivateInstanceFunction();
if (!activate_instance_func)
return E_FAIL;
return activate_instance_func(class_id, instance);
Expand Down
5 changes: 5 additions & 0 deletions base/win/core_winrt_util.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

#include <hstring.h>
#include <inspectable.h>
#include <roapi.h>
#include <windef.h>
#include <windows.storage.streams.h>

Expand All @@ -26,6 +27,10 @@ BASE_EXPORT bool ResolveCoreWinRTDelayload();
// The following stubs are provided for when component build is enabled, in
// order to avoid the propagation of delay-loading CoreWinRT to other modules.

BASE_EXPORT HRESULT RoInitialize(RO_INIT_TYPE init_type);

BASE_EXPORT void RoUninitialize();

BASE_EXPORT HRESULT RoGetActivationFactory(HSTRING class_id,
const IID& iid,
void** out_factory);
Expand Down
14 changes: 12 additions & 2 deletions base/win/core_winrt_util_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include <wrl/client.h>

#include "base/strings/string_util.h"
#include "base/win/com_init_util.h"
#include "base/win/scoped_com_initializer.h"
#include "base/win/scoped_hstring.h"
#include "base/win/windows_version.h"
Expand All @@ -21,14 +22,23 @@ const std::vector<uint8_t> KTestBufferData = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
}

TEST(CoreWinrtUtilTest, PreloadFunctions) {
ScopedCOMInitializer com_initializer(ScopedCOMInitializer::kMTA);

if (GetVersion() < VERSION_WIN8)
EXPECT_FALSE(ResolveCoreWinRTDelayload());
else
EXPECT_TRUE(ResolveCoreWinRTDelayload());
}

TEST(CoreWinrtUtilTest, RoInitializeAndUninitialize) {
if (GetVersion() < VERSION_WIN8)
return;

ASSERT_TRUE(ResolveCoreWinRTDelayload());
ASSERT_HRESULT_SUCCEEDED(base::win::RoInitialize(RO_INIT_MULTITHREADED));
AssertComApartmentType(ComApartmentType::MTA);
base::win::RoUninitialize();
AssertComApartmentType(ComApartmentType::NONE);
}

TEST(CoreWinrtUtilTest, CreateBufferFromData) {
ScopedCOMInitializer com_initializer(ScopedCOMInitializer::kMTA);

Expand Down

0 comments on commit 7e3ab4c

Please sign in to comment.