如何 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
这实际上更有意义,因为我的应用程序是图形化的,而不是控制台。我想最近这里可能发生了一些变化。您可以分发两者以更加安全。
我已经试过了:
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
这实际上更有意义,因为我的应用程序是图形化的,而不是控制台。我想最近这里可能发生了一些变化。您可以分发两者以更加安全。