C++/WinRT UWP - HRESULT 0x80073D54:进程没有包标识

C++/WinRT UWP - HRESULT 0x80073D54 : The process has no package identity

我正在为 UWP 使用 C++/WinRT。我正在尝试创建一个文件,但在第 11 行抛出异常:

#include "pch.h"

using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::Storage;

IAsyncAction createFile()
{
    try
    {
        StorageFolder local{ ApplicationData::Current().LocalFolder() }; // line 11
        StorageFolder folder = co_await local.CreateFolderAsync(L"myapp", CreationCollisionOption::OpenIfExists);
        StorageFile file = co_await folder.CreateFileAsync(L"file", CreationCollisionOption::ReplaceExisting);

        co_await FileIO::WriteTextAsync(file, L"wide chars here.");
    }
    catch (const winrt::hresult_error& ex)
    {

    }
}

int main()
{
    init_apartment();
    createFile();
}

调试器没有向我显示错误,因为它崩溃了。输出显示

onecoreuap\base\appmodel\statemanager\winrt\lib\windows.storage.applicationdatafactory.server.cpp(126)\Windows.Storage.ApplicationData.dll!00007FFE8A7A1202: (caller: 00007FFE8A799081) ReturnHr(1) tid(3ad8) 80073D54 The process has no package identity.
onecoreuap\base\appmodel\statemanager\winrt\lib\windows.storage.applicationdatafactory.server.cpp(74)\Windows.Storage.ApplicationData.dll!00007FFE8A7990A9: (caller: 00007FF733954323) ReturnHr(2) tid(3ad8) 80073D54 The process has no package identity.
Debug Error!

Program: D:\Developpement\CPP\test\x64\Debug\Tests.exe

abort() has been called

我在 google 上没有找到任何相关信息,那么这个错误是什么意思,我该如何解决?谢谢

这里的问题是 ApplicationData::Current()。 https://docs.microsoft.com/en-us/uwp/api/windows.storage.applicationdata.current?view=winrt-18362

API根据应用程序的身份获取当前应用程序信息。任何 Windows 应用程序都可以具有标识(不必是 UWP),但必须使用打包的安装程序安装才能获得它(a.k.a.MSIX 安装程序)。您可以在此处了解有关打包的 "full trust" 应用程序的更多信息: https://docs.microsoft.com/en-us/windows/msix/desktop/desktop-to-uwp-prepare

您可以在此处使用桌面应用程序打包项目,以便更轻松地打包您的应用程序: https://docs.microsoft.com/en-us/windows/msix/desktop/desktop-to-uwp-packaging-dot-net

综上所述,如果您只是想在应用程序本地数据中打开一个文件,而不涉及打包问题,您可以根据 %appdata% 的位置创建文件夹。如果没有打包的安装程序,您有责任处理清理工作。

所以短期内将您的应用程序设置为打包应用程序需要做更多的工作,但如果这是您想要分发的东西,预先处理好可能会为您节省大量工作长 运行.

如果您想手动设置应用程序文件夹,您可以按照以下步骤开始:

int main()
{
    init_apartment();

    wstring appfolderstring;
    appfolderstring.resize(ExpandEnvironmentStrings(L"%AppData%", nullptr, 0));
    ExpandEnvironmentStringsW(L"%AppData%", &appfolderstring.front(), appfolderstring.size());
    wprintf(L"path: %ls!\n", appfolderstring.c_str());

    // Note: off-by-one issue... ExpandEnvironmentStringsW wants to write the final null character.
    // Leave buffer space to write it above, then trim it off here.
    appfolderstring.resize(appfolderstring.size()-1);

    StorageFolder folder{ StorageFolder::GetFolderFromPathAsync(appfolderstring).get() };
    printf("folder: %ls!\n", folder.DisplayName().c_str());
}