1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- extern "C" EXPORT void winrt_initialize()
- {
- winrt::init_apartment(winrt::apartment_type::multi_threaded);
- }
- extern "C" EXPORT void winrt_uninitialize()
- {
- winrt::uninit_apartment();
- }
- static winrt::Windows::System::DispatcherQueueController
- CreateDispatcherQueueController()
- {
- DispatcherQueueOptions options{sizeof(DispatcherQueueOptions),
- DQTYPE_THREAD_CURRENT, DQTAT_COM_STA};
- winrt::Windows::System::DispatcherQueueController controller{nullptr};
- winrt::check_hresult(CreateDispatcherQueueController(
- options,
- reinterpret_cast<
- ABI::Windows::System::IDispatcherQueueController **>(
- winrt::put_abi(controller))));
- return controller;
- }
- struct winrt_disaptcher {
- winrt::Windows::System::DispatcherQueueController controller{nullptr};
- };
- extern "C" EXPORT struct winrt_disaptcher *winrt_dispatcher_init()
- {
- struct winrt_disaptcher *dispatcher = NULL;
- try {
- if (winrt::Windows::Foundation::Metadata::ApiInformation::
- IsApiContractPresent(
- L"Windows.Foundation.UniversalApiContract",
- 5)) {
- winrt::Windows::System::DispatcherQueueController
- controller = CreateDispatcherQueueController();
- dispatcher = new struct winrt_disaptcher;
- dispatcher->controller = std::move(controller);
- }
- } catch (const winrt::hresult_error &err) {
- blog(LOG_ERROR, "winrt_dispatcher_init (0x%08X): %ls",
- (int32_t)err.code(), err.message().c_str());
- } catch (...) {
- blog(LOG_ERROR, "winrt_dispatcher_init (0x%08X)",
- (int32_t)winrt::to_hresult());
- }
- return dispatcher;
- }
- extern "C" EXPORT void
- winrt_dispatcher_free(struct winrt_disaptcher *dispatcher)
- try {
- delete dispatcher;
- } catch (const winrt::hresult_error &err) {
- blog(LOG_ERROR, "winrt_dispatcher_free (0x%08X): %ls",
- (int32_t)err.code(), err.message().c_str());
- } catch (...) {
- blog(LOG_ERROR, "winrt_dispatcher_free (0x%08X)",
- (int32_t)winrt::to_hresult());
- }
|