【问题标题】:C++/WinRT Console: Initializing BackgroundDownloader crashes the programC++/WinRT 控制台:初始化 BackgroundDownloader 使程序崩溃
【发布时间】:2020-11-23 15:56:54
【问题描述】:

我最近开始玩 C++/WinRT (https://marketplace.visualstudio.com/items?itemName=CppWinRTTeam.cppwinrt101804264)。

我的目标是创建一个下载文件并将其保存到下载文件夹的应用程序。我决定使用 BackgroundDownloader 类 (https://docs.microsoft.com/en-us/uwp/api/windows.networking.backgroundtransfer.backgrounddownloader?view=winrt-19041)。

但是,当我尝试创建 BackgroundDownloader 实例时,我的程序崩溃并出现以下异常: Exception thrown at 0x76729AB2 in MyApp.exe: Microsoft C++ exception: winrt::hresult_error at memory location 0x004FEEF4.


int main()
{
   // The line bellow causes the crash:
   winrt::Windows::Networking::BackgroundTransfer::BackgroundDownloader backgroundDownloader;
}

我做错了什么?

【问题讨论】:

  • 来自documentation“使用Windows.Networking.BackgroundTransfer 通过toast 通知进行通信的应用必须在应用清单文件中声明它支持Toast。” -你遵守合同吗?
  • C++/WinRT 抛出 winrt::hresult_error 可以捕获的错误 docs.microsoft.com/en-us/windows/uwp/cpp-and-winrt-apis/… 我敢打赌 error.code().value 等于 0x8007109A (ERROR_NOT_APPCONTAINER) 因为你的环境不正确(你必须使用打包) .
  • @IInspectable,我的应用程序没有“通过 toast 通知进行通信”,它甚至没有应用程序清单文件(它不是 UWP/打包应用程序)。
  • 如果您使用的是控制台项目或其他桌面项目,您可能不会使用BackgroundDownloader API,因为该API的属性没有列出DualApiPartitionAttribute表示桌面应用程序支持该类型的类。
  • @SimonMourier 不再需要了。 WinRT 可与 Win32 应用程序一起使用

标签: c++ windows-runtime c++-winrt


【解决方案1】:

WinRT 是一组 COM 接口,因此您需要先初始化子系统。 您必须先像这样初始化 WinRT 公寓

winrt::init_apartment();

winrt::init_apartment(apartment_type::single_threaded);

用于 UI 应用程序

【讨论】:

  • 你的建议你试过了吗?它不会改变任何东西。仔细阅读 cmets
  • 我刚刚测试了您的解决方案。遗憾的是,上述选项都不起作用。
  • 我没有使用 BackgroundDownloader 但 init_apartment() 调用是调用 WinRT API 所必需的。这就是我使用 WinRT 的方式
猜你喜欢
  • 2017-08-02
  • 1970-01-01
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多