2016-03-07 35 views
2

我试图使该会采取网站信息,然后将其提供给system()启动网站的程序。我知道像(\, ",')这样的字符不会直接输入到输出,所以我使用了转义序列。系统()函数,并调用它从IE浏览器,DEVC++

我写了这个程序,但在命令提示符下只是不肯走过去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; 
} 

回答

1

通过它在双双引号

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

system("something")调用实际运行在类似(但可能不是相同)cmd /c something的方式命令解释cmd。这在命令名称中有空格时会产生影响,请参阅此例。我无法确切知道为什么单双引号在没有涉及环境变量的情况下工作,并且无法正常工作,但实际上双双引号确实有效。

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

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

代替。

+0

嘿。是的,增加了一对额外的“工作:D。我真的很想知道为什么这个工程,为什么单身不寿...我会感谢任何人谁可以为此阐明。此外,我尝试使用第二种方法,但编译器给了我这个错误:[错误]无法将'std :: basic_string '转换为'const char *'参数'1'为'int system(const char *)'抛开一切,非常感谢,这让我有了很多的见解 – Tribulation

2

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

我建议更换与完整路径,如\ “C:\ Program Files文件\的Internet Explorer \ IEXPLORE \”,并看看是否能工程。

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

如果这不能解决问题,我建议检查是否可以启动一些比较简单的操作,比如notepad.exe,以验证是否没有干扰启动应用程序(如环境路径或权限)。

+0

这是不完全正确。环境变量由shell解释,'system'通过shell运行。试试'system(“echo%ProgramFiles%”)并看看。 –

+0

谢谢。我尝试使用%programfiles%的原因是因为我想打开Internet Explorer,无论它在哪个驱动器中(某些人,包括我自己,在D :,或F:等中安装Windows)。我确实尝试了明确的道路,而且确实有效。我将研究如何使用getenv来获得必要的路径。谢谢。 – Tribulation

0

先获取该环境变量值。

#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版本。使用它没有一个后缀和处理交谈;)

+0

你好,我不是很熟悉“ShlObj.h”头文件,它的功能是什么,我想我必须先详细了解它(我保证,这个周末,已经把它添加到我的学习清单中),看到我是一个刚刚开始的新学生,感谢您的投入,虽然我没有完全理解。 – Tribulation

+0

_%ProgramFiles%_的问题是shell会用_C:\ Program Files_替换它,并且使它很难使用它。你必须添加双引号, etc ...'SHGetFolderPath()'会给你一个包含程序文件路径的char []。您可以在2.参数中使用其他标志,例如:'CSIDL_APPDATA'。在这种情况下,它将返回类似于:_C:\ Users \ \ AppData _...或任何在您的** PATH **中。 – NMD