ilovehellworld 2024-05-08 09:04 采纳率: 58.3%
浏览 7
已结题

msix packaging tool打包问题

大家好! 我的exe安装包,主程序安装在C:\Program Files,
配置文件config.ini安装在C:\Users\Administrator\AppData\Local\ ,
用msix packaging tool打包成msix, 发现主程序安装在C:\Program Files\WindowsApps\myappname\VFS\ProgramFilesX64, 配置文件config.ini安装在C:\Program Files\WindowsApps\myappname\VFS\Local AppData,但是安装msix测试后发现程序找不到config.ini了,怎么办?

  • 写回答

18条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-08 09:04
    关注

    引自免费微信小程序:皆我百晓生

    面对你在使用MSIX Packaging Tool打包C++应用时遇到的配置文件config.ini路径问题,解决方法通常涉及修改你的应用程序以适应MSIX沙盒环境以及正确地访问用户数据文件。MSIX将应用隔离到特定的文件系统虚拟化区域(VFS),确保应用不会随意访问系统其他部分,提高了安全性。下面是几个步骤来帮助你解决这个问题:

    1. 理解MSIX沙盒与文件访问

    • 程序文件:MSIX会将你的程序安装到C:\Program Files\WindowsApps下的特定目录,并通过VFS映射到传统路径(如C:\Program Files)。但直接访问这个路径并不是最佳实践。
    • 用户数据:配置文件应该存储在用户可写且符合UWP/MSIX规范的位置,比如AppDataRoamingLocalState等目录。

    2. 修改配置文件存放位置

    建议做法:将config.iniC:\Users\Administrator\AppData\Local\迁移到应用的本地数据存储目录,即LocalState。这样可以确保在MSIX环境中正确访问且遵循沙盒规则。

    示例代码调整配置文件路径:

    #include <windows.h>
    #include <shlobj_core.h>
    #include <fstream>
    #include <string>
    
    std::wstring GetLocalAppDataFolderPath() {
        PWSTR path;
        auto result = SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &path);
        if (SUCCEEDED(result)) {
            std::wstring localAppDataPath(path);
            CoTaskMemFree(path);
            return localAppDataPath + L"\\your_app_package_name\\LocalState";
        }
        // 错误处理
        return L"";
    }
    
    std::wstring ReadConfig(const std::wstring& filePath) {
        std::wifstream file(filePath);
        if (!file.is_open()) {
            // 处理打开失败的情况
            return L"";
        }
        std::wstring content((std::istreambuf_iterator<wchar_t>(file)), std::istreambuf_iterator<wchar_t>());
        file.close();
        return content;
    }
    
    void WriteConfig(const std::wstring& content, const std::wstring& filePath) {
        std::wofstream file(filePath);
        if (!file.is_open()) {
            // 处理打开失败的情况
            return;
        }
        file << content;
        file.close();
    }
    
    int main() {
        auto localStatePath = GetLocalAppDataFolderPath();
        std::wstring configPath = localStatePath + L"\\config.ini";
    
        // 读取或写入config.ini
        std::wstring configContent = ReadConfig(configPath);
        // 示例:写入一些内容
        WriteConfig(L"[Settings]\nValue=Example", configPath);
    
        return 0;
    }
    

    3. 更新打包配置

    • 在使用MSIX Packaging Tool创建包时,确保没有硬编码原始路径到config.ini。应用内应使用如上代码所示的动态路径来定位配置文件。

    4. 测试与验证

    • 完成上述更改后,重新打包应用为MSIX,并在不同的测试环境中验证配置文件是否能被正确读取和写入。

    注意事项

    • 确保你的应用具有读写其LocalState目录的适当权限。
    • 考虑在应用启动时检查配置文件是否存在,不存在则创建默认配置。

    通过以上步骤,你应该能解决配置文件找不到的问题,同时确保应用遵守MSIX的沙盒安全准则。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(17条)

报告相同问题?

问题事件

  • 系统已结题 5月19日
  • 已采纳回答 5月11日
  • 赞助了问题酬金15元 5月8日
  • 创建了问题 5月8日

悬赏问题

  • ¥15 BP神经网络控制倒立摆
  • ¥20 要这个数学建模编程的代码 并且能完整允许出来结果 完整的过程和数据的结果
  • ¥15 html5+css和javascript有人可以帮吗?图片要怎么插入代码里面啊
  • ¥30 Unity接入微信SDK 无法开启摄像头
  • ¥20 有偿 写代码 要用特定的软件anaconda 里的jvpyter 用python3写
  • ¥20 cad图纸,chx-3六轴码垛机器人
  • ¥15 移动摄像头专网需要解vlan
  • ¥20 access多表提取相同字段数据并合并
  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算