为 Microsoft 商店打包适用于 Windows 的 Gtk3 应用程序

Posted

技术标签:

【中文标题】为 Microsoft 商店打包适用于 Windows 的 Gtk3 应用程序【英文标题】:Packaging a Gtk3 app for Windows for the Microsoft store 【发布时间】:2021-08-12 23:44:17 【问题描述】:

是否有人成功地为 Microsoft 商店打包了适用于 Windows 的 Gtk3 应用程序?

我现在正在玩这个:

Visual Studio 2019; 通过 vcpkg 获得 Gtk3/Gtkmm 发行版; C++ 应用程序; VS 应用打包项目。

应用程序自行运行良好。然后我将其打包,然后运行 ​​MSIX 捆绑包安装程序。然后当我运行已安装的应用程序时,它会启动但是

对话框中出现拒绝访问错误; 应用程序出现图标损坏和颜色不正确(主题错误或没有主题)。

我已经跟踪了与 Gio-2.DLL 相关的错误,它尝试生成子进程,看起来与创建 dbus 服务器/会话有关 (??)。我相信子进程(dbus 服务器?)会启动,但随后会尝试执行 Windows 为应用程序创建的沙箱中不允许的操作。

有人吗?

【问题讨论】:

【参考方案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 中得到解决,在这种情况下,解决方法是不必要的。

【讨论】:

以上是关于为 Microsoft 商店打包适用于 Windows 的 Gtk3 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

适用于 Windows 应用商店的等宽字体

将桌面桥 UWP 应用与 Win32 应用正确打包

如何打包适用于 iOS 的 Kivy 应用程序?

微软将于 2023 年第一季度关闭适用于商业和教育的 Microsoft Store

用于 Microsoft 商店的 Javascript Windows 10 UWP 应用程序中的 decodeAudioData 失败

是否有适用于 Windows Vista/7/8 的新 Midi API?