我试图在按下按钮时退出一个简单的 WinUI3 应用程序:
void MainWindow::myButton_Click(IInspectable const&, RoutedEventArgs const&)
{
winrt::Microsoft::UI::Xaml::Application().Current().Exit();
}
按下按钮时出现以下错误: 知道为什么以及解决方案是什么吗?
KernelBase.dll!00007ff997994ffc() Unknown
[External Code]
> Example.exe!winrt::throw_hresult(const winrt::hresult result) Line 5016 C++
Example.exe!winrt::check_hresult(const winrt::hresult result) Line 5087 C++
Example.exe!winrt::impl::consume_Microsoft_UI_Xaml_IApplicationFactory<winrt::Microsoft::UI::Xaml::IApplicationFactory>::CreateInstance(const winrt::Windows::Foundation::IInspectable & baseInterface, winrt::Windows::Foundation::IInspectable & innerInterface) Line 144 C++
Example.exe!winrt::Microsoft::UI::Xaml::Application::{ctor}::__l2::<lambda>(const winrt::Microsoft::UI::Xaml::IApplicationFactory & f) Line 12262 C++
Example.exe!winrt::impl::call_factory<winrt::Microsoft::UI::Xaml::Application,winrt::Microsoft::UI::Xaml::IApplicationFactory,winrt::Microsoft::UI::Xaml::Application <lambda>(const winrt::Microsoft::UI::Xaml::IApplicationFactory &)>(winrt::Microsoft::UI::Xaml::Application::{ctor}::__l2::winrt::Microsoft::UI::Xaml::Application <lambda>(const winrt::Microsoft::UI::Xaml::IApplicationFactory &) && callback) Line 6397 C++
Example.exe!winrt::Microsoft::UI::Xaml::Application::Application() Line 12262 C++
Example.exe!winrt::Example::implementation::MainWindow::myButton_Click(const winrt::Windows::Foundation::IInspectable & __formal, const winrt::Microsoft::UI::Xaml::RoutedEventArgs & __formal) Line 35 C++
[External Code]
Example.exe!winrt::impl::delegate<winrt::Microsoft::UI::Xaml::RoutedEventHandler,void <lambda>(const winrt::Windows::Foundation::IInspectable &, const winrt::Microsoft::UI::Xaml::RoutedEventArgs &)>::Invoke(void * sender, void * e) Line 4838 C++
[External Code]
Example.exe!winrt::impl::consume_Microsoft_UI_Xaml_IApplicationStatics<winrt::Microsoft::UI::Xaml::IApplicationStatics>::Start(const winrt::Microsoft::UI::Xaml::ApplicationInitializationCallback & callback) Line 158 C++
Example.exe!winrt::Microsoft::UI::Xaml::Application::Start::__l2::<lambda>(const winrt::Microsoft::UI::Xaml::IApplicationStatics & f) Line 12270 C++
Example.exe!winrt::impl::factory_cache_entry<winrt::Microsoft::UI::Xaml::Application,winrt::Microsoft::UI::Xaml::IApplicationStatics>::call<void <lambda>(const winrt::Microsoft::UI::Xaml::IApplicationStatics &) &>(winrt::Microsoft::UI::Xaml::Application::Start::__l2::void <lambda>(const winrt::Microsoft::UI::Xaml::IApplicationStatics &) & callback) Line 6379 C++
Example.exe!winrt::impl::call_factory<winrt::Microsoft::UI::Xaml::Application,winrt::Microsoft::UI::Xaml::IApplicationStatics,void <lambda>(const winrt::Microsoft::UI::Xaml::IApplicationStatics &)>(winrt::Microsoft::UI::Xaml::Application::Start::__l2::void <lambda>(const winrt::Microsoft::UI::Xaml::IApplicationStatics &) && callback) Line 6402 C++
Example.exe!winrt::Microsoft::UI::Xaml::Application::Start(const winrt::Microsoft::UI::Xaml::ApplicationInitializationCallback & callback) Line 12271 C++
[External Code]
问题确实出在提供的代码中。这是带注释的版本:
void MainWindow::myButton_Click(IInspectable const&, RoutedEventArgs const&)
{
winrt::Microsoft::UI::Xaml::Application().Current().Exit();
// ^^^^^^^^^^^^^^^^^^^^^^^^^^ namespace
// ^^^^^^^^^^^ type name
// ^^ c'tor call
}
这会尝试调用
Application
c'tor。然而,Application
是一个singleton,并且对工厂对象的CreateInstace()
调用最终会失败,因为应用程序已经存在。
但这不是代码的目标。它的作者打算访问当前应用程序的
Application
对象。这作为静态 Current
属性公开。 C++/WinRT 将其建模为 Application
类型 Application::Current()
上的静态类成员。
以下为修正版本:
void MainWindow::myButton_Click(IInspectable const&, RoutedEventArgs const&)
{
winrt::Microsoft::UI::Xaml::Application::Current().Exit();
}