用C ++代码中的Windows本机程序打开文件

我的C + +程序创build.png文件,我需要创build后立即打开(查看)该文件 – 有没有办法打开它,因为它是在Windows资源pipe理器中打开 – 所以文件将用用户首选的程序打开,如果有没有与文件格式相关联的程序 – Windows将显示对话窗口,用户将能够select任何程序来打开该文件。

跨平台(+ Linux,+ MacOS,+ BSD)解决scheme将是完美的。

谢谢。

Solutions Collecting From Web of "用C ++代码中的Windows本机程序打开文件"

在Windows上,您可以使用ShellExecute函数 。

如果你使用Qt开发你的跨平台应用程序,那么QDesktopServices :: openUrl()方法就可以完成这项工作。 这当然是跨平台的,就像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以空字符结尾的文件路径。

这里是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; 

在这里,launch()函数基本上启动指定的应用程序,并将URL传递给它。 不只是像Windows一样的文件路径,而是像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()只是启动一个新的进程,传递文件路径作为参数。 这很大程度上等同于system()调用,但不会等待进程终止。 不知道是否重要,我不知道如何在Mac上不使用QProcess,因为我从来没有见过Mac。

这是一个从应用程序中打开位图的例子:

 ShellExecute( GetSafeHwnd(), _T("open"), "Test.bmp", NULL, NULL, SW_SHOW); 

对于跨平台的版本,如果你google你的请求,你会发现很多信息。

再见