xaml - 如何在自己的线程中从核心应用程序启动 UWP (Xaml) 应用程序?
问题描述
我希望 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_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.
Microsoft C++ exception: winrt::hresult_wrong_thread at memory location 0x00000040E4EFE6E8
这是可能的吗?如果可以,怎么做?
解决方案
最初从主线程初始化,您可以使用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());
}
推荐阅读
- uber-api - 优步旅行端点抛出 HTTP 500
- python - 使用flask和flask-socketio配置nginx、uwsgi
- c# - 从其他线程获取用户输入
- create-react-app - EACCES:权限被拒绝,在 Create-react-app 中引用 pdf 时打开“路径”
- python-3.x - 如何将符号字符变成浮点数
- reporting-services - 如何从 SSIS 包中调用 SSRS Soap?
- javascript - 如何在对象数组中搜索唯一 ID?
- excel - 收件箱中 Outlook 对象的 ReceivedTime 生成错误“对象不支持此属性或方法”
- reactjs - 使用 React 将状态变量从子级传递给父级
- c++ - 以带有重载()的函数/lambda/类作为参数的函数