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());
}
我正在为 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());
}