【问题标题】:System() function, and calling internet explorer from it, DevC++System() 函数,并从中调用 Internet Explorer,Dev C++
【发布时间】:2016-06-20 14:17:11
【问题描述】:

我尝试制作一个获取网站信息的程序,然后将其提供给system() 以启动网站。我知道像(\, ",') 这样的字符不会直接输入到输出中,所以我使用了转义序列。

我编写了这个程序,但命令提示符只是拒绝通过C:\ 路径。但是如果我复制粘贴程序显示的命令,Internet Explorer 就会启动。但我的程序并非如此。谁能告诉我错误在哪里?

这是我的代码:

#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{

    cout<<"Please enter the website you wish to visit: ";
    string website,web;
    cin>>web;
    web= " " + web;
    website = "\"%ProgramFiles%\\Internet Explorer\\iexplore\""+web;
    cout<<"\n"<<website<<endl<<endl<<endl;
    system(website.c_str());
    return 0;
}

【问题讨论】:

    标签: c++ dev-c++ mingw32


    【解决方案1】:

    您在system 命令行中使用环境变量%ProgramFiles%;这些是特定于 MS-DOS 提示环境的,通常在 system 实现中不可用。

    我建议将其替换为完整路径,例如 \"C:\Program Files\Internet Explorer\iexplore\",看看是否可行。

    如果可行,那么您的实现不会像完整的命令提示符那样隐式替换环境变量,因此您需要单独查询环境变量并在运行system 之前构造路径。请参阅getenv 了解一种可能的方式(我不确定 mingw32 支持什么,因此您可能还有其他选择)。

    如果这不能解决问题,我建议检查您是否可以启动一些更简单的东西,例如 notepad.exe,以验证一般情况下没有任何东西干扰启动应用程序,例如您的环境路径或权限。

    【讨论】:

    • 这并不完全正确。环境变量由 shell 解释,system 通过 shell 运行。试试system ("echo %ProgramFiles%") 看看。
    • 谢谢。我尝试使用 %programfiles% 的原因是因为我想打开 Internet Explorer,无论它位于哪个驱动器中(有些人,包括我自己,将 Windows 安装在 D: 或 F: 等)。我确实尝试过明确放置路径,并且确实成功了。我将研究如何使用 getenv 来获得必要的路径。谢谢。
    【解决方案2】:

    双双引号中传递它:

    website = "\"\"%ProgramFiles%\\Internet Explorer\\iexplore\"\""+web;
    

    system("something") 调用实际上以与cmd /c something 类似(但可能不相同)的方式运行命令解释器cmd。当命令名称中有空格时,这会产生影响,例如参见 this.我无法确切说明为什么 单双引号 在不涉及环境变量的情况下有效,否则不工作,但事实是,双双引号确实有效。

    如果您想启动用户的首选浏览器,请考虑调用

    system("start http://" + websitename);
    

    改为。

    【讨论】:

    • 嘿。是的,添加一对额外的“有效:D。我真的很想知道为什么这有效以及为什么单身不...我会感谢任何能够阐明这一点的人。另外,我尝试使用第二种方法,但编译器给了我这个错误:[Error] cannot convert 'std::basic_string' to 'const char*' for argument '1' to 'int system(const char* )'。抛开一切,非常感谢,这给了我很多见识。
    【解决方案3】:

    首先获取该环境变量值。

    #include <iostream>
    #include <ShlObj.h>
    
    int main() {
        char pathToPf[MAX_PATH];
        if (S_OK == SHGetFolderPathA(NULL, CSIDL_PROGRAM_FILES, NULL, 0, pathToPf))
            std::cout << pathToPf << std::endl;
        return 0;
    }
    

    See SHGetFolderPath documentation...

    请注意,我很懒惰并使用此函数的 ASCII 版本。在没有 A 后缀的情况下使用它并处理对话;)

    【讨论】:

    • 你好。我对“ShlObj.h”头文件及其作用并不十分熟悉。我想我必须先了解更多关于它的信息(我保证,这个周末,已经将它添加到我的学习列表中),因为我是一个刚开始不久的新学生。感谢您的输入,虽然我不太明白。对不起。
    • %ProgramFiles% 的问题是 shell 会用 C:\Program Files 代替它,很难用好.您必须附加双双引号等...SHGetFolderPath() 会给您一个 char[] 包含程序文件的路径。您可以在 2. 参数中使用其他标志,例如:CSIDL_APPDATA。在这种情况下,它将返回如下内容:C:\Users\\AppData... 或您的 PATH 中的任何内容。
    猜你喜欢
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 2010-09-13
    相关资源
    最近更新 更多