winrt-dispatch.cpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. extern "C" EXPORT void winrt_initialize()
  2. {
  3. winrt::init_apartment(winrt::apartment_type::multi_threaded);
  4. }
  5. extern "C" EXPORT void winrt_uninitialize()
  6. {
  7. winrt::uninit_apartment();
  8. }
  9. static winrt::Windows::System::DispatcherQueueController CreateDispatcherQueueController()
  10. {
  11. DispatcherQueueOptions options{sizeof(DispatcherQueueOptions), DQTYPE_THREAD_CURRENT, DQTAT_COM_STA};
  12. winrt::Windows::System::DispatcherQueueController controller{nullptr};
  13. winrt::check_hresult(CreateDispatcherQueueController(
  14. options,
  15. reinterpret_cast<ABI::Windows::System::IDispatcherQueueController **>(winrt::put_abi(controller))));
  16. return controller;
  17. }
  18. struct winrt_disaptcher {
  19. winrt::Windows::System::DispatcherQueueController controller{nullptr};
  20. };
  21. extern "C" EXPORT struct winrt_disaptcher *winrt_dispatcher_init()
  22. {
  23. struct winrt_disaptcher *dispatcher = NULL;
  24. try {
  25. if (winrt::Windows::Foundation::Metadata::ApiInformation::IsApiContractPresent(
  26. L"Windows.Foundation.UniversalApiContract", 5)) {
  27. winrt::Windows::System::DispatcherQueueController controller =
  28. CreateDispatcherQueueController();
  29. dispatcher = new struct winrt_disaptcher;
  30. dispatcher->controller = std::move(controller);
  31. }
  32. } catch (const winrt::hresult_error &err) {
  33. blog(LOG_ERROR, "winrt_dispatcher_init (0x%08X): %s", (int32_t)err.code(),
  34. winrt::to_string(err.message()).c_str());
  35. } catch (...) {
  36. blog(LOG_ERROR, "winrt_dispatcher_init (0x%08X)", (int32_t)winrt::to_hresult());
  37. }
  38. return dispatcher;
  39. }
  40. extern "C" EXPORT void winrt_dispatcher_free(struct winrt_disaptcher *dispatcher)
  41. try {
  42. delete dispatcher;
  43. } catch (const winrt::hresult_error &err) {
  44. blog(LOG_ERROR, "winrt_dispatcher_free (0x%08X): %s", (int32_t)err.code(),
  45. winrt::to_string(err.message()).c_str());
  46. } catch (...) {
  47. blog(LOG_ERROR, "winrt_dispatcher_free (0x%08X)", (int32_t)winrt::to_hresult());
  48. }