winrt-dispatch.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  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): %s",
  40. (int32_t)err.code(),
  41. winrt::to_string(err.message()).c_str());
  42. } catch (...) {
  43. blog(LOG_ERROR, "winrt_dispatcher_init (0x%08X)",
  44. (int32_t)winrt::to_hresult());
  45. }
  46. return dispatcher;
  47. }
  48. extern "C" EXPORT void
  49. winrt_dispatcher_free(struct winrt_disaptcher *dispatcher)
  50. try {
  51. delete dispatcher;
  52. } catch (const winrt::hresult_error &err) {
  53. blog(LOG_ERROR, "winrt_dispatcher_free (0x%08X): %s",
  54. (int32_t)err.code(), winrt::to_string(err.message()).c_str());
  55. } catch (...) {
  56. blog(LOG_ERROR, "winrt_dispatcher_free (0x%08X)",
  57. (int32_t)winrt::to_hresult());
  58. }