【问题标题】:Packaging a Gtk3 app for Windows for the Microsoft store为 Microsoft 商店打包适用于 Windows 的 Gtk3 应用程序
【发布时间】:2021-08-12 23:44:17
【问题描述】:
是否有人成功地为 Microsoft 商店打包了适用于 Windows 的 Gtk3 应用程序?
我现在正在玩这个:
- Visual Studio 2019;
- 通过 vcpkg 获得 Gtk3/Gtkmm 发行版;
- C++ 应用程序;
- VS 应用打包项目。
应用程序自行运行良好。然后我将其打包,然后运行 MSIX 捆绑包安装程序。然后当我运行已安装的应用程序时,它会启动但是:
- 对话框中出现拒绝访问错误;
- 应用程序出现图标损坏和颜色不正确(主题错误或没有主题)。
我已经跟踪了与 Gio-2.DLL 相关的错误,它尝试生成子进程,看起来与创建 dbus 服务器/会话有关 (??)。我相信子进程(dbus 服务器?)会启动,但随后会尝试执行 Windows 为应用程序创建的沙箱中不允许的操作。
有人吗?
【问题讨论】:
标签:
windows
visual-studio-2019
gtk3
vcpkg
【解决方案1】:
经过更多调查,我可能找到了解决方法。我会把它贴在这里,以防它帮助其他人。此解决方法允许为 Windows 制作打包的 Gtk3 应用程序。 Windows 打包应用程序在各种沙箱中运行,对包外资源的访问受到严格限制。
首先,问题是:在初始化期间,Windows 的 Gio-2.DLL 版本会生成一个子进程来充当 DBus 会话守护进程(我可能在这里弄错了术语,因为我对 DBus 不太熟悉) .它只在第一个实例中这样做。如果启动使用 Gio-2.DLL 的应用程序的其他实例,则其他实例将使用第一个实例中的现有守护程序。
为了启动守护进程,Gio-2.DLL 调用 CreateProcess() 来派生一个 RUNDLL32.EXE 子进程,并使用 Gio-2.DLL(即自身)的完整路径,并将 g_win32_run_session_bus() 作为函数的名称打电话。看起来 RUNDLL32.EXE 确实启动成功,因为它能够显示“RUNDLL”错误对话框。但是,它无法将请求的函数调用到 Gio-2.DLL。我收集到,在打包的应用程序中运行时,RUNDLL32.EXE 为加载 DLL 和调用所请求的函数而进行的至少一个系统调用是被禁止的。
目前,我的解决方法是这样的。假设我的应用程序可执行文件名为“myapp.exe”:
- 应用程序包包含 myapp.exe、Gtk3 和依赖项所需的所有 DLL,以及另一个可执行文件“dbus_daemon_launcher.exe”;
- 进入Gtk主循环前,myapp.exe调用CreateProcess()启动dbus_daemon_launcher.exe;
- dbus_daemon_launcher.exe 也与 Gio-2.DLL 链接,并使用 DLL 调用 g_win32_run_session_bus();
- myapp.exe 然后继续启动 Gtk 主循环。由于 Dbus 守护程序已经在运行,因此 Gio-2.DLL 不会尝试调用 RUNDLL32.EXE 来启动它,从而避免了错误。
此解决方法的优点是不需要制作 Gio-2.DLL 的自定义版本。另外,我正在使用 Gtk3:也许这个问题已在较新的 Gtk4 中得到解决,在这种情况下,解决方法是不必要的。