C ++ / CLI将System :: String转换为const char *

时间:2010-02-27 14:34:55

标签: string visual-c++ c++-cli system

我正在使用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 *'

我感谢任何帮助;)

4 个答案:

答案 0 :(得分:4)

查看this questionthis 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)

在做了Yacoby之后,几乎所有的一切都运转正常,但是当它到达

link = link + "&passwd=";

它会切断字符串中的后续内容。 当我删除'&amp;'它工作得很好......我需要'&amp;'登录

答案 3 :(得分:0)

您可以获得问题的技术解决方案,但这里还有其他一些您可能需要考虑的事项:

  • 使用API​​(.NET或C ++,在.NET中比标准C ++更容易,请查看WebRequest)来执行此操作,而不是打开进程来为您执行HTTP请求。特别是如果您打算对回复做些什么。

  • 一般情况下,如果您多次追加String,请选择StringBuilder。由于String在.NET中是不可变的,因此每个附加都需要构造一个新的String

  • 在这种情况下,首先使用String来构建网址。请改用System::Uri