2017-02-24 59 views
1

我已经尝试过:如何打开/产卵与油嘴/ 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文件)。这个功能有什么不同吗?

+0

'我在这里创建的URI是错误的吗?'没有你向我们展示这个URI是不可能的......但是对于你的第二个问题,请看我的答案;我怀疑你需要在你的路径或者你自己的可执行文件所在的目录下有'gspawn' helper可执行文件。当然,这为我解决了同样的问题。 –

回答

0

我有一个类似的问题,我不得不放弃使用圆滑做到这一点,最终实现一个简单的跨平台(赢,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 
} 

...这不是很好,但它很小,它的工作原理:)

+0

是的,它的作用太大了,但我确实希望只用它作为最后一种方法。还是谢谢你的样品! –

+0

这会在您的应用程序中引入任意的shell代码执行漏洞(来自'url',它不会被转义)并且不应该使用**。一般来说,应该尽可能避免使用system()系统调用;很少有可以安全使用的普遍适用的情况。 –

0

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

我遇到了一个奇怪的情况:启动一个文件(特别是一个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 

这实际上更有意义,因为我的应用程序是图形的,而不是控制台。我想最近可能有些事情在这里改变。您可以分发这两个以保证安全。