在C++代码中打开Windows的本地程序文件 desktopEnvironment的部分: X11->desktopEnvironment = DE_UNKNOWN; Atom type; int format; unsigned long length, after; uchar *data = 0; int rc; do { if (!qgetenv("KDE_FULL_SESSION").isEmpty()) { X11->desktopEnvironment = DE_KDE; break; } if (qgetenv("DESKTOP_SESSION") == "gnome") { X11->desktopEnvironment = DE_GNOME; break; } // GNOME_DESKTOP_SESSION_ID is deprecated for some reason, but still check it if (!qgetenv("GNOME_DESKTOP_SESSION_ID").isEmpty()) { X11->desktopEnvironment = DE_GNOME; break; } rc = XGetWindowProperty(X11->display, QX11Info::appRootWindow(), ATOM(_DT_SAVE_MODE), 0, 2, False, XA_STRING, &type, &format, &length, &after, &data); if (rc == Success && length) { if (!strcmp(reinterpret_cast<char *>(data), "xfce4")) { // Pretend that xfce4 is gnome, as it uses the same libraries. // The detection above is stolen from xdg-open. X11->desktopEnvironment = DE_GNOME; break; } // We got the property but it wasn't xfce4. Free data before it gets overwritten. XFree(data); data = 0; } } while(0);

在C++代码中打开Windows的本地程序文件 desktopEnvironment的部分: X11->desktopEnvironment = DE_UNKNOWN; Atom type; int format; unsigned long length, after; uchar *data = 0; int rc; do { if (!qgetenv("KDE_FULL_SESSION").isEmpty()) { X11->desktopEnvironment = DE_KDE; break; } if (qgetenv("DESKTOP_SESSION") == "gnome") { X11->desktopEnvironment = DE_GNOME; break; } // GNOME_DESKTOP_SESSION_ID is deprecated for some reason, but still check it if (!qgetenv("GNOME_DESKTOP_SESSION_ID").isEmpty()) { X11->desktopEnvironment = DE_GNOME; break; } rc = XGetWindowProperty(X11->display, QX11Info::appRootWindow(), ATOM(_DT_SAVE_MODE), 0, 2, False, XA_STRING, &type, &format, &length, &after, &data); if (rc == Success && length) { if (!strcmp(reinterpret_cast<char *>(data), "xfce4")) { // Pretend that xfce4 is gnome, as it uses the same libraries. // The detection above is stolen from xdg-open. X11->desktopEnvironment = DE_GNOME; break; } // We got the property but it wasn't xfce4. Free data before it gets overwritten. XFree(data); data = 0; } } while(0);,c++,windows,explorer,graphviz,windows-explorer,C++,Windows,Explorer,Graphviz,Windows Explorer,跨平台+Linux、+MacOS、+BSD解决方案将是完美的 谢谢。在Windows上,您可以使用。如果您使用Qt开发跨平台应用程序,则可以使用。它当然是跨平台的,就像Qt中的所有东西一样 因为您已经在使用wxWidgets,所以使用Qt仅仅打开一个文件显然是过火了。由于wxWidgets主要是GUI的东西,它可能没有类似的东西,尽管我不能确定,因为我自己从来没有使用过它 尽管如此,如果您想以跨平台的方式实现这一点,下面是Qt为Windows所做的: quintptr returnValue =

跨平台+Linux、+MacOS、+BSD解决方案将是完美的


谢谢。

在Windows上,您可以使用。

如果您使用Qt开发跨平台应用程序,则可以使用。它当然是跨平台的,就像Qt中的所有东西一样

因为您已经在使用wxWidgets,所以使用Qt仅仅打开一个文件显然是过火了。由于wxWidgets主要是GUI的东西,它可能没有类似的东西,尽管我不能确定,因为我自己从来没有使用过它

尽管如此,如果您想以跨平台的方式实现这一点,下面是Qt为Windows所做的:

quintptr returnValue = (quintptr)ShellExecute(0, 0,
  (wchar_t*)filePath.utf16(), 0, 0, SW_SHOWNORMAL);
// ShellExecute returns a value greater than 32 if successful
return (returnValue > 32);
这里,filePath.utf16是以Unicode null结尾的文件路径

以下是X11/Unix的相关部分:

if (launch(url, QLatin1String("xdg-open")))
    return true;
if (X11->desktopEnvironment == DE_GNOME 
    && launch(url, QLatin1String("gnome-open"))) {
    return true;
} else {
    if (X11->desktopEnvironment == DE_KDE 
        && launch(url, QLatin1String("kfmclient exec")))
        return true;
}
if (launch(url, QLatin1String("firefox")))
    return true;
if (launch(url, QLatin1String("mozilla")))
    return true;
if (launch(url, QLatin1String("netscape")))
    return true;
if (launch(url, QLatin1String("opera")))
    return true;
return false;
在这里,启动函数基本上启动指定的应用程序,将URL传递给它打开。不仅仅是文件路径(如Windows中的文件路径),还有完整的URL(如file:///home/user/tmp/file.doc. 不过,我不确定这是否重要。在将URL传递给程序之前,它还对URL中的所有非ASCII字符进行百分比编码。不确定它是否对openDocument尝试的所有程序都重要。我用xdg open测试了它,它不在乎它是否是百分比编码的

以下是检测桌面环境并相应设置X11->desktopEnvironment的部分:

    X11->desktopEnvironment = DE_UNKNOWN;
    Atom type;
    int format;
    unsigned long length, after;
    uchar *data = 0;
    int rc;
    do {
        if (!qgetenv("KDE_FULL_SESSION").isEmpty()) {
            X11->desktopEnvironment = DE_KDE;
            break;
        }
        if (qgetenv("DESKTOP_SESSION") == "gnome") {
            X11->desktopEnvironment = DE_GNOME;
            break;
        }
        // GNOME_DESKTOP_SESSION_ID is deprecated for some reason, but still check it
        if (!qgetenv("GNOME_DESKTOP_SESSION_ID").isEmpty()) {
            X11->desktopEnvironment = DE_GNOME;
            break;
        }
        rc = XGetWindowProperty(X11->display, QX11Info::appRootWindow(), ATOM(_DT_SAVE_MODE),
                                0, 2, False, XA_STRING, &type, &format, &length,
                                &after, &data);
        if (rc == Success && length) {
            if (!strcmp(reinterpret_cast<char *>(data), "xfce4")) {
                // Pretend that xfce4 is gnome, as it uses the same libraries.
                // The detection above is stolen from xdg-open.
                X11->desktopEnvironment = DE_GNOME;
                break;
            }
            // We got the property but it wasn't xfce4. Free data before it gets overwritten.
            XFree(data);
            data = 0;
        }
    } while(0);
哇,真了不起。我已经删除了检测其他环境的部分,因为它们没有在openDocument中使用

最后,这里是openDocument的辉煌Mac版本:

// LSOpen does not work in this case, use QProcess open instead.
return QProcess::startDetached(QLatin1String("open"), QStringList() << file.toLocalFile());

真的吗?就这样?哇,毕竟Mac平台上肯定有什么东西。这里,QProcess::startDetached只是启动一个新进程,将文件路径作为参数传递。它在很大程度上等同于系统调用,但不等待进程终止。我不知道这是否重要,我不知道如何在Mac上不使用QProcess来完成,因为我甚至从未见过Mac。

下面是一个从应用程序打开位图的示例:

ShellExecute(   GetSafeHwnd(),
                      _T("open"),
                      "Test.bmp",
                      NULL,
                      NULL,
                      SW_SHOW);
对于跨平台版本,如果你用谷歌搜索你的请求,你会发现很多信息


再见

您的整个问题都是关于Windows和Windows资源管理器的,然后最后一句话要求提供跨平台解决方案。我遗漏了什么吗?程序将同时在Windows和*nix上运行,我用宏编写了许多依赖于平台的代码,但最好使用跨平台解决方案。我想您已经尝试过系统命令了?这是我能想到的最快的跨平台方式,但如果你问这个问题的话,我认为它不能完全满足你的要求。是的,正如我所知,系统需要打开程序的完整路径,我不知道。为什么假设询问者使用的是Qt?@Cody,我没有这样假设。然而,不使用跨平台库而以跨平台的方式做事几乎是不可能的,因此使用跨平台库是一个好主意。我刚选了一个我最熟悉的。Qt的许可证太复杂了,所以我更喜欢wxWidgets。@Slav,我明白了。那么使用Qt仅仅打开一个文件可能不是一个好主意。顺便说一句,Qt不久前就被禁用了,以防有一天您想使用它。@Slav,不过,您可能希望查看Qt源代码,了解它们是如何以跨平台的方式实现的。请注意GetSafeHwnd是一个MFC函数。它不是标准Windows API的一部分。您只需指定一个窗口句柄HWND。