【问题标题】:Using ShellExecute to open file in browser使用 ShellExecute 在浏览器中打开文件
【发布时间】:2016-01-05 14:38:32
【问题描述】:

我正在尝试使用 ShellExecute 在默认浏览器中打开一个 .txt 文件。

我正在使用

ShellExecute(0, L"open", L"http://E:/path/to/file.txt", 0, 0, 1);

这会在浏览器中正确创建一个新窗口,但会尝试打开

E/path/to/file.txt(不带“:”)

然后找不到相关文件。文件位置绝对正确,因为在浏览器中手动添加“:”会根据需要打开文件。

【问题讨论】:

  • 为什么要在默认浏览器中显示.txt文件?创建一个html文件
  • http:// 仅适用于 HTTP URL。请改用file://mind the rules
  • 即使这个 hack 有效:您是否尝试过当您的默认浏览器是 Chrome 或 Firefox 时会发生什么?还是您正在使用的不同版本的浏览器?

标签: c++ winapi


【解决方案1】:

选项 1

使用AssocQueryStringIQueryAssocations 找出默认浏览器,然后在命令行中使用您的文本文件启动该浏览器。

选项 2

创建一个带有<meta> 标记的临时.html 文件,将redirects 指向加载文本文件的file:// URL。然后使用您的临时 .html 文件执行 ShellExecute。由于临时文件的类型为.html,它应该加载用户的默认浏览器。然后重定向将导致浏览器加载文本文件。

诀窍在于确定何时清理临时文件。 ShellExecute 无法轻松获取已启动进程的句柄(实际上,您启动的进程可能只是启动另一个进程),因此您无法轻松了解浏览器何时完成您的临时文件。您可能只是跟踪您创建的临时文件,并在您的应用程序关闭时尝试将其删除。

【讨论】:

    【解决方案2】:

    ShellExecute 将在默认文本查看器中打开一个 txt 文件,我想这不是浏览器。要在浏览器中打开,请显式运行浏览器并将文件作为参数。例如:

    ShellExecute(
        0,
        L"open",
        L"C:\\Program Files\\Internet Explorer\\iexplore",
        L"E:\\path\\to\\file.txt",
        0,
        1
    );
    

    【讨论】:

    • 假设要启动哪个浏览器或安装位置不是一个好主意。
    • 所以你认为如果我必须编写一个小程序来在我非常特定的计算机上执行非常特定的任务,例如,我不应该对安装的软件及其位置做出假设?
    • 当然,您可以在自己的机器上做您喜欢的事情。但是许多开发人员使用 StackOverflow 来获取有关如何构建其他人使用的软件的建议,因此如果这里的答案涉及在其他人的机器上可以安全地做什么,那么它会更有价值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    相关资源
    最近更新 更多