如何 open/spawn 在 Windows 中包含 glib/gtkmm 的文件

How to open/spawn a file with glib/gtkmm in Windows

我已经试过了:

  GError *pError = NULL;
  string uri = g_filename_to_uri(file.c_str(), NULL, &pError);
  if (!g_app_info_launch_default_for_uri(uri.c_str(), NULL, &pError)) {
      cout << "Failed to open uri: " << pError->message;
  }

这里我得到错误 "URIs not supported"。我这里创建的uri是不是错了?

我的第二种方法是使用异步命令行生成文件:

  file = quoteStr(file);
  try {
    Glib::spawn_command_line_async(file);
  } catch (Glib::SpawnError error) {
    cout << error.what();
  } catch (Glib::ShellError error) {
    cout << error.what();
  }

此处抛出 Glib::SpawnError 异常,错误为:"Failed to execute helper program (Invalid argument)"。我的意思是,当我在 Windows cmd 中执行引用的绝对文件路径时,它会打开文件(在本例中为 pdf 文件)。这个功能有什么不同吗?

我有一个类似的问题,我不得不放弃使用 glib 来做到这一点,并最终实现了一个简单的跨平台(win,mac 和 linux)兼容的方式来做到这一点:

// open an URI, different for each operating system
void
openuri(const char *url)
{
#ifdef WIN32
    ShellExecute(GetActiveWindow(),
         "open", url, NULL, NULL, SW_SHOWNORMAL);
#elif defined(__APPLE__)
    char buffer[512];
    ::snprintf(buffer, sizeof(buffer), "open %s", url);
    ::system(buffer);
#else
    char buffer[512];
    ::snprintf(buffer, sizeof(buffer), "xdg-open %s", url);
    ::system(buffer);
#endif
}

...它不是很好,但它很小但很管用:)

希望这是相关的并且可以提供真正的答案,而不仅仅是(聪明!)解决方法。

我 运行 陷入困境:g_app_info_launch_default_for_uri()gtk_show_uri_on_window() 启动文件(特别是 HTML 文档)时可执行文件来自我的构建目录 运行。但是,如果我将 exe 复制到另一个目录(用于分发)并从那里 运行 它不起作用。

在后一种情况下,我得到了与您的第二个引述相同的错误:

Failed to execute helper program (Invalid argument)

构建目录不在我的路径中,也没有任何其他原因(它在临时 RAM 驱动器中)。所以我完全莫名其妙。

然后我想到了那个错误...它可能在谈论什么帮助程序?

为什么在从构建目录 运行ning 时可以找到该程序?好吧,我的构建使用了一个 libtool 包装器,它在路径中放置了一堆东西,这样我们就不需要为了测试构建而复制所有 DLL 等。

因此,我去调查了 MSYS2 shell 及其 libtool 包装器可能搜索的路径中是否有任何相关的内容。当然,主要嫌疑人是C:\msys64\mingw64\bin。看看我在那里发现了什么:

gspawn-win64-helper-console.exe

将此可执行文件复制到启动我的应用程序的目录后,我的程序现在可以成功启动 URI,无论其可执行文件当前位于哪个文件夹中。

编辑

在 MSYS2 中更新我的包后,它又回到了同样的错误 - 现在看来 这个 是需要的帮助程序:

gspawn-win64-helper.exe

这实际上更有意义,因为我的应用程序是图形化的,而不是控制台。我想最近这里可能发生了一些变化。您可以分发两者以更加安全。