如何打开/产卵与油嘴/ gtkmm的文件在Windows
我已经尝试过:如何打开/产卵与油嘴/ gtkmm的文件在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;
}
在这里,我得到错误“不支持的URI”。我在这里创建的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();
}
这里油嘴:: SpawnError异常与错误抛出:“无法执行帮助程序(无效参数)”。我的意思是,当我在Windows cmd中执行带引号的绝对文件路径时,它会打开文件(在本例中为pdf文件)。这个功能有什么不同吗?
我有一个类似的问题,我不得不放弃使用圆滑做到这一点,最终实现一个简单的跨平台(赢,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
}
...这不是很好,但它很小,它的工作原理:)
是的,它的作用太大了,但我确实希望只用它作为最后一种方法。还是谢谢你的样品! –
这会在您的应用程序中引入任意的shell代码执行漏洞(来自'url',它不会被转义)并且不应该使用**。一般来说,应该尽可能避免使用system()系统调用;很少有可以安全使用的普遍适用的情况。 –
希望这是相关的,可以提供一个真正的答案,而不仅仅是一个(聪明!)的解决方法。
我遇到了一个奇怪的情况:启动一个文件(特别是一个HTML文档)g_app_info_launch_default_for_uri()
或gtk_show_uri_on_window()
工作时,可执行文件从我的生成目录运行。但是,如果我将exe复制到另一个目录(用于分发)并从那里运行,它就不起作用。
在后一种情况下,我得到了同样的错误作为你的第二个报价:
Failed to execute helper program (Invalid argument)
build目录是不是在我的道路,并且也不是特别的任何其他原因(这是一个临时RAM驾驶)。所以我完全感到困惑。
然后我想到了那个错误......它可能在谈论什么帮助程序?
为什么从build目录运行时可以找到该程序?那么,我的构建使用了一个包装器,并且在路径中放置了一些东西,所以我们不需要复制所有的DLL等来测试构建。
因此,我去调查是否有任何相关的东西 - 寻找MSYS2 shell和它的包装器可能搜索的路径。主要嫌犯当然是C:\msys64\mingw64\bin
。再看看我在那里发现:
gspawn-win64-helper-console.exe
复制此可执行文件从我的应用程序的启动目录后,我的程序现在已经成功地启动URI,无论哪个文件夹中的可执行文件目前居住在
。编辑
在MSYS2更新我的包后,又回到了同样的错误 - 因为它现在似乎这是需要帮手:
gspawn-win64-helper.exe
这实际上更有意义,因为我的应用程序是图形的,而不是控制台。我想最近可能有些事情在这里改变。您可以分发这两个以保证安全。
'我在这里创建的URI是错误的吗?'没有你向我们展示这个URI是不可能的......但是对于你的第二个问题,请看我的答案;我怀疑你需要在你的路径或者你自己的可执行文件所在的目录下有'gspawn' helper可执行文件。当然,这为我解决了同样的问题。 –