0

我希望 UWP xaml 应用程序(称为my_xaml_app)和 UWP Core 应用程序(称为my_core_app)在各自线程中的同一程序中运行。

到目前为止,我已经尝试了以下方法:

my_core_app::my_core_app()
{
    ViewProviderFactory viewProviderFactory;
    winrt::Windows::ApplicationModel::Core::CoreApplication::Run(viewProviderFactory);
}

winrt::Windows::Foundation::IAsyncAction init_core_app()
 {
        co_await winrt::resume_background();
        my_core_app coreApp;
 }

int __stdcall wWinMain(HINSTANCE, HINSTANCE, PWSTR, int)
{
      init_core_app();

      winrt::Windows::UI::Xaml::Application::Start(
      [](auto &&)
      {
          winrt::make<winrt::my_xaml_app::implementation::App>();
      });

      return 0;
 }

我没有包括如何实例化my_core_appmy_xaml_app实例化的详细信息,但您可以假设它们可以正常工作,因为如果我从主线程单独启动它们,它们会正确启动。

在上面的代码中,my_xaml_app正确启动是因为它是从主线程调用的。但是my_core_app无法启动并报告以下错误:

WinRT originate error - 0x8001010E : 'The Application Object must initially be accessed from the multi-thread apartment.'.

The application called an interface that was marshalled for a different thread.

Microsoft C++ exception: winrt::hresult_wrong_thread at memory location 0x00000040E4EFE6E8

这是可能的吗?如果可以,怎么做?

4

2 回答 2

-1

最初从主线程初始化,您可以使用CoreDispatcher

下面是从CoreDispatcher运行应用程序的文档中的示例代码

// App.cpp
...
// An implementation of IFrameworkView::Run.
void Run()
{
    CoreWindow window{ CoreWindow::GetForCurrentThread() };
    window.Activate();

    CoreDispatcher dispatcher{ window.Dispatcher() };
    dispatcher.ProcessEvents(CoreProcessEventsOption::ProcessUntilQuit);
}

// The CoreApplication::Run call indirectly calls the App::Run function above.
int __stdcall wWinMain(HINSTANCE, HINSTANCE, PWSTR, int)
{
    CoreApplication::Run(App());
}
于 2018-09-17T20:59:02.817 回答
-1

错误消息显示了 COM 公寓如何工作的内部结构。单个进程只能有一个 MTA 单元。在同一个进程中不可能有两个 MTA 线程。

也就是说,您可以在另一个进程中启动应用程序,这样就可以了。

于 2018-10-15T17:28:42.010 回答