//********************************************************* // // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF // ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED // TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // PARTICULAR PURPOSE AND NONINFRINGEMENT. // //********************************************************* //! @file //! Utilities for making managing COM server easier #ifndef __WIL_CPPWINRT_REGISTER_COM_SERVER_INCLUDED #define __WIL_CPPWINRT_REGISTER_COM_SERVER_INCLUDED #include #include #include #include namespace wil::details { template struct CppWinRTClassFactory : winrt::implements, IClassFactory, winrt::no_module_lock> { HRESULT __stdcall CreateInstance(IUnknown* outer, GUID const& iid, void** result) noexcept final try { *result = nullptr; if (outer) { return CLASS_E_NOAGGREGATION; } return winrt::make_self().as(iid, result); } CATCH_RETURN() HRESULT __stdcall LockServer(BOOL) noexcept final { return S_OK; } }; template void register_com_server(std::vector& registrations) { DWORD registration{}; winrt::check_hresult(CoRegisterClassObject( winrt::guid_of(), winrt::make>().get(), CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE, ®istration)); // This emplace_back is no-throw as wil::register_com_server already reserves enough capacity registrations.emplace_back(registration); register_com_server(registrations); } template <> void register_com_server(std::vector&) { } } // namespace wil::details namespace wil { template [[nodiscard]] std::vector register_com_server() { std::vector registrations; registrations.reserve(sizeof...(Rest) + 1); details::register_com_server(registrations); // C++17 doesn't provide guaranteed copy elision, but the copy should be elided nonetheless. return registrations; } } // namespace wil #endif