winrt-dispatch.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  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
  10. CreateDispatcherQueueController()
  11. {
  12. DispatcherQueueOptions options{sizeof(DispatcherQueueOptions),
  13. DQTYPE_THREAD_CURRENT, DQTAT_COM_STA};
  14. winrt::Windows::System::DispatcherQueueController controller{nullptr};
  15. winrt::check_hresult(CreateDispatcherQueueController(
  16. options,
  17. reinterpret_cast<
  18. ABI::Windows::System::IDispatcherQueueController **>(
  19. winrt::put_abi(controller))));
  20. return controller;
  21. }
  22. struct winrt_disaptcher {
  23. winrt::Windows::System::DispatcherQueueController controller{nullptr};
  24. };
  25. extern "C" EXPORT struct winrt_disaptcher *winrt_dispatcher_init()
  26. {
  27. struct winrt_disaptcher *dispatcher = NULL;
  28. try {
  29. if (winrt::Windows::Foundation::Metadata::ApiInformation::
  30. IsApiContractPresent(
  31. L"Windows.Foundation.UniversalApiContract",
  32. 5)) {
  33. winrt::Windows::System::DispatcherQueueController
  34. controller = CreateDispatcherQueueController();
  35. dispatcher = new struct winrt_disaptcher;
  36. dispatcher->controller = std::move(controller);
  37. }
  38. } catch (const winrt::hresult_error &err) {
  39. blog(LOG_ERROR, "winrt_dispatcher_init (0x%08X): %ls",
  40. (int32_t)err.code(), err.message().c_str());
  41. } catch (...) {
  42. blog(LOG_ERROR, "winrt_dispatcher_init (0x%08X)",
  43. (int32_t)winrt::to_hresult());
  44. }
  45. return dispatcher;
  46. }
  47. extern "C" EXPORT void
  48. winrt_dispatcher_free(struct winrt_disaptcher *dispatcher)
  49. try {
  50. delete dispatcher;
  51. } catch (const winrt::hresult_error &err) {
  52. blog(LOG_ERROR, "winrt_dispatcher_free (0x%08X): %ls",
  53. (int32_t)err.code(), err.message().c_str());
  54. } catch (...) {
  55. blog(LOG_ERROR, "winrt_dispatcher_free (0x%08X)",
  56. (int32_t)winrt::to_hresult());
  57. }