C++ 如何在Windows中使用glib/gtkmm打开/生成文件
我已经试过了:C++ 如何在Windows中使用glib/gtkmm打开/生成文件,c++,glib,gtkmm,spawn,C++,Glib,Gtkmm,Spawn,我已经试过了: 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;
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;
}
GError*pError=NULL;
字符串uri=g_filename_to_uri(file.c_str(),NULL,&pError);
if(!g_app_info_launch_default_for_uri(uri.c_str()、NULL和pError)){
cout我也遇到了类似的问题,我不得不放弃使用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
}
…这不是很好,但它很小而且可以工作:)我也遇到了类似的问题,我不得不放弃使用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文档)。但是,如果我将可执行文件复制到另一个目录(用于分发)并从那里运行它,则无法工作
在后一种情况下,我得到了与您的第二个报价相同的错误:
无法执行帮助程序(参数无效)
构建目录不在我的路径中,也不是因为任何其他原因(它在一个临时RAM驱动器中)而特别。所以我完全困惑了
然后我想到了那个错误…它可能在谈论什么帮助程序
为什么从build目录运行时会发现这个程序呢?好吧,我的build使用了一个libtool
包装器,这就在路径中放置了很多东西,这样我们就不需要复制所有DLL等来测试构建
因此,我去调查了MSYS2 shell及其libtool
包装器搜索的路径中是否有任何相关的搜索。当然,主要的嫌疑犯是C:\msys64\mingw64\bin
。看看我在那里找到了什么:
gspawn-win64-helper-console.exe
将此可执行文件复制到启动应用程序的目录后,我的程序现在成功启动URI,而不管其可执行文件当前位于哪个文件夹中
编辑
在MSYS2中更新我的包后,返回到相同的错误-现在看来这是所需的帮助程序:
gspawn-win64-helper.exe
这实际上更有意义,因为我的应用程序是图形化的,而不是控制台。我想最近这里可能发生了一些变化。为了更加安全,您可以分发这两个应用程序。希望这是相关的,可以提供一个真正的答案,而不仅仅是一个(聪明的!)解决方法
我遇到了一个奇怪的情况:当可执行文件从我的构建目录运行时,通过g_app_info_launch_default_for_uri()
或gtk_show_uri_on_window()
启动一个文件(特别是一个HTML文档)。但是,如果我将可执行文件复制到另一个目录(用于分发)并从那里运行它,则无法工作
在后一种情况下,我得到了与您的第二个报价相同的错误:
无法执行帮助程序(参数无效)
构建目录不在我的路径中,也不是因为任何其他原因(它在一个临时RAM驱动器中)而特别。所以我完全困惑了
然后我想到了那个错误…它可能在谈论什么帮助程序
为什么从build目录运行时会发现这个程序呢?好吧,我的build使用了一个libtool
包装器,这就在路径中放置了很多东西,这样我们就不需要复制所有DLL等来测试构建
因此,我去调查了MSYS2 shell及其libtool
包装器搜索的路径中是否有任何相关的搜索。当然,主要的嫌疑犯是C:\msys64\mingw64\bin
。看看我在那里找到了什么:
gspawn-win64-helper-console.exe
将此可执行文件复制到启动应用程序的目录后,我的程序现在成功启动URI,而不管其可执行文件当前位于哪个文件夹中
编辑
在MSYS2中更新我的包后,返回到相同的错误-现在看来这是所需的帮助程序:
gspawn-win64-helper.exe
这实际上更有意义,因为我的应用程序是图形化的,而不是控制台。我想最近这里可能发生了一些变化。为了更加安全,您可以分发这两个版本。是的,这也适用于ofc,但我确实只想将其用作最后一种方法。仍然感谢您提供的示例!这将在中引入任意shell代码执行漏洞您的应用程序(来自url
,它不是转义的)不应使用。通常,系统()
syscall应该不惜一切代价避免;在通常适用的情况下,它很少可以安全地使用。是的,这也适用于ofc,但我确实想将其用作最后一种方法。仍然感谢您提供的示例!这将在您的应用程序中引入任意shell代码执行漏洞(来自url
,它不是转义的)并且不应使用。通常,系统()
syscall应该不惜一切代价避免;在一般适用的情况下,它很少可以安全地使用。我在这里创建的uri是否错误?
如果您不向我们显示该uri,就不可能说了……但是对于第二个问题,请参阅我的答案;我怀疑您需要在路径中有gspawn
帮助程序可执行文件或者与您自己的可执行文件位于同一目录中。当然,这为我解决了相同的问题。我在此处创建的uri是否错误?
如果您不向我们显示该uri,则无法确定该uri…但是对于您的第二个问题,请参阅我的答案;我怀疑您需要将gspawn
帮助程序可执行文件置于您的路径中或与您的路径相同的目录中自己的可执行文件。当然,这为我解决了同样的问题。