如何在自己的线程中从Core应用程序启动UWP(Xaml)应用程序?

时间:2018-09-17 20:54:14

标签: xaml uwp com c++-winrt

我想同时在同一程序中的各自线程中运行一个UWP xaml应用程序(称为NotifyIcon Notification = new NotifyIcon(); Notification.BalloonTipIcon = ToolTipIcon.Info; Notification.BalloonTipTitle = "Please Wait"; Notification.BalloonTipText = "Creating Database..."; Notification.Visible = true; Notification.ShowBalloonTip(2000, "Please Wait", "Creating Database...", ToolTipIcon.Info); )和一个UWP Core应用程序(称为my_xaml_app)。

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

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_app的细节,但是您可以假定它们确实可以正常工作,因为如果我从主线程单独启动它们,它们就可以正确启动。

在上面的代码中,my_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.

这是否可行?如果可以的话,怎么办?

2 个答案:

答案 0 :(得分:-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());
}

答案 1 :(得分:-1)

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

也就是说,您可以在另一个过程中启动该应用程序,这将起作用。