我正在使用Microsoft Visual C ++ 2008 我想加入一些字符串,然后使用“system”命令。
我试着这样做:
System::String^ link;
link = "wget.exe --output-document=log http://ADDRESS";
link = link + System::String::Copy(textBox_login->Text);
link = link + "&passwd=";
link = link + System::String::Copy(textBox_passwd->Text);
system(link); //LINE WITH ERROR
但我收到错误C2664:'system':无法将参数1从'System :: String ^'转换为'const char *'
我感谢任何帮助;)
答案 0 :(得分:4)
查看this question和this question。
实质上,问题是system
函数需要const char*
类型的变量而不是System::String
。
所以你需要将字符串转换为const char *(使用this answer中的代码)并将其用作系统函数的参数。
IntPtr p = Marshal::StringToHGlobalAnsi(clistr);
const char* linkStr = static_cast<char*>(p.ToPointer());
system(linkStr);
Marshal::FreeHGlobal(p);
答案 1 :(得分:2)
要像使用系统一样,您需要进行编组。这需要额外的预防措施,这可能导致无法预料的疼痛。
我建议您通过System::Process class
致电wget它更好地与.NET集成,您可以直接使用System :: String ^
答案 2 :(得分:0)
link = link + "&passwd=";
它会切断字符串中的后续内容。 当我删除'&amp;'它工作得很好......我需要'&amp;'登录
答案 3 :(得分:0)
您可以获得问题的技术解决方案,但这里还有其他一些您可能需要考虑的事项:
使用API(.NET或C ++,在.NET中比标准C ++更容易,请查看WebRequest)来执行此操作,而不是打开进程来为您执行HTTP请求。特别是如果您打算对回复做些什么。
一般情况下,如果您多次追加String
,请选择StringBuilder
。由于String
在.NET中是不可变的,因此每个附加都需要构造一个新的String
。
在这种情况下,不首先使用String
来构建网址。请改用System::Uri。